OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |