OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |