Chromium Code Reviews| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 85 size_t RawChannel::WriteBuffer::GetTotalBytesToWrite() const { | 85 size_t RawChannel::WriteBuffer::GetTotalBytesToWrite() const { |
| 86 if (message_queue_.empty()) | 86 if (message_queue_.empty()) |
| 87 return 0; | 87 return 0; |
| 88 | 88 |
| 89 MessageInTransit* message = message_queue_.front(); | 89 MessageInTransit* message = message_queue_.front(); |
| 90 DCHECK_LT(offset_, message->total_size()); | 90 DCHECK_LT(offset_, message->total_size()); |
| 91 return message->total_size() - offset_; | 91 return message->total_size() - offset_; |
| 92 } | 92 } |
| 93 | 93 |
| 94 RawChannel::RawChannel() | 94 RawChannel::RawChannel() |
| 95 : delegate_(NULL), | 95 : message_loop_for_io_(NULL), |
| 96 message_loop_for_io_(NULL), | 96 delegate_(NULL), |
| 97 read_stopped_(false), | 97 read_stopped_(false), |
| 98 write_stopped_(false), | 98 write_stopped_(false), |
| 99 weak_ptr_factory_(this) { | 99 weak_ptr_factory_(this) { |
| 100 } | 100 } |
| 101 | 101 |
| 102 RawChannel::~RawChannel() { | 102 RawChannel::~RawChannel() { |
| 103 DCHECK(!read_buffer_); | 103 DCHECK(!read_buffer_); |
| 104 DCHECK(!write_buffer_); | 104 DCHECK(!write_buffer_); |
| 105 | 105 |
| 106 // No need to take the |write_lock_| here -- if there are still weak pointers | 106 // No need to take the |write_lock_| here -- if there are still weak pointers |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 133 } | 133 } |
| 134 | 134 |
| 135 void RawChannel::Shutdown() { | 135 void RawChannel::Shutdown() { |
| 136 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); | 136 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); |
| 137 | 137 |
| 138 base::AutoLock locker(write_lock_); | 138 base::AutoLock locker(write_lock_); |
| 139 | 139 |
| 140 LOG_IF(WARNING, !write_buffer_->message_queue_.empty()) | 140 LOG_IF(WARNING, !write_buffer_->message_queue_.empty()) |
| 141 << "Shutting down RawChannel with write buffer nonempty"; | 141 << "Shutting down RawChannel with write buffer nonempty"; |
| 142 | 142 |
| 143 weak_ptr_factory_.InvalidateWeakPtrs(); | 143 delegate_ = NULL; |
|
sky
2014/04/24 19:58:28
Add a comment as to why it's important to NULL out
| |
| 144 | |
| 145 read_stopped_ = true; | 144 read_stopped_ = true; |
| 146 write_stopped_ = true; | 145 write_stopped_ = true; |
| 146 weak_ptr_factory_.InvalidateWeakPtrs(); | |
| 147 | 147 |
| 148 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); | 148 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); |
| 149 } | 149 } |
| 150 | 150 |
| 151 // Reminder: This must be thread-safe. | 151 // Reminder: This must be thread-safe. |
| 152 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { | 152 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { |
| 153 DCHECK(message); | 153 DCHECK(message); |
| 154 | 154 |
| 155 // TODO(vtl) | 155 // TODO(vtl) |
| 156 if (message->has_platform_handles()) { | 156 if (message->has_platform_handles()) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 while (remaining_bytes > 0 && | 247 while (remaining_bytes > 0 && |
| 248 MessageInTransit::GetNextMessageSize( | 248 MessageInTransit::GetNextMessageSize( |
| 249 &read_buffer_->buffer_[read_buffer_start], remaining_bytes, | 249 &read_buffer_->buffer_[read_buffer_start], remaining_bytes, |
| 250 &message_size) && | 250 &message_size) && |
| 251 remaining_bytes >= message_size) { | 251 remaining_bytes >= message_size) { |
| 252 MessageInTransit::View | 252 MessageInTransit::View |
| 253 message_view(message_size, &read_buffer_->buffer_[read_buffer_start]); | 253 message_view(message_size, &read_buffer_->buffer_[read_buffer_start]); |
| 254 DCHECK_EQ(message_view.total_size(), message_size); | 254 DCHECK_EQ(message_view.total_size(), message_size); |
| 255 | 255 |
| 256 // Dispatch the message. | 256 // Dispatch the message. |
| 257 DCHECK(delegate_); | |
| 257 delegate_->OnReadMessage(message_view); | 258 delegate_->OnReadMessage(message_view); |
| 258 if (read_stopped_) { | 259 if (read_stopped_) { |
| 259 // |Shutdown()| was called in |OnReadMessage()|. | 260 // |Shutdown()| was called in |OnReadMessage()|. |
| 260 // TODO(vtl): Add test for this case. | 261 // TODO(vtl): Add test for this case. |
| 261 return; | 262 return; |
| 262 } | 263 } |
| 263 did_dispatch_message = true; | 264 did_dispatch_message = true; |
| 264 | 265 |
| 265 // Update our state. | 266 // Update our state. |
| 266 read_buffer_start += message_size; | 267 read_buffer_start += message_size; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 did_fail = !OnWriteCompletedNoLock(result, bytes_written); | 322 did_fail = !OnWriteCompletedNoLock(result, bytes_written); |
| 322 } | 323 } |
| 323 | 324 |
| 324 if (did_fail) | 325 if (did_fail) |
| 325 CallOnFatalError(Delegate::FATAL_ERROR_FAILED_WRITE); | 326 CallOnFatalError(Delegate::FATAL_ERROR_FAILED_WRITE); |
| 326 } | 327 } |
| 327 | 328 |
| 328 void RawChannel::CallOnFatalError(Delegate::FatalError fatal_error) { | 329 void RawChannel::CallOnFatalError(Delegate::FatalError fatal_error) { |
| 329 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); | 330 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); |
| 330 // TODO(vtl): Add a "write_lock_.AssertNotAcquired()"? | 331 // TODO(vtl): Add a "write_lock_.AssertNotAcquired()"? |
| 331 delegate_->OnFatalError(fatal_error); | 332 if (delegate_) |
| 333 delegate_->OnFatalError(fatal_error); | |
| 332 } | 334 } |
| 333 | 335 |
| 334 bool RawChannel::OnWriteCompletedNoLock(bool result, size_t bytes_written) { | 336 bool RawChannel::OnWriteCompletedNoLock(bool result, size_t bytes_written) { |
| 335 write_lock_.AssertAcquired(); | 337 write_lock_.AssertAcquired(); |
| 336 | 338 |
| 337 DCHECK(!write_stopped_); | 339 DCHECK(!write_stopped_); |
| 338 DCHECK(!write_buffer_->message_queue_.empty()); | 340 DCHECK(!write_buffer_->message_queue_.empty()); |
| 339 | 341 |
| 340 if (result) { | 342 if (result) { |
| 341 if (bytes_written < write_buffer_->GetTotalBytesToWrite()) { | 343 if (bytes_written < write_buffer_->GetTotalBytesToWrite()) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 358 } | 360 } |
| 359 | 361 |
| 360 write_stopped_ = true; | 362 write_stopped_ = true; |
| 361 STLDeleteElements(&write_buffer_->message_queue_); | 363 STLDeleteElements(&write_buffer_->message_queue_); |
| 362 write_buffer_->offset_ = 0; | 364 write_buffer_->offset_ = 0; |
| 363 return false; | 365 return false; |
| 364 } | 366 } |
| 365 | 367 |
| 366 } // namespace system | 368 } // namespace system |
| 367 } // namespace mojo | 369 } // namespace mojo |
| OLD | NEW |