| 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 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 buffers->push_back(buffer1); | 142 buffers->push_back(buffer1); |
| 143 Buffer buffer2 = { | 143 Buffer buffer2 = { |
| 144 static_cast<const char*>(message->transport_data()->buffer()), | 144 static_cast<const char*>(message->transport_data()->buffer()), |
| 145 transport_data_buffer_size}; | 145 transport_data_buffer_size}; |
| 146 buffers->push_back(buffer2); | 146 buffers->push_back(buffer2); |
| 147 } | 147 } |
| 148 | 148 |
| 149 // RawChannel ------------------------------------------------------------------ | 149 // RawChannel ------------------------------------------------------------------ |
| 150 | 150 |
| 151 RawChannel::RawChannel() | 151 RawChannel::RawChannel() |
| 152 : message_loop_for_io_(NULL), | 152 : message_loop_for_io_(nullptr), |
| 153 delegate_(NULL), | 153 delegate_(nullptr), |
| 154 read_stopped_(false), | 154 read_stopped_(false), |
| 155 write_stopped_(false), | 155 write_stopped_(false), |
| 156 weak_ptr_factory_(this) { | 156 weak_ptr_factory_(this) { |
| 157 } | 157 } |
| 158 | 158 |
| 159 RawChannel::~RawChannel() { | 159 RawChannel::~RawChannel() { |
| 160 DCHECK(!read_buffer_); | 160 DCHECK(!read_buffer_); |
| 161 DCHECK(!write_buffer_); | 161 DCHECK(!write_buffer_); |
| 162 | 162 |
| 163 // No need to take the |write_lock_| here -- if there are still weak pointers | 163 // No need to take the |write_lock_| here -- if there are still weak pointers |
| (...skipping 13 matching lines...) Expand all Loading... |
| 177 message_loop_for_io_ = | 177 message_loop_for_io_ = |
| 178 static_cast<base::MessageLoopForIO*>(base::MessageLoop::current()); | 178 static_cast<base::MessageLoopForIO*>(base::MessageLoop::current()); |
| 179 | 179 |
| 180 // No need to take the lock. No one should be using us yet. | 180 // No need to take the lock. No one should be using us yet. |
| 181 DCHECK(!read_buffer_); | 181 DCHECK(!read_buffer_); |
| 182 read_buffer_.reset(new ReadBuffer); | 182 read_buffer_.reset(new ReadBuffer); |
| 183 DCHECK(!write_buffer_); | 183 DCHECK(!write_buffer_); |
| 184 write_buffer_.reset(new WriteBuffer(GetSerializedPlatformHandleSize())); | 184 write_buffer_.reset(new WriteBuffer(GetSerializedPlatformHandleSize())); |
| 185 | 185 |
| 186 if (!OnInit()) { | 186 if (!OnInit()) { |
| 187 delegate_ = NULL; | 187 delegate_ = nullptr; |
| 188 message_loop_for_io_ = NULL; | 188 message_loop_for_io_ = nullptr; |
| 189 read_buffer_.reset(); | 189 read_buffer_.reset(); |
| 190 write_buffer_.reset(); | 190 write_buffer_.reset(); |
| 191 return false; | 191 return false; |
| 192 } | 192 } |
| 193 | 193 |
| 194 IOResult io_result = ScheduleRead(); | 194 IOResult io_result = ScheduleRead(); |
| 195 if (io_result != IO_PENDING) { | 195 if (io_result != IO_PENDING) { |
| 196 // This will notify the delegate about the read failure. Although we're on | 196 // This will notify the delegate about the read failure. Although we're on |
| 197 // the I/O thread, don't call it in the nested context. | 197 // the I/O thread, don't call it in the nested context. |
| 198 message_loop_for_io_->PostTask(FROM_HERE, | 198 message_loop_for_io_->PostTask(FROM_HERE, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 209 | 209 |
| 210 void RawChannel::Shutdown() { | 210 void RawChannel::Shutdown() { |
| 211 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); | 211 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); |
| 212 | 212 |
| 213 base::AutoLock locker(write_lock_); | 213 base::AutoLock locker(write_lock_); |
| 214 | 214 |
| 215 LOG_IF(WARNING, !write_buffer_->message_queue_.empty()) | 215 LOG_IF(WARNING, !write_buffer_->message_queue_.empty()) |
| 216 << "Shutting down RawChannel with write buffer nonempty"; | 216 << "Shutting down RawChannel with write buffer nonempty"; |
| 217 | 217 |
| 218 // Reset the delegate so that it won't receive further calls. | 218 // Reset the delegate so that it won't receive further calls. |
| 219 delegate_ = NULL; | 219 delegate_ = nullptr; |
| 220 read_stopped_ = true; | 220 read_stopped_ = true; |
| 221 write_stopped_ = true; | 221 write_stopped_ = true; |
| 222 weak_ptr_factory_.InvalidateWeakPtrs(); | 222 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 223 | 223 |
| 224 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); | 224 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); |
| 225 } | 225 } |
| 226 | 226 |
| 227 // Reminder: This must be thread-safe. | 227 // Reminder: This must be thread-safe. |
| 228 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { | 228 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { |
| 229 DCHECK(message); | 229 DCHECK(message); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 // TODO(vtl): Validate that |message_size| is sane. | 312 // TODO(vtl): Validate that |message_size| is sane. |
| 313 while (remaining_bytes > 0 && MessageInTransit::GetNextMessageSize( | 313 while (remaining_bytes > 0 && MessageInTransit::GetNextMessageSize( |
| 314 &read_buffer_->buffer_[read_buffer_start], | 314 &read_buffer_->buffer_[read_buffer_start], |
| 315 remaining_bytes, | 315 remaining_bytes, |
| 316 &message_size) && | 316 &message_size) && |
| 317 remaining_bytes >= message_size) { | 317 remaining_bytes >= message_size) { |
| 318 MessageInTransit::View message_view( | 318 MessageInTransit::View message_view( |
| 319 message_size, &read_buffer_->buffer_[read_buffer_start]); | 319 message_size, &read_buffer_->buffer_[read_buffer_start]); |
| 320 DCHECK_EQ(message_view.total_size(), message_size); | 320 DCHECK_EQ(message_view.total_size(), message_size); |
| 321 | 321 |
| 322 const char* error_message = NULL; | 322 const char* error_message = nullptr; |
| 323 if (!message_view.IsValid(GetSerializedPlatformHandleSize(), | 323 if (!message_view.IsValid(GetSerializedPlatformHandleSize(), |
| 324 &error_message)) { | 324 &error_message)) { |
| 325 DCHECK(error_message); | 325 DCHECK(error_message); |
| 326 LOG(ERROR) << "Received invalid message: " << error_message; | 326 LOG(ERROR) << "Received invalid message: " << error_message; |
| 327 read_stopped_ = true; | 327 read_stopped_ = true; |
| 328 CallOnError(Delegate::ERROR_READ_BAD_MESSAGE); | 328 CallOnError(Delegate::ERROR_READ_BAD_MESSAGE); |
| 329 return; | 329 return; |
| 330 } | 330 } |
| 331 | 331 |
| 332 if (message_view.type() == MessageInTransit::kTypeRawChannel) { | 332 if (message_view.type() == MessageInTransit::kTypeRawChannel) { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 | 513 |
| 514 write_stopped_ = true; | 514 write_stopped_ = true; |
| 515 STLDeleteElements(&write_buffer_->message_queue_); | 515 STLDeleteElements(&write_buffer_->message_queue_); |
| 516 write_buffer_->platform_handles_offset_ = 0; | 516 write_buffer_->platform_handles_offset_ = 0; |
| 517 write_buffer_->data_offset_ = 0; | 517 write_buffer_->data_offset_ = 0; |
| 518 return false; | 518 return false; |
| 519 } | 519 } |
| 520 | 520 |
| 521 } // namespace system | 521 } // namespace system |
| 522 } // namespace mojo | 522 } // namespace mojo |
| OLD | NEW |