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

Side by Side Diff: mojo/edk/system/data_pipe.cc

Issue 936283002: Oops, calling {Producer,Consumer}CloseImplNoLock() isn't the same as calling {Producer,Consumer}Clo… (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « mojo/edk/system/data_pipe.h ('k') | mojo/edk/system/local_data_pipe.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/edk/system/data_pipe.h" 5 #include "mojo/edk/system/data_pipe.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <limits> 10 #include <limits>
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 } 84 }
85 85
86 void DataPipe::ProducerCancelAllAwakables() { 86 void DataPipe::ProducerCancelAllAwakables() {
87 base::AutoLock locker(lock_); 87 base::AutoLock locker(lock_);
88 DCHECK(has_local_producer_no_lock()); 88 DCHECK(has_local_producer_no_lock());
89 producer_awakable_list_->CancelAll(); 89 producer_awakable_list_->CancelAll();
90 } 90 }
91 91
92 void DataPipe::ProducerClose() { 92 void DataPipe::ProducerClose() {
93 base::AutoLock locker(lock_); 93 base::AutoLock locker(lock_);
94 DCHECK(producer_open_); 94 ProducerCloseNoLock();
95 producer_open_ = false;
96 DCHECK(has_local_producer_no_lock());
97 producer_awakable_list_.reset();
98 // Not a bug, except possibly in "user" code.
99 DVLOG_IF(2, producer_in_two_phase_write_no_lock())
100 << "Producer closed with active two-phase write";
101 producer_two_phase_max_num_bytes_written_ = 0;
102 ProducerCloseImplNoLock();
103 AwakeConsumerAwakablesForStateChangeNoLock(
104 ConsumerGetHandleSignalsStateImplNoLock());
105 } 95 }
106 96
107 MojoResult DataPipe::ProducerWriteData(UserPointer<const void> elements, 97 MojoResult DataPipe::ProducerWriteData(UserPointer<const void> elements,
108 UserPointer<uint32_t> num_bytes, 98 UserPointer<uint32_t> num_bytes,
109 bool all_or_none) { 99 bool all_or_none) {
110 base::AutoLock locker(lock_); 100 base::AutoLock locker(lock_);
111 DCHECK(has_local_producer_no_lock()); 101 DCHECK(has_local_producer_no_lock());
112 102
113 if (producer_in_two_phase_write_no_lock()) 103 if (producer_in_two_phase_write_no_lock())
114 return MOJO_RESULT_BUSY; 104 return MOJO_RESULT_BUSY;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 } 254 }
265 255
266 void DataPipe::ConsumerCancelAllAwakables() { 256 void DataPipe::ConsumerCancelAllAwakables() {
267 base::AutoLock locker(lock_); 257 base::AutoLock locker(lock_);
268 DCHECK(has_local_consumer_no_lock()); 258 DCHECK(has_local_consumer_no_lock());
269 consumer_awakable_list_->CancelAll(); 259 consumer_awakable_list_->CancelAll();
270 } 260 }
271 261
272 void DataPipe::ConsumerClose() { 262 void DataPipe::ConsumerClose() {
273 base::AutoLock locker(lock_); 263 base::AutoLock locker(lock_);
274 DCHECK(consumer_open_); 264 ConsumerCloseNoLock();
275 consumer_open_ = false;
276 DCHECK(has_local_consumer_no_lock());
277 consumer_awakable_list_.reset();
278 // Not a bug, except possibly in "user" code.
279 DVLOG_IF(2, consumer_in_two_phase_read_no_lock())
280 << "Consumer closed with active two-phase read";
281 consumer_two_phase_max_num_bytes_read_ = 0;
282 ConsumerCloseImplNoLock();
283 AwakeProducerAwakablesForStateChangeNoLock(
284 ProducerGetHandleSignalsStateImplNoLock());
285 } 265 }
286 266
287 MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements, 267 MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements,
288 UserPointer<uint32_t> num_bytes, 268 UserPointer<uint32_t> num_bytes,
289 bool all_or_none, 269 bool all_or_none,
290 bool peek) { 270 bool peek) {
291 base::AutoLock locker(lock_); 271 base::AutoLock locker(lock_);
292 DCHECK(has_local_consumer_no_lock()); 272 DCHECK(has_local_consumer_no_lock());
293 273
294 if (consumer_in_two_phase_read_no_lock()) 274 if (consumer_in_two_phase_read_no_lock())
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 MOJO_RESULT_OK); 474 MOJO_RESULT_OK);
495 } 475 }
496 476
497 DataPipe::~DataPipe() { 477 DataPipe::~DataPipe() {
498 DCHECK(!producer_open_); 478 DCHECK(!producer_open_);
499 DCHECK(!consumer_open_); 479 DCHECK(!consumer_open_);
500 DCHECK(!producer_awakable_list_); 480 DCHECK(!producer_awakable_list_);
501 DCHECK(!consumer_awakable_list_); 481 DCHECK(!consumer_awakable_list_);
502 } 482 }
503 483
484 void DataPipe::ProducerCloseNoLock() {
485 lock_.AssertAcquired();
486 DCHECK(producer_open_);
487 producer_open_ = false;
488 DCHECK(has_local_producer_no_lock());
489 producer_awakable_list_.reset();
490 // Not a bug, except possibly in "user" code.
491 DVLOG_IF(2, producer_in_two_phase_write_no_lock())
492 << "Producer closed with active two-phase write";
493 producer_two_phase_max_num_bytes_written_ = 0;
494 ProducerCloseImplNoLock();
yzshen1 2015/02/19 18:07:50 I feel that usually XXXImpl should do all (or most
495 AwakeConsumerAwakablesForStateChangeNoLock(
496 ConsumerGetHandleSignalsStateImplNoLock());
497 }
498
499 void DataPipe::ConsumerCloseNoLock() {
500 lock_.AssertAcquired();
501 DCHECK(consumer_open_);
502 consumer_open_ = false;
503 DCHECK(has_local_consumer_no_lock());
504 consumer_awakable_list_.reset();
505 // Not a bug, except possibly in "user" code.
506 DVLOG_IF(2, consumer_in_two_phase_read_no_lock())
507 << "Consumer closed with active two-phase read";
508 consumer_two_phase_max_num_bytes_read_ = 0;
509 ConsumerCloseImplNoLock();
yzshen1 2015/02/19 18:07:50 ditto
510 AwakeProducerAwakablesForStateChangeNoLock(
511 ProducerGetHandleSignalsStateImplNoLock());
512 }
513
504 void DataPipe::AwakeProducerAwakablesForStateChangeNoLock( 514 void DataPipe::AwakeProducerAwakablesForStateChangeNoLock(
505 const HandleSignalsState& new_producer_state) { 515 const HandleSignalsState& new_producer_state) {
506 lock_.AssertAcquired(); 516 lock_.AssertAcquired();
507 if (!has_local_producer_no_lock()) 517 if (!has_local_producer_no_lock())
508 return; 518 return;
509 producer_awakable_list_->AwakeForStateChange(new_producer_state); 519 producer_awakable_list_->AwakeForStateChange(new_producer_state);
510 } 520 }
511 521
512 void DataPipe::AwakeConsumerAwakablesForStateChangeNoLock( 522 void DataPipe::AwakeConsumerAwakablesForStateChangeNoLock(
513 const HandleSignalsState& new_consumer_state) { 523 const HandleSignalsState& new_consumer_state) {
514 lock_.AssertAcquired(); 524 lock_.AssertAcquired();
515 if (!has_local_consumer_no_lock()) 525 if (!has_local_consumer_no_lock())
516 return; 526 return;
517 consumer_awakable_list_->AwakeForStateChange(new_consumer_state); 527 consumer_awakable_list_->AwakeForStateChange(new_consumer_state);
518 } 528 }
519 529
520 } // namespace system 530 } // namespace system
521 } // namespace mojo 531 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe.h ('k') | mojo/edk/system/local_data_pipe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698