Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Side by Side Diff: mojo/system/raw_channel.cc

Issue 265753006: Mojo: Factor MessageInTransit secondary buffer stuff out into a separate class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: oops Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/system/message_pipe.cc ('k') | mojo/system/raw_channel_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/system/raw_channel.h" 5 #include "mojo/system/raw_channel.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop/message_loop.h" 14 #include "base/message_loop/message_loop.h"
15 #include "base/stl_util.h" 15 #include "base/stl_util.h"
16 #include "mojo/system/message_in_transit.h" 16 #include "mojo/system/message_in_transit.h"
17 #include "mojo/system/transport_data.h"
17 18
18 namespace mojo { 19 namespace mojo {
19 namespace system { 20 namespace system {
20 21
21 const size_t kReadSize = 4096; 22 const size_t kReadSize = 4096;
22 23
23 RawChannel::ReadBuffer::ReadBuffer() : buffer_(kReadSize), num_valid_bytes_(0) { 24 RawChannel::ReadBuffer::ReadBuffer() : buffer_(kReadSize), num_valid_bytes_(0) {
24 } 25 }
25 26
26 RawChannel::ReadBuffer::~ReadBuffer() {} 27 RawChannel::ReadBuffer::~ReadBuffer() {}
(...skipping 11 matching lines...) Expand all
38 } 39 }
39 40
40 void RawChannel::WriteBuffer::GetBuffers(std::vector<Buffer>* buffers) const { 41 void RawChannel::WriteBuffer::GetBuffers(std::vector<Buffer>* buffers) const {
41 buffers->clear(); 42 buffers->clear();
42 43
43 size_t bytes_to_write = GetTotalBytesToWrite(); 44 size_t bytes_to_write = GetTotalBytesToWrite();
44 if (bytes_to_write == 0) 45 if (bytes_to_write == 0)
45 return; 46 return;
46 47
47 MessageInTransit* message = message_queue_.front(); 48 MessageInTransit* message = message_queue_.front();
48 if (!message->secondary_buffer_size()) { 49 size_t transport_data_buffer_size = message->transport_data() ?
50 message->transport_data()->buffer_size() : 0;
51
52 if (!transport_data_buffer_size) {
49 // Only write from the main buffer. 53 // Only write from the main buffer.
50 DCHECK_LT(offset_, message->main_buffer_size()); 54 DCHECK_LT(offset_, message->main_buffer_size());
51 DCHECK_LE(bytes_to_write, message->main_buffer_size()); 55 DCHECK_LE(bytes_to_write, message->main_buffer_size());
52 Buffer buffer = { 56 Buffer buffer = {
53 static_cast<const char*>(message->main_buffer()) + offset_, 57 static_cast<const char*>(message->main_buffer()) + offset_,
54 bytes_to_write}; 58 bytes_to_write};
55 buffers->push_back(buffer); 59 buffers->push_back(buffer);
56 return; 60 return;
57 } 61 }
58 62
59 if (offset_ >= message->main_buffer_size()) { 63 if (offset_ >= message->main_buffer_size()) {
60 // Only write from the secondary buffer. 64 // Only write from the transport data buffer.
61 DCHECK_LT(offset_ - message->main_buffer_size(), 65 DCHECK_LT(offset_ - message->main_buffer_size(),
62 message->secondary_buffer_size()); 66 transport_data_buffer_size);
63 DCHECK_LE(bytes_to_write, message->secondary_buffer_size()); 67 DCHECK_LE(bytes_to_write, transport_data_buffer_size);
64 Buffer buffer = { 68 Buffer buffer = {
65 static_cast<const char*>(message->secondary_buffer()) + 69 static_cast<const char*>(message->transport_data()->buffer()) +
66 (offset_ - message->main_buffer_size()), 70 (offset_ - message->main_buffer_size()),
67 bytes_to_write}; 71 bytes_to_write};
68 buffers->push_back(buffer); 72 buffers->push_back(buffer);
69 return; 73 return;
70 } 74 }
71 75
72 // Write from both buffers. 76 // Write from both buffers.
73 DCHECK_EQ(bytes_to_write, message->main_buffer_size() - offset_ + 77 DCHECK_EQ(bytes_to_write, message->main_buffer_size() - offset_ +
74 message->secondary_buffer_size()); 78 transport_data_buffer_size);
75 Buffer buffer1 = { 79 Buffer buffer1 = {
76 static_cast<const char*>(message->main_buffer()) + offset_, 80 static_cast<const char*>(message->main_buffer()) + offset_,
77 message->main_buffer_size() - offset_}; 81 message->main_buffer_size() - offset_
82 };
78 buffers->push_back(buffer1); 83 buffers->push_back(buffer1);
79 Buffer buffer2 = { 84 Buffer buffer2 = {
80 static_cast<const char*>(message->secondary_buffer()), 85 static_cast<const char*>(message->transport_data()->buffer()),
81 message->secondary_buffer_size()}; 86 transport_data_buffer_size
87 };
82 buffers->push_back(buffer2); 88 buffers->push_back(buffer2);
83 } 89 }
84 90
85 size_t RawChannel::WriteBuffer::GetTotalBytesToWrite() const { 91 size_t RawChannel::WriteBuffer::GetTotalBytesToWrite() const {
86 if (message_queue_.empty()) 92 if (message_queue_.empty())
87 return 0; 93 return 0;
88 94
89 MessageInTransit* message = message_queue_.front(); 95 MessageInTransit* message = message_queue_.front();
90 DCHECK_LT(offset_, message->total_size()); 96 DCHECK_LT(offset_, message->total_size());
91 return message->total_size() - offset_; 97 return message->total_size() - offset_;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 weak_ptr_factory_.InvalidateWeakPtrs(); 158 weak_ptr_factory_.InvalidateWeakPtrs();
153 159
154 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); 160 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass());
155 } 161 }
156 162
157 // Reminder: This must be thread-safe. 163 // Reminder: This must be thread-safe.
158 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { 164 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) {
159 DCHECK(message); 165 DCHECK(message);
160 166
161 // TODO(vtl) 167 // TODO(vtl)
162 if (message->has_platform_handles()) { 168 if (message->transport_data() &&
169 message->transport_data()->has_platform_handles()) {
163 NOTIMPLEMENTED(); 170 NOTIMPLEMENTED();
164 return false; 171 return false;
165 } 172 }
166 173
167 base::AutoLock locker(write_lock_); 174 base::AutoLock locker(write_lock_);
168 if (write_stopped_) 175 if (write_stopped_)
169 return false; 176 return false;
170 177
171 if (!write_buffer_->message_queue_.empty()) { 178 if (!write_buffer_->message_queue_.empty()) {
172 write_buffer_->message_queue_.push_back(message.release()); 179 write_buffer_->message_queue_.push_back(message.release());
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } 373 }
367 374
368 write_stopped_ = true; 375 write_stopped_ = true;
369 STLDeleteElements(&write_buffer_->message_queue_); 376 STLDeleteElements(&write_buffer_->message_queue_);
370 write_buffer_->offset_ = 0; 377 write_buffer_->offset_ = 0;
371 return false; 378 return false;
372 } 379 }
373 380
374 } // namespace system 381 } // namespace system
375 } // namespace mojo 382 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/message_pipe.cc ('k') | mojo/system/raw_channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698