Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(538)

Side by Side Diff: mojo/system/raw_channel.cc

Issue 257623003: Mojo: Add RawChannel tests for calling Shutdown() from OnReadMessage()/OnFatalError(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add comment Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/system/raw_channel.h ('k') | mojo/system/raw_channel_posix.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 // Reset the delegate so that it won't receive further calls.
144 144 delegate_ = NULL;
145 read_stopped_ = true; 145 read_stopped_ = true;
146 write_stopped_ = true; 146 write_stopped_ = true;
147 weak_ptr_factory_.InvalidateWeakPtrs();
147 148
148 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass()); 149 OnShutdownNoLock(read_buffer_.Pass(), write_buffer_.Pass());
149 } 150 }
150 151
151 // Reminder: This must be thread-safe. 152 // Reminder: This must be thread-safe.
152 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) { 153 bool RawChannel::WriteMessage(scoped_ptr<MessageInTransit> message) {
153 DCHECK(message); 154 DCHECK(message);
154 155
155 // TODO(vtl) 156 // TODO(vtl)
156 if (message->has_platform_handles()) { 157 if (message->has_platform_handles()) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 while (remaining_bytes > 0 && 248 while (remaining_bytes > 0 &&
248 MessageInTransit::GetNextMessageSize( 249 MessageInTransit::GetNextMessageSize(
249 &read_buffer_->buffer_[read_buffer_start], remaining_bytes, 250 &read_buffer_->buffer_[read_buffer_start], remaining_bytes,
250 &message_size) && 251 &message_size) &&
251 remaining_bytes >= message_size) { 252 remaining_bytes >= message_size) {
252 MessageInTransit::View 253 MessageInTransit::View
253 message_view(message_size, &read_buffer_->buffer_[read_buffer_start]); 254 message_view(message_size, &read_buffer_->buffer_[read_buffer_start]);
254 DCHECK_EQ(message_view.total_size(), message_size); 255 DCHECK_EQ(message_view.total_size(), message_size);
255 256
256 // Dispatch the message. 257 // Dispatch the message.
258 DCHECK(delegate_);
257 delegate_->OnReadMessage(message_view); 259 delegate_->OnReadMessage(message_view);
258 if (read_stopped_) { 260 if (read_stopped_) {
259 // |Shutdown()| was called in |OnReadMessage()|. 261 // |Shutdown()| was called in |OnReadMessage()|.
260 // TODO(vtl): Add test for this case. 262 // TODO(vtl): Add test for this case.
261 return; 263 return;
262 } 264 }
263 did_dispatch_message = true; 265 did_dispatch_message = true;
264 266
265 // Update our state. 267 // Update our state.
266 read_buffer_start += message_size; 268 read_buffer_start += message_size;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 did_fail = !OnWriteCompletedNoLock(result, bytes_written); 323 did_fail = !OnWriteCompletedNoLock(result, bytes_written);
322 } 324 }
323 325
324 if (did_fail) 326 if (did_fail)
325 CallOnFatalError(Delegate::FATAL_ERROR_FAILED_WRITE); 327 CallOnFatalError(Delegate::FATAL_ERROR_FAILED_WRITE);
326 } 328 }
327 329
328 void RawChannel::CallOnFatalError(Delegate::FatalError fatal_error) { 330 void RawChannel::CallOnFatalError(Delegate::FatalError fatal_error) {
329 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_); 331 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io_);
330 // TODO(vtl): Add a "write_lock_.AssertNotAcquired()"? 332 // TODO(vtl): Add a "write_lock_.AssertNotAcquired()"?
331 delegate_->OnFatalError(fatal_error); 333 if (delegate_)
334 delegate_->OnFatalError(fatal_error);
332 } 335 }
333 336
334 bool RawChannel::OnWriteCompletedNoLock(bool result, size_t bytes_written) { 337 bool RawChannel::OnWriteCompletedNoLock(bool result, size_t bytes_written) {
335 write_lock_.AssertAcquired(); 338 write_lock_.AssertAcquired();
336 339
337 DCHECK(!write_stopped_); 340 DCHECK(!write_stopped_);
338 DCHECK(!write_buffer_->message_queue_.empty()); 341 DCHECK(!write_buffer_->message_queue_.empty());
339 342
340 if (result) { 343 if (result) {
341 if (bytes_written < write_buffer_->GetTotalBytesToWrite()) { 344 if (bytes_written < write_buffer_->GetTotalBytesToWrite()) {
(...skipping 16 matching lines...) Expand all
358 } 361 }
359 362
360 write_stopped_ = true; 363 write_stopped_ = true;
361 STLDeleteElements(&write_buffer_->message_queue_); 364 STLDeleteElements(&write_buffer_->message_queue_);
362 write_buffer_->offset_ = 0; 365 write_buffer_->offset_ = 0;
363 return false; 366 return false;
364 } 367 }
365 368
366 } // namespace system 369 } // namespace system
367 } // namespace mojo 370 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/raw_channel.h ('k') | mojo/system/raw_channel_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698