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 |