Chromium Code Reviews| 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 |