| 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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 *data_pipe = | 265 *data_pipe = |
| 266 incoming_endpoint->ConvertToDataPipeConsumer(revalidated_options); | 266 incoming_endpoint->ConvertToDataPipeConsumer(revalidated_options); |
| 267 if (!*data_pipe) | 267 if (!*data_pipe) |
| 268 return false; | 268 return false; |
| 269 | 269 |
| 270 return true; | 270 return true; |
| 271 } | 271 } |
| 272 | 272 |
| 273 void DataPipe::ProducerCancelAllState() { | 273 void DataPipe::ProducerCancelAllState() { |
| 274 MutexLocker locker(&mutex_); | 274 MutexLocker locker(&mutex_); |
| 275 DCHECK(has_local_producer_no_lock()); | 275 ProducerCancelAllStateNoLock(); |
| 276 producer_awakable_list_->CancelAll(); | |
| 277 } | 276 } |
| 278 | 277 |
| 279 void DataPipe::ProducerClose() { | 278 void DataPipe::ProducerClose() { |
| 280 MutexLocker locker(&mutex_); | 279 MutexLocker locker(&mutex_); |
| 281 ProducerCloseNoLock(); | 280 ProducerCloseNoLock(); |
| 282 } | 281 } |
| 283 | 282 |
| 284 MojoResult DataPipe::ProducerSetOptions(uint32_t write_threshold_num_bytes) { | 283 MojoResult DataPipe::ProducerSetOptions(uint32_t write_threshold_num_bytes) { |
| 285 MutexLocker locker(&mutex_); | 284 MutexLocker locker(&mutex_); |
| 286 DCHECK(has_local_producer_no_lock()); | 285 DCHECK(has_local_producer_no_lock()); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 void* destination, | 442 void* destination, |
| 444 size_t* actual_size, | 443 size_t* actual_size, |
| 445 std::vector<ScopedPlatformHandle>* platform_handles) { | 444 std::vector<ScopedPlatformHandle>* platform_handles) { |
| 446 MutexLocker locker(&mutex_); | 445 MutexLocker locker(&mutex_); |
| 447 DCHECK(has_local_producer_no_lock()); | 446 DCHECK(has_local_producer_no_lock()); |
| 448 // Warning: After |ProducerEndSerialize()|, quite probably |impl_| has | 447 // Warning: After |ProducerEndSerialize()|, quite probably |impl_| has |
| 449 // changed. | 448 // changed. |
| 450 bool rv = impl_->ProducerEndSerialize(channel, destination, actual_size, | 449 bool rv = impl_->ProducerEndSerialize(channel, destination, actual_size, |
| 451 platform_handles); | 450 platform_handles); |
| 452 | 451 |
| 453 // TODO(vtl): The code below is similar to, but not quite the same as, | 452 ProducerCancelAllStateNoLock(); |
| 454 // |ProducerCloseNoLock()|. | |
| 455 DCHECK(has_local_producer_no_lock()); | |
| 456 producer_awakable_list_->CancelAll(); | |
| 457 producer_awakable_list_.reset(); | 453 producer_awakable_list_.reset(); |
| 458 // Not a bug, except possibly in "user" code. | |
| 459 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) | |
| 460 << "Producer transferred with active two-phase write"; | |
| 461 producer_two_phase_max_num_bytes_written_ = 0; | |
| 462 if (!has_local_consumer_no_lock()) | 454 if (!has_local_consumer_no_lock()) |
| 463 producer_open_ = false; | 455 producer_open_ = false; |
| 464 | 456 |
| 465 return rv; | 457 return rv; |
| 466 } | 458 } |
| 467 | 459 |
| 468 bool DataPipe::ProducerIsBusy() const { | 460 bool DataPipe::ProducerIsBusy() const { |
| 469 MutexLocker locker(&mutex_); | 461 MutexLocker locker(&mutex_); |
| 470 return producer_in_two_phase_write_no_lock(); | 462 return producer_in_two_phase_write_no_lock(); |
| 471 } | 463 } |
| 472 | 464 |
| 473 void DataPipe::ConsumerCancelAllState() { | 465 void DataPipe::ConsumerCancelAllState() { |
| 474 MutexLocker locker(&mutex_); | 466 MutexLocker locker(&mutex_); |
| 475 DCHECK(has_local_consumer_no_lock()); | 467 ConsumerCancelAllStateNoLock(); |
| 476 consumer_awakable_list_->CancelAll(); | |
| 477 } | 468 } |
| 478 | 469 |
| 479 void DataPipe::ConsumerClose() { | 470 void DataPipe::ConsumerClose() { |
| 480 MutexLocker locker(&mutex_); | 471 MutexLocker locker(&mutex_); |
| 481 ConsumerCloseNoLock(); | 472 ConsumerCloseNoLock(); |
| 482 } | 473 } |
| 483 | 474 |
| 484 MojoResult DataPipe::ConsumerSetOptions(uint32_t read_threshold_num_bytes) { | 475 MojoResult DataPipe::ConsumerSetOptions(uint32_t read_threshold_num_bytes) { |
| 485 MutexLocker locker(&mutex_); | 476 MutexLocker locker(&mutex_); |
| 486 DCHECK(has_local_consumer_no_lock()); | 477 DCHECK(has_local_consumer_no_lock()); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 void* destination, | 666 void* destination, |
| 676 size_t* actual_size, | 667 size_t* actual_size, |
| 677 std::vector<ScopedPlatformHandle>* platform_handles) { | 668 std::vector<ScopedPlatformHandle>* platform_handles) { |
| 678 MutexLocker locker(&mutex_); | 669 MutexLocker locker(&mutex_); |
| 679 DCHECK(has_local_consumer_no_lock()); | 670 DCHECK(has_local_consumer_no_lock()); |
| 680 // Warning: After |ConsumerEndSerialize()|, quite probably |impl_| has | 671 // Warning: After |ConsumerEndSerialize()|, quite probably |impl_| has |
| 681 // changed. | 672 // changed. |
| 682 bool rv = impl_->ConsumerEndSerialize(channel, destination, actual_size, | 673 bool rv = impl_->ConsumerEndSerialize(channel, destination, actual_size, |
| 683 platform_handles); | 674 platform_handles); |
| 684 | 675 |
| 685 // TODO(vtl): The code below is similar to, but not quite the same as, | 676 ConsumerCancelAllStateNoLock(); |
| 686 // |ConsumerCloseNoLock()|. | |
| 687 consumer_awakable_list_->CancelAll(); | |
| 688 consumer_awakable_list_.reset(); | 677 consumer_awakable_list_.reset(); |
| 689 // Not a bug, except possibly in "user" code. | |
| 690 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) | |
| 691 << "Consumer transferred with active two-phase read"; | |
| 692 consumer_two_phase_max_num_bytes_read_ = 0; | |
| 693 if (!has_local_producer_no_lock()) | 678 if (!has_local_producer_no_lock()) |
| 694 consumer_open_ = false; | 679 consumer_open_ = false; |
| 695 | 680 |
| 696 return rv; | 681 return rv; |
| 697 } | 682 } |
| 698 | 683 |
| 699 bool DataPipe::ConsumerIsBusy() const { | 684 bool DataPipe::ConsumerIsBusy() const { |
| 700 MutexLocker locker(&mutex_); | 685 MutexLocker locker(&mutex_); |
| 701 return consumer_in_two_phase_read_no_lock(); | 686 return consumer_in_two_phase_read_no_lock(); |
| 702 } | 687 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 mutex_.AssertHeld(); | 725 mutex_.AssertHeld(); |
| 741 DCHECK(new_impl); | 726 DCHECK(new_impl); |
| 742 | 727 |
| 743 impl_->set_owner(nullptr); | 728 impl_->set_owner(nullptr); |
| 744 std::unique_ptr<DataPipeImpl> rv(std::move(impl_)); | 729 std::unique_ptr<DataPipeImpl> rv(std::move(impl_)); |
| 745 impl_ = std::move(new_impl); | 730 impl_ = std::move(new_impl); |
| 746 impl_->set_owner(this); | 731 impl_->set_owner(this); |
| 747 return rv; | 732 return rv; |
| 748 } | 733 } |
| 749 | 734 |
| 735 void DataPipe::ProducerCancelAllStateNoLock() { |
| 736 DCHECK(has_local_producer_no_lock()); |
| 737 if (producer_awakable_list_) |
| 738 producer_awakable_list_->CancelAll(); |
| 739 // Not a bug, except possibly in "user" code. |
| 740 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) |
| 741 << "Active two-phase write cancelled"; |
| 742 producer_two_phase_max_num_bytes_written_ = 0; |
| 743 } |
| 744 |
| 745 void DataPipe::ConsumerCancelAllStateNoLock() { |
| 746 DCHECK(has_local_consumer_no_lock()); |
| 747 if (consumer_awakable_list_) |
| 748 consumer_awakable_list_->CancelAll(); |
| 749 // Not a bug, except possibly in "user" code. |
| 750 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) |
| 751 << "Active two-phase read cancelled"; |
| 752 consumer_two_phase_max_num_bytes_read_ = 0; |
| 753 } |
| 754 |
| 750 void DataPipe::SetProducerClosedNoLock() { | 755 void DataPipe::SetProducerClosedNoLock() { |
| 751 mutex_.AssertHeld(); | 756 mutex_.AssertHeld(); |
| 752 DCHECK(!has_local_producer_no_lock()); | 757 DCHECK(!has_local_producer_no_lock()); |
| 753 DCHECK(producer_open_); | 758 DCHECK(producer_open_); |
| 754 producer_open_ = false; | 759 producer_open_ = false; |
| 755 } | 760 } |
| 756 | 761 |
| 757 void DataPipe::SetConsumerClosedNoLock() { | 762 void DataPipe::SetConsumerClosedNoLock() { |
| 758 mutex_.AssertHeld(); | 763 mutex_.AssertHeld(); |
| 759 DCHECK(!has_local_consumer_no_lock()); | 764 DCHECK(!has_local_consumer_no_lock()); |
| 760 DCHECK(consumer_open_); | 765 DCHECK(consumer_open_); |
| 761 consumer_open_ = false; | 766 consumer_open_ = false; |
| 762 } | 767 } |
| 763 | 768 |
| 764 void DataPipe::ProducerCloseNoLock() { | 769 void DataPipe::ProducerCloseNoLock() { |
| 765 mutex_.AssertHeld(); | 770 mutex_.AssertHeld(); |
| 766 DCHECK(producer_open_); | 771 DCHECK(producer_open_); |
| 767 producer_open_ = false; | 772 producer_open_ = false; |
| 768 if (has_local_producer_no_lock()) { | 773 if (has_local_producer_no_lock()) { |
| 774 ProducerCancelAllStateNoLock(); |
| 769 producer_awakable_list_.reset(); | 775 producer_awakable_list_.reset(); |
| 770 // Not a bug, except possibly in "user" code. | |
| 771 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) | |
| 772 << "Producer closed with active two-phase write"; | |
| 773 producer_two_phase_max_num_bytes_written_ = 0; | |
| 774 impl_->ProducerClose(); | 776 impl_->ProducerClose(); |
| 775 AwakeConsumerAwakablesForStateChangeNoLock( | 777 AwakeConsumerAwakablesForStateChangeNoLock( |
| 776 impl_->ConsumerGetHandleSignalsState()); | 778 impl_->ConsumerGetHandleSignalsState()); |
| 777 } | 779 } |
| 778 } | 780 } |
| 779 | 781 |
| 780 void DataPipe::ConsumerCloseNoLock() { | 782 void DataPipe::ConsumerCloseNoLock() { |
| 781 mutex_.AssertHeld(); | 783 mutex_.AssertHeld(); |
| 782 DCHECK(consumer_open_); | 784 DCHECK(consumer_open_); |
| 783 consumer_open_ = false; | 785 consumer_open_ = false; |
| 784 if (has_local_consumer_no_lock()) { | 786 if (has_local_consumer_no_lock()) { |
| 787 ConsumerCancelAllStateNoLock(); |
| 785 consumer_awakable_list_.reset(); | 788 consumer_awakable_list_.reset(); |
| 786 // Not a bug, except possibly in "user" code. | |
| 787 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) | |
| 788 << "Consumer closed with active two-phase read"; | |
| 789 consumer_two_phase_max_num_bytes_read_ = 0; | |
| 790 impl_->ConsumerClose(); | 789 impl_->ConsumerClose(); |
| 791 AwakeProducerAwakablesForStateChangeNoLock( | 790 AwakeProducerAwakablesForStateChangeNoLock( |
| 792 impl_->ProducerGetHandleSignalsState()); | 791 impl_->ProducerGetHandleSignalsState()); |
| 793 } | 792 } |
| 794 } | 793 } |
| 795 | 794 |
| 796 bool DataPipe::OnReadMessage(unsigned port, MessageInTransit* message) { | 795 bool DataPipe::OnReadMessage(unsigned port, MessageInTransit* message) { |
| 797 MutexLocker locker(&mutex_); | 796 MutexLocker locker(&mutex_); |
| 798 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock()); | 797 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock()); |
| 799 | 798 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 SetProducerClosedNoLock(); | 857 SetProducerClosedNoLock(); |
| 859 } | 858 } |
| 860 | 859 |
| 861 void DataPipe::SetConsumerClosed() { | 860 void DataPipe::SetConsumerClosed() { |
| 862 MutexLocker locker(&mutex_); | 861 MutexLocker locker(&mutex_); |
| 863 SetConsumerClosedNoLock(); | 862 SetConsumerClosedNoLock(); |
| 864 } | 863 } |
| 865 | 864 |
| 866 } // namespace system | 865 } // namespace system |
| 867 } // namespace mojo | 866 } // namespace mojo |
| OLD | NEW |