| 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 |