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

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

Issue 2088833003: Add different behavior to AwakableList for "persistent" vs "one-shot" awakables. (Closed) Base URL: https://github.com/domokit/mojo.git@work793_wait_set_4.5
Patch Set: Created 4 years, 6 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/data_pipe_consumer_dispatcher.h » ('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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 } 386 }
387 387
388 HandleSignalsState DataPipe::ProducerGetHandleSignalsState() { 388 HandleSignalsState DataPipe::ProducerGetHandleSignalsState() {
389 MutexLocker locker(&mutex_); 389 MutexLocker locker(&mutex_);
390 DCHECK(has_local_producer_no_lock()); 390 DCHECK(has_local_producer_no_lock());
391 return impl_->ProducerGetHandleSignalsState(); 391 return impl_->ProducerGetHandleSignalsState();
392 } 392 }
393 393
394 MojoResult DataPipe::ProducerAddAwakable(Awakable* awakable, 394 MojoResult DataPipe::ProducerAddAwakable(Awakable* awakable,
395 uint64_t context, 395 uint64_t context,
396 bool force, 396 bool persistent,
397 MojoHandleSignals signals, 397 MojoHandleSignals signals,
398 HandleSignalsState* signals_state) { 398 HandleSignalsState* signals_state) {
399 MutexLocker locker(&mutex_); 399 MutexLocker locker(&mutex_);
400 DCHECK(has_local_producer_no_lock()); 400 DCHECK(has_local_producer_no_lock());
401 401
402 HandleSignalsState producer_state = impl_->ProducerGetHandleSignalsState(); 402 HandleSignalsState producer_state = impl_->ProducerGetHandleSignalsState();
403 if (signals_state) 403 if (signals_state)
404 *signals_state = producer_state; 404 *signals_state = producer_state;
405 if (producer_state.satisfies(signals)) { 405 if (producer_state.satisfies(signals)) {
406 if (force) 406 if (persistent)
407 producer_awakable_list_->Add(awakable, context, signals); 407 producer_awakable_list_->Add(awakable, context, persistent, signals);
408 return MOJO_RESULT_ALREADY_EXISTS; 408 return MOJO_RESULT_ALREADY_EXISTS;
409 } 409 }
410 if (!producer_state.can_satisfy(signals)) { 410 if (!producer_state.can_satisfy(signals)) {
411 if (force) 411 if (persistent)
412 producer_awakable_list_->Add(awakable, context, signals); 412 producer_awakable_list_->Add(awakable, context, persistent, signals);
413 return MOJO_RESULT_FAILED_PRECONDITION; 413 return MOJO_RESULT_FAILED_PRECONDITION;
414 } 414 }
415 415
416 producer_awakable_list_->Add(awakable, context, signals); 416 producer_awakable_list_->Add(awakable, context, persistent, signals);
417 return MOJO_RESULT_OK; 417 return MOJO_RESULT_OK;
418 } 418 }
419 419
420 void DataPipe::ProducerRemoveAwakable(bool match_context, 420 void DataPipe::ProducerRemoveAwakable(bool match_context,
421 Awakable* awakable, 421 Awakable* awakable,
422 uint64_t context, 422 uint64_t context,
423 HandleSignalsState* signals_state) { 423 HandleSignalsState* signals_state) {
424 MutexLocker locker(&mutex_); 424 MutexLocker locker(&mutex_);
425 DCHECK(has_local_producer_no_lock()); 425 DCHECK(has_local_producer_no_lock());
426 producer_awakable_list_->Remove(match_context, awakable, context); 426 producer_awakable_list_->Remove(match_context, awakable, context);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 } 600 }
601 601
602 HandleSignalsState DataPipe::ConsumerGetHandleSignalsState() { 602 HandleSignalsState DataPipe::ConsumerGetHandleSignalsState() {
603 MutexLocker locker(&mutex_); 603 MutexLocker locker(&mutex_);
604 DCHECK(has_local_consumer_no_lock()); 604 DCHECK(has_local_consumer_no_lock());
605 return impl_->ConsumerGetHandleSignalsState(); 605 return impl_->ConsumerGetHandleSignalsState();
606 } 606 }
607 607
608 MojoResult DataPipe::ConsumerAddAwakable(Awakable* awakable, 608 MojoResult DataPipe::ConsumerAddAwakable(Awakable* awakable,
609 uint64_t context, 609 uint64_t context,
610 bool force, 610 bool persistent,
611 MojoHandleSignals signals, 611 MojoHandleSignals signals,
612 HandleSignalsState* signals_state) { 612 HandleSignalsState* signals_state) {
613 MutexLocker locker(&mutex_); 613 MutexLocker locker(&mutex_);
614 DCHECK(has_local_consumer_no_lock()); 614 DCHECK(has_local_consumer_no_lock());
615 615
616 HandleSignalsState consumer_state = impl_->ConsumerGetHandleSignalsState(); 616 HandleSignalsState consumer_state = impl_->ConsumerGetHandleSignalsState();
617 if (signals_state) 617 if (signals_state)
618 *signals_state = consumer_state; 618 *signals_state = consumer_state;
619 if (consumer_state.satisfies(signals)) { 619 if (consumer_state.satisfies(signals)) {
620 if (force) 620 if (persistent)
621 consumer_awakable_list_->Add(awakable, context, signals); 621 consumer_awakable_list_->Add(awakable, context, persistent, signals);
622 return MOJO_RESULT_ALREADY_EXISTS; 622 return MOJO_RESULT_ALREADY_EXISTS;
623 } 623 }
624 if (!consumer_state.can_satisfy(signals)) { 624 if (!consumer_state.can_satisfy(signals)) {
625 if (force) 625 if (persistent)
626 consumer_awakable_list_->Add(awakable, context, signals); 626 consumer_awakable_list_->Add(awakable, context, persistent, signals);
627 return MOJO_RESULT_FAILED_PRECONDITION; 627 return MOJO_RESULT_FAILED_PRECONDITION;
628 } 628 }
629 629
630 consumer_awakable_list_->Add(awakable, context, signals); 630 consumer_awakable_list_->Add(awakable, context, persistent, signals);
631 return MOJO_RESULT_OK; 631 return MOJO_RESULT_OK;
632 } 632 }
633 633
634 void DataPipe::ConsumerRemoveAwakable(bool match_context, 634 void DataPipe::ConsumerRemoveAwakable(bool match_context,
635 Awakable* awakable, 635 Awakable* awakable,
636 uint64_t context, 636 uint64_t context,
637 HandleSignalsState* signals_state) { 637 HandleSignalsState* signals_state) {
638 MutexLocker locker(&mutex_); 638 MutexLocker locker(&mutex_);
639 DCHECK(has_local_consumer_no_lock()); 639 DCHECK(has_local_consumer_no_lock());
640 consumer_awakable_list_->Remove(match_context, awakable, context); 640 consumer_awakable_list_->Remove(match_context, awakable, context);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 impl_->set_owner(nullptr); 712 impl_->set_owner(nullptr);
713 std::unique_ptr<DataPipeImpl> rv(std::move(impl_)); 713 std::unique_ptr<DataPipeImpl> rv(std::move(impl_));
714 impl_ = std::move(new_impl); 714 impl_ = std::move(new_impl);
715 impl_->set_owner(this); 715 impl_->set_owner(this);
716 return rv; 716 return rv;
717 } 717 }
718 718
719 void DataPipe::ProducerCancelAllStateNoLock() { 719 void DataPipe::ProducerCancelAllStateNoLock() {
720 DCHECK(has_local_producer_no_lock()); 720 DCHECK(has_local_producer_no_lock());
721 if (producer_awakable_list_) 721 if (producer_awakable_list_)
722 producer_awakable_list_->CancelAll(); 722 producer_awakable_list_->CancelAndRemoveAll();
723 // Not a bug, except possibly in "user" code. 723 // Not a bug, except possibly in "user" code.
724 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) 724 DVLOG_IF(2, producer_in_two_phase_write_no_lock())
725 << "Active two-phase write cancelled"; 725 << "Active two-phase write cancelled";
726 producer_two_phase_max_num_bytes_written_ = 0; 726 producer_two_phase_max_num_bytes_written_ = 0;
727 } 727 }
728 728
729 void DataPipe::ConsumerCancelAllStateNoLock() { 729 void DataPipe::ConsumerCancelAllStateNoLock() {
730 DCHECK(has_local_consumer_no_lock()); 730 DCHECK(has_local_consumer_no_lock());
731 if (consumer_awakable_list_) 731 if (consumer_awakable_list_)
732 consumer_awakable_list_->CancelAll(); 732 consumer_awakable_list_->CancelAndRemoveAll();
733 // Not a bug, except possibly in "user" code. 733 // Not a bug, except possibly in "user" code.
734 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) 734 DVLOG_IF(2, consumer_in_two_phase_read_no_lock())
735 << "Active two-phase read cancelled"; 735 << "Active two-phase read cancelled";
736 consumer_two_phase_max_num_bytes_read_ = 0; 736 consumer_two_phase_max_num_bytes_read_ = 0;
737 } 737 }
738 738
739 void DataPipe::SetProducerClosedNoLock() { 739 void DataPipe::SetProducerClosedNoLock() {
740 mutex_.AssertHeld(); 740 mutex_.AssertHeld();
741 DCHECK(!has_local_producer_no_lock()); 741 DCHECK(!has_local_producer_no_lock());
742 DCHECK(producer_open_); 742 DCHECK(producer_open_);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 SetProducerClosedNoLock(); 843 SetProducerClosedNoLock();
844 } 844 }
845 845
846 void DataPipe::SetConsumerClosed() { 846 void DataPipe::SetConsumerClosed() {
847 MutexLocker locker(&mutex_); 847 MutexLocker locker(&mutex_);
848 SetConsumerClosedNoLock(); 848 SetConsumerClosedNoLock();
849 } 849 }
850 850
851 } // namespace system 851 } // namespace system
852 } // namespace mojo 852 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe.h ('k') | mojo/edk/system/data_pipe_consumer_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698