| 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 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 base::AutoLock locker(lock_); | 423 base::AutoLock locker(lock_); |
| 424 DCHECK(has_local_producer_no_lock()); | 424 DCHECK(has_local_producer_no_lock()); |
| 425 // Warning: After |ProducerEndSerialize()|, quite probably |impl_| has | 425 // Warning: After |ProducerEndSerialize()|, quite probably |impl_| has |
| 426 // changed. | 426 // changed. |
| 427 bool rv = impl_->ProducerEndSerialize(channel, destination, actual_size, | 427 bool rv = impl_->ProducerEndSerialize(channel, destination, actual_size, |
| 428 platform_handles); | 428 platform_handles); |
| 429 | 429 |
| 430 // TODO(vtl): The code below is similar to, but not quite the same as, | 430 // TODO(vtl): The code below is similar to, but not quite the same as, |
| 431 // |ProducerCloseNoLock()|. | 431 // |ProducerCloseNoLock()|. |
| 432 DCHECK(has_local_producer_no_lock()); | 432 DCHECK(has_local_producer_no_lock()); |
| 433 producer_awakable_list_->CancelAll(); |
| 433 producer_awakable_list_.reset(); | 434 producer_awakable_list_.reset(); |
| 434 // Not a bug, except possibly in "user" code. | 435 // Not a bug, except possibly in "user" code. |
| 435 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) | 436 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) |
| 436 << "Producer transferred with active two-phase write"; | 437 << "Producer transferred with active two-phase write"; |
| 437 producer_two_phase_max_num_bytes_written_ = 0; | 438 producer_two_phase_max_num_bytes_written_ = 0; |
| 439 if (!has_local_consumer_no_lock()) |
| 440 producer_open_ = false; |
| 438 | 441 |
| 439 return rv; | 442 return rv; |
| 440 } | 443 } |
| 441 | 444 |
| 442 bool DataPipe::ProducerIsBusy() const { | 445 bool DataPipe::ProducerIsBusy() const { |
| 443 base::AutoLock locker(lock_); | 446 base::AutoLock locker(lock_); |
| 444 return producer_in_two_phase_write_no_lock(); | 447 return producer_in_two_phase_write_no_lock(); |
| 445 } | 448 } |
| 446 | 449 |
| 447 void DataPipe::ConsumerCancelAllAwakables() { | 450 void DataPipe::ConsumerCancelAllAwakables() { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 embedder::PlatformHandleVector* platform_handles) { | 638 embedder::PlatformHandleVector* platform_handles) { |
| 636 base::AutoLock locker(lock_); | 639 base::AutoLock locker(lock_); |
| 637 DCHECK(has_local_consumer_no_lock()); | 640 DCHECK(has_local_consumer_no_lock()); |
| 638 // Warning: After |ConsumerEndSerialize()|, quite probably |impl_| has | 641 // Warning: After |ConsumerEndSerialize()|, quite probably |impl_| has |
| 639 // changed. | 642 // changed. |
| 640 bool rv = impl_->ConsumerEndSerialize(channel, destination, actual_size, | 643 bool rv = impl_->ConsumerEndSerialize(channel, destination, actual_size, |
| 641 platform_handles); | 644 platform_handles); |
| 642 | 645 |
| 643 // TODO(vtl): The code below is similar to, but not quite the same as, | 646 // TODO(vtl): The code below is similar to, but not quite the same as, |
| 644 // |ConsumerCloseNoLock()|. | 647 // |ConsumerCloseNoLock()|. |
| 648 consumer_awakable_list_->CancelAll(); |
| 645 consumer_awakable_list_.reset(); | 649 consumer_awakable_list_.reset(); |
| 646 // Not a bug, except possibly in "user" code. | 650 // Not a bug, except possibly in "user" code. |
| 647 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) | 651 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) |
| 648 << "Consumer transferred with active two-phase read"; | 652 << "Consumer transferred with active two-phase read"; |
| 649 consumer_two_phase_max_num_bytes_read_ = 0; | 653 consumer_two_phase_max_num_bytes_read_ = 0; |
| 654 if (!has_local_producer_no_lock()) |
| 655 consumer_open_ = false; |
| 650 | 656 |
| 651 return rv; | 657 return rv; |
| 652 } | 658 } |
| 653 | 659 |
| 654 bool DataPipe::ConsumerIsBusy() const { | 660 bool DataPipe::ConsumerIsBusy() const { |
| 655 base::AutoLock locker(lock_); | 661 base::AutoLock locker(lock_); |
| 656 return consumer_in_two_phase_read_no_lock(); | 662 return consumer_in_two_phase_read_no_lock(); |
| 657 } | 663 } |
| 658 | 664 |
| 659 DataPipe::DataPipe(bool has_local_producer, | 665 DataPipe::DataPipe(bool has_local_producer, |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 SetProducerClosedNoLock(); | 816 SetProducerClosedNoLock(); |
| 811 } | 817 } |
| 812 | 818 |
| 813 void DataPipe::SetConsumerClosed() { | 819 void DataPipe::SetConsumerClosed() { |
| 814 base::AutoLock locker(lock_); | 820 base::AutoLock locker(lock_); |
| 815 SetConsumerClosedNoLock(); | 821 SetConsumerClosedNoLock(); |
| 816 } | 822 } |
| 817 | 823 |
| 818 } // namespace system | 824 } // namespace system |
| 819 } // namespace mojo | 825 } // namespace mojo |
| OLD | NEW |