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

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

Issue 2072353002: Give AwakableList's wake-up method the old state in addition to the new state. (Closed) Base URL: https://github.com/domokit/mojo.git@master
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/local_message_pipe_endpoint.cc » ('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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 MojoResult DataPipe::ProducerSetOptions(uint32_t write_threshold_num_bytes) { 283 MojoResult DataPipe::ProducerSetOptions(uint32_t write_threshold_num_bytes) {
284 MutexLocker locker(&mutex_); 284 MutexLocker locker(&mutex_);
285 DCHECK(has_local_producer_no_lock()); 285 DCHECK(has_local_producer_no_lock());
286 286
287 if (write_threshold_num_bytes % element_num_bytes() != 0) 287 if (write_threshold_num_bytes % element_num_bytes() != 0)
288 return MOJO_RESULT_INVALID_ARGUMENT; 288 return MOJO_RESULT_INVALID_ARGUMENT;
289 289
290 HandleSignalsState old_producer_state = 290 HandleSignalsState old_producer_state =
291 impl_->ProducerGetHandleSignalsState(); 291 impl_->ProducerGetHandleSignalsState();
292 producer_write_threshold_num_bytes_ = write_threshold_num_bytes; 292 producer_write_threshold_num_bytes_ = write_threshold_num_bytes;
293 HandleSignalsState new_producer_state = 293 OnProducerMaybeStateChange(old_producer_state,
294 impl_->ProducerGetHandleSignalsState(); 294 impl_->ProducerGetHandleSignalsState());
295 if (!new_producer_state.equals(old_producer_state))
296 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state);
297 return MOJO_RESULT_OK; 295 return MOJO_RESULT_OK;
298 } 296 }
299 297
300 void DataPipe::ProducerGetOptions(uint32_t* write_threshold_num_bytes) { 298 void DataPipe::ProducerGetOptions(uint32_t* write_threshold_num_bytes) {
301 MutexLocker locker(&mutex_); 299 MutexLocker locker(&mutex_);
302 DCHECK(has_local_producer_no_lock()); 300 DCHECK(has_local_producer_no_lock());
303 *write_threshold_num_bytes = producer_write_threshold_num_bytes_; 301 *write_threshold_num_bytes = producer_write_threshold_num_bytes_;
304 } 302 }
305 303
306 MojoResult DataPipe::ProducerWriteData(UserPointer<const void> elements, 304 MojoResult DataPipe::ProducerWriteData(UserPointer<const void> elements,
(...skipping 14 matching lines...) Expand all
321 319
322 if (max_num_bytes_to_write == 0) 320 if (max_num_bytes_to_write == 0)
323 return MOJO_RESULT_OK; // Nothing to do. 321 return MOJO_RESULT_OK; // Nothing to do.
324 322
325 uint32_t min_num_bytes_to_write = all_or_none ? max_num_bytes_to_write : 0; 323 uint32_t min_num_bytes_to_write = all_or_none ? max_num_bytes_to_write : 0;
326 324
327 HandleSignalsState old_consumer_state = 325 HandleSignalsState old_consumer_state =
328 impl_->ConsumerGetHandleSignalsState(); 326 impl_->ConsumerGetHandleSignalsState();
329 MojoResult rv = impl_->ProducerWriteData( 327 MojoResult rv = impl_->ProducerWriteData(
330 elements, num_bytes, max_num_bytes_to_write, min_num_bytes_to_write); 328 elements, num_bytes, max_num_bytes_to_write, min_num_bytes_to_write);
331 HandleSignalsState new_consumer_state = 329 OnConsumerMaybeStateChange(old_consumer_state,
332 impl_->ConsumerGetHandleSignalsState(); 330 impl_->ConsumerGetHandleSignalsState());
333 if (!new_consumer_state.equals(old_consumer_state))
334 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state);
335 return rv; 331 return rv;
336 } 332 }
337 333
338 MojoResult DataPipe::ProducerBeginWriteData( 334 MojoResult DataPipe::ProducerBeginWriteData(
339 UserPointer<void*> buffer, 335 UserPointer<void*> buffer,
340 UserPointer<uint32_t> buffer_num_bytes) { 336 UserPointer<uint32_t> buffer_num_bytes) {
341 MutexLocker locker(&mutex_); 337 MutexLocker locker(&mutex_);
342 DCHECK(has_local_producer_no_lock()); 338 DCHECK(has_local_producer_no_lock());
343 339
344 if (producer_in_two_phase_write_no_lock()) 340 if (producer_in_two_phase_write_no_lock())
(...skipping 16 matching lines...) Expand all
361 MutexLocker locker(&mutex_); 357 MutexLocker locker(&mutex_);
362 DCHECK(has_local_producer_no_lock()); 358 DCHECK(has_local_producer_no_lock());
363 359
364 if (!producer_in_two_phase_write_no_lock()) 360 if (!producer_in_two_phase_write_no_lock())
365 return MOJO_RESULT_FAILED_PRECONDITION; 361 return MOJO_RESULT_FAILED_PRECONDITION;
366 // Note: Allow successful completion of the two-phase write even if the 362 // Note: Allow successful completion of the two-phase write even if the
367 // consumer has been closed. 363 // consumer has been closed.
368 364
369 HandleSignalsState old_consumer_state = 365 HandleSignalsState old_consumer_state =
370 impl_->ConsumerGetHandleSignalsState(); 366 impl_->ConsumerGetHandleSignalsState();
367 HandleSignalsState old_producer_state =
368 impl_->ProducerGetHandleSignalsState();
371 MojoResult rv; 369 MojoResult rv;
372 if (num_bytes_written > producer_two_phase_max_num_bytes_written_ || 370 if (num_bytes_written > producer_two_phase_max_num_bytes_written_ ||
373 num_bytes_written % element_num_bytes() != 0) { 371 num_bytes_written % element_num_bytes() != 0) {
374 rv = MOJO_RESULT_INVALID_ARGUMENT; 372 rv = MOJO_RESULT_INVALID_ARGUMENT;
375 producer_two_phase_max_num_bytes_written_ = 0; 373 producer_two_phase_max_num_bytes_written_ = 0;
376 } else { 374 } else {
377 rv = impl_->ProducerEndWriteData(num_bytes_written); 375 rv = impl_->ProducerEndWriteData(num_bytes_written);
378 } 376 }
379 // Two-phase write ended even on failure. 377 // Two-phase write ended even on failure.
380 DCHECK(!producer_in_two_phase_write_no_lock()); 378 DCHECK(!producer_in_two_phase_write_no_lock());
381 // If we're now writable, we *became* writable (since we weren't writable 379 // If we're now writable, we *became* writable (since we weren't writable
382 // during the two-phase write), so awake producer awakables. 380 // during the two-phase write), so awake producer awakables.
383 HandleSignalsState new_producer_state = 381 OnProducerMaybeStateChange(old_producer_state,
384 impl_->ProducerGetHandleSignalsState(); 382 impl_->ProducerGetHandleSignalsState());
385 if (new_producer_state.satisfies(MOJO_HANDLE_SIGNAL_WRITABLE)) 383 OnConsumerMaybeStateChange(old_consumer_state,
386 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state); 384 impl_->ConsumerGetHandleSignalsState());
387 HandleSignalsState new_consumer_state =
388 impl_->ConsumerGetHandleSignalsState();
389 if (!new_consumer_state.equals(old_consumer_state))
390 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state);
391 return rv; 385 return rv;
392 } 386 }
393 387
394 HandleSignalsState DataPipe::ProducerGetHandleSignalsState() { 388 HandleSignalsState DataPipe::ProducerGetHandleSignalsState() {
395 MutexLocker locker(&mutex_); 389 MutexLocker locker(&mutex_);
396 DCHECK(has_local_producer_no_lock()); 390 DCHECK(has_local_producer_no_lock());
397 return impl_->ProducerGetHandleSignalsState(); 391 return impl_->ProducerGetHandleSignalsState();
398 } 392 }
399 393
400 MojoResult DataPipe::ProducerAddAwakable(Awakable* awakable, 394 MojoResult DataPipe::ProducerAddAwakable(Awakable* awakable,
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 MojoResult DataPipe::ConsumerSetOptions(uint32_t read_threshold_num_bytes) { 478 MojoResult DataPipe::ConsumerSetOptions(uint32_t read_threshold_num_bytes) {
485 MutexLocker locker(&mutex_); 479 MutexLocker locker(&mutex_);
486 DCHECK(has_local_consumer_no_lock()); 480 DCHECK(has_local_consumer_no_lock());
487 481
488 if (read_threshold_num_bytes % element_num_bytes() != 0) 482 if (read_threshold_num_bytes % element_num_bytes() != 0)
489 return MOJO_RESULT_INVALID_ARGUMENT; 483 return MOJO_RESULT_INVALID_ARGUMENT;
490 484
491 HandleSignalsState old_consumer_state = 485 HandleSignalsState old_consumer_state =
492 impl_->ConsumerGetHandleSignalsState(); 486 impl_->ConsumerGetHandleSignalsState();
493 consumer_read_threshold_num_bytes_ = read_threshold_num_bytes; 487 consumer_read_threshold_num_bytes_ = read_threshold_num_bytes;
494 HandleSignalsState new_consumer_state = 488 OnConsumerMaybeStateChange(old_consumer_state,
495 impl_->ConsumerGetHandleSignalsState(); 489 impl_->ConsumerGetHandleSignalsState());
496 if (!new_consumer_state.equals(old_consumer_state))
497 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state);
498 return MOJO_RESULT_OK; 490 return MOJO_RESULT_OK;
499 } 491 }
500 492
501 void DataPipe::ConsumerGetOptions(uint32_t* read_threshold_num_bytes) { 493 void DataPipe::ConsumerGetOptions(uint32_t* read_threshold_num_bytes) {
502 MutexLocker locker(&mutex_); 494 MutexLocker locker(&mutex_);
503 DCHECK(has_local_consumer_no_lock()); 495 DCHECK(has_local_consumer_no_lock());
504 *read_threshold_num_bytes = consumer_read_threshold_num_bytes_; 496 *read_threshold_num_bytes = consumer_read_threshold_num_bytes_;
505 } 497 }
506 498
507 MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements, 499 MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements,
(...skipping 12 matching lines...) Expand all
520 512
521 if (max_num_bytes_to_read == 0) 513 if (max_num_bytes_to_read == 0)
522 return MOJO_RESULT_OK; // Nothing to do. 514 return MOJO_RESULT_OK; // Nothing to do.
523 515
524 uint32_t min_num_bytes_to_read = all_or_none ? max_num_bytes_to_read : 0; 516 uint32_t min_num_bytes_to_read = all_or_none ? max_num_bytes_to_read : 0;
525 517
526 HandleSignalsState old_producer_state = 518 HandleSignalsState old_producer_state =
527 impl_->ProducerGetHandleSignalsState(); 519 impl_->ProducerGetHandleSignalsState();
528 MojoResult rv = impl_->ConsumerReadData( 520 MojoResult rv = impl_->ConsumerReadData(
529 elements, num_bytes, max_num_bytes_to_read, min_num_bytes_to_read, peek); 521 elements, num_bytes, max_num_bytes_to_read, min_num_bytes_to_read, peek);
530 HandleSignalsState new_producer_state = 522 OnProducerMaybeStateChange(old_producer_state,
531 impl_->ProducerGetHandleSignalsState(); 523 impl_->ProducerGetHandleSignalsState());
532 if (!new_producer_state.equals(old_producer_state))
533 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state);
534 return rv; 524 return rv;
535 } 525 }
536 526
537 MojoResult DataPipe::ConsumerDiscardData(UserPointer<uint32_t> num_bytes, 527 MojoResult DataPipe::ConsumerDiscardData(UserPointer<uint32_t> num_bytes,
538 bool all_or_none) { 528 bool all_or_none) {
539 MutexLocker locker(&mutex_); 529 MutexLocker locker(&mutex_);
540 DCHECK(has_local_consumer_no_lock()); 530 DCHECK(has_local_consumer_no_lock());
541 531
542 if (consumer_in_two_phase_read_no_lock()) 532 if (consumer_in_two_phase_read_no_lock())
543 return MOJO_RESULT_BUSY; 533 return MOJO_RESULT_BUSY;
544 534
545 uint32_t max_num_bytes_to_discard = num_bytes.Get(); 535 uint32_t max_num_bytes_to_discard = num_bytes.Get();
546 if (max_num_bytes_to_discard % element_num_bytes() != 0) 536 if (max_num_bytes_to_discard % element_num_bytes() != 0)
547 return MOJO_RESULT_INVALID_ARGUMENT; 537 return MOJO_RESULT_INVALID_ARGUMENT;
548 538
549 if (max_num_bytes_to_discard == 0) 539 if (max_num_bytes_to_discard == 0)
550 return MOJO_RESULT_OK; // Nothing to do. 540 return MOJO_RESULT_OK; // Nothing to do.
551 541
552 uint32_t min_num_bytes_to_discard = 542 uint32_t min_num_bytes_to_discard =
553 all_or_none ? max_num_bytes_to_discard : 0; 543 all_or_none ? max_num_bytes_to_discard : 0;
554 544
555 HandleSignalsState old_producer_state = 545 HandleSignalsState old_producer_state =
556 impl_->ProducerGetHandleSignalsState(); 546 impl_->ProducerGetHandleSignalsState();
557 MojoResult rv = impl_->ConsumerDiscardData( 547 MojoResult rv = impl_->ConsumerDiscardData(
558 num_bytes, max_num_bytes_to_discard, min_num_bytes_to_discard); 548 num_bytes, max_num_bytes_to_discard, min_num_bytes_to_discard);
559 HandleSignalsState new_producer_state = 549 OnProducerMaybeStateChange(old_producer_state,
560 impl_->ProducerGetHandleSignalsState(); 550 impl_->ProducerGetHandleSignalsState());
561 if (!new_producer_state.equals(old_producer_state))
562 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state);
563 return rv; 551 return rv;
564 } 552 }
565 553
566 MojoResult DataPipe::ConsumerQueryData(UserPointer<uint32_t> num_bytes) { 554 MojoResult DataPipe::ConsumerQueryData(UserPointer<uint32_t> num_bytes) {
567 MutexLocker locker(&mutex_); 555 MutexLocker locker(&mutex_);
568 DCHECK(has_local_consumer_no_lock()); 556 DCHECK(has_local_consumer_no_lock());
569 557
570 if (consumer_in_two_phase_read_no_lock()) 558 if (consumer_in_two_phase_read_no_lock())
571 return MOJO_RESULT_BUSY; 559 return MOJO_RESULT_BUSY;
572 560
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 num_bytes_read % element_num_bytes() != 0) { 594 num_bytes_read % element_num_bytes() != 0) {
607 rv = MOJO_RESULT_INVALID_ARGUMENT; 595 rv = MOJO_RESULT_INVALID_ARGUMENT;
608 consumer_two_phase_max_num_bytes_read_ = 0; 596 consumer_two_phase_max_num_bytes_read_ = 0;
609 } else { 597 } else {
610 rv = impl_->ConsumerEndReadData(num_bytes_read); 598 rv = impl_->ConsumerEndReadData(num_bytes_read);
611 } 599 }
612 // Two-phase read ended even on failure. 600 // Two-phase read ended even on failure.
613 DCHECK(!consumer_in_two_phase_read_no_lock()); 601 DCHECK(!consumer_in_two_phase_read_no_lock());
614 // If we're now readable, we *became* readable (since we weren't readable 602 // If we're now readable, we *became* readable (since we weren't readable
615 // during the two-phase read), so awake consumer awakables. 603 // during the two-phase read), so awake consumer awakables.
616 HandleSignalsState new_consumer_state = 604 OnConsumerMaybeStateChange(old_consumer_state,
617 impl_->ConsumerGetHandleSignalsState(); 605 impl_->ConsumerGetHandleSignalsState());
618 if (!new_consumer_state.equals(old_consumer_state)) 606 OnProducerMaybeStateChange(old_producer_state,
619 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state); 607 impl_->ProducerGetHandleSignalsState());
620 HandleSignalsState new_producer_state =
621 impl_->ProducerGetHandleSignalsState();
622 if (!new_producer_state.equals(old_producer_state))
623 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state);
624 return rv; 608 return rv;
625 } 609 }
626 610
627 HandleSignalsState DataPipe::ConsumerGetHandleSignalsState() { 611 HandleSignalsState DataPipe::ConsumerGetHandleSignalsState() {
628 MutexLocker locker(&mutex_); 612 MutexLocker locker(&mutex_);
629 DCHECK(has_local_consumer_no_lock()); 613 DCHECK(has_local_consumer_no_lock());
630 return impl_->ConsumerGetHandleSignalsState(); 614 return impl_->ConsumerGetHandleSignalsState();
631 } 615 }
632 616
633 MojoResult DataPipe::ConsumerAddAwakable(Awakable* awakable, 617 MojoResult DataPipe::ConsumerAddAwakable(Awakable* awakable,
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 void DataPipe::SetConsumerClosedNoLock() { 764 void DataPipe::SetConsumerClosedNoLock() {
781 mutex_.AssertHeld(); 765 mutex_.AssertHeld();
782 DCHECK(!has_local_consumer_no_lock()); 766 DCHECK(!has_local_consumer_no_lock());
783 DCHECK(consumer_open_); 767 DCHECK(consumer_open_);
784 consumer_open_ = false; 768 consumer_open_ = false;
785 } 769 }
786 770
787 void DataPipe::ProducerCloseNoLock() { 771 void DataPipe::ProducerCloseNoLock() {
788 mutex_.AssertHeld(); 772 mutex_.AssertHeld();
789 DCHECK(producer_open_); 773 DCHECK(producer_open_);
774 HandleSignalsState old_consumer_state =
775 impl_->ConsumerGetHandleSignalsState();
790 producer_open_ = false; 776 producer_open_ = false;
791 if (has_local_producer_no_lock()) { 777 if (has_local_producer_no_lock()) {
792 ProducerCancelAllStateNoLock(); 778 ProducerCancelAllStateNoLock();
793 producer_awakable_list_.reset(); 779 producer_awakable_list_.reset();
794 impl_->ProducerClose(); 780 impl_->ProducerClose();
795 AwakeConsumerAwakablesForStateChangeNoLock(
796 impl_->ConsumerGetHandleSignalsState());
797 } 781 }
782 OnConsumerMaybeStateChange(old_consumer_state,
783 impl_->ConsumerGetHandleSignalsState());
798 } 784 }
799 785
800 void DataPipe::ConsumerCloseNoLock() { 786 void DataPipe::ConsumerCloseNoLock() {
801 mutex_.AssertHeld(); 787 mutex_.AssertHeld();
802 DCHECK(consumer_open_); 788 DCHECK(consumer_open_);
789 HandleSignalsState old_producer_state =
790 impl_->ProducerGetHandleSignalsState();
803 consumer_open_ = false; 791 consumer_open_ = false;
804 if (has_local_consumer_no_lock()) { 792 if (has_local_consumer_no_lock()) {
805 ConsumerCancelAllStateNoLock(); 793 ConsumerCancelAllStateNoLock();
806 consumer_awakable_list_.reset(); 794 consumer_awakable_list_.reset();
807 impl_->ConsumerClose(); 795 impl_->ConsumerClose();
808 AwakeProducerAwakablesForStateChangeNoLock(
809 impl_->ProducerGetHandleSignalsState());
810 } 796 }
797 OnProducerMaybeStateChange(old_producer_state,
798 impl_->ProducerGetHandleSignalsState());
811 } 799 }
812 800
813 bool DataPipe::OnReadMessage(unsigned port, MessageInTransit* message) { 801 bool DataPipe::OnReadMessage(unsigned port, MessageInTransit* message) {
814 MutexLocker locker(&mutex_); 802 MutexLocker locker(&mutex_);
815 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock()); 803 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock());
816 804
817 HandleSignalsState old_producer_state = 805 HandleSignalsState old_producer_state =
818 impl_->ProducerGetHandleSignalsState(); 806 impl_->ProducerGetHandleSignalsState();
819 HandleSignalsState old_consumer_state = 807 HandleSignalsState old_consumer_state =
820 impl_->ConsumerGetHandleSignalsState(); 808 impl_->ConsumerGetHandleSignalsState();
821 809
822 bool rv = impl_->OnReadMessage(port, message); 810 bool rv = impl_->OnReadMessage(port, message);
823 811
824 HandleSignalsState new_producer_state = 812 OnProducerMaybeStateChange(old_producer_state,
825 impl_->ProducerGetHandleSignalsState(); 813 impl_->ProducerGetHandleSignalsState());
826 if (!new_producer_state.equals(old_producer_state)) 814 OnConsumerMaybeStateChange(old_consumer_state,
827 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state); 815 impl_->ConsumerGetHandleSignalsState());
828 HandleSignalsState new_consumer_state =
829 impl_->ConsumerGetHandleSignalsState();
830 if (!new_consumer_state.equals(old_consumer_state))
831 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state);
832 816
833 return rv; 817 return rv;
834 } 818 }
835 819
836 void DataPipe::OnDetachFromChannel(unsigned port) { 820 void DataPipe::OnDetachFromChannel(unsigned port) {
837 MutexLocker locker(&mutex_); 821 MutexLocker locker(&mutex_);
838 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock()); 822 DCHECK(!has_local_producer_no_lock() || !has_local_consumer_no_lock());
839 823
840 HandleSignalsState old_producer_state = 824 HandleSignalsState old_producer_state =
841 impl_->ProducerGetHandleSignalsState(); 825 impl_->ProducerGetHandleSignalsState();
842 HandleSignalsState old_consumer_state = 826 HandleSignalsState old_consumer_state =
843 impl_->ConsumerGetHandleSignalsState(); 827 impl_->ConsumerGetHandleSignalsState();
844 828
845 impl_->OnDetachFromChannel(port); 829 impl_->OnDetachFromChannel(port);
846 830
847 HandleSignalsState new_producer_state = 831 OnProducerMaybeStateChange(old_producer_state,
848 impl_->ProducerGetHandleSignalsState(); 832 impl_->ProducerGetHandleSignalsState());
849 if (!new_producer_state.equals(old_producer_state)) 833 OnConsumerMaybeStateChange(old_consumer_state,
850 AwakeProducerAwakablesForStateChangeNoLock(new_producer_state); 834 impl_->ConsumerGetHandleSignalsState());
851 HandleSignalsState new_consumer_state =
852 impl_->ConsumerGetHandleSignalsState();
853 if (!new_consumer_state.equals(old_consumer_state))
854 AwakeConsumerAwakablesForStateChangeNoLock(new_consumer_state);
855 } 835 }
856 836
857 void DataPipe::AwakeProducerAwakablesForStateChangeNoLock( 837 void DataPipe::OnProducerMaybeStateChange(
838 const HandleSignalsState& old_producer_state,
858 const HandleSignalsState& new_producer_state) { 839 const HandleSignalsState& new_producer_state) {
859 mutex_.AssertHeld(); 840 mutex_.AssertHeld();
860 if (!has_local_producer_no_lock()) 841 if (!new_producer_state.equals(old_producer_state) &&
861 return; 842 has_local_producer_no_lock()) {
862 producer_awakable_list_->AwakeForStateChange(new_producer_state); 843 producer_awakable_list_->OnStateChange(old_producer_state,
844 new_producer_state);
845 }
863 } 846 }
864 847
865 void DataPipe::AwakeConsumerAwakablesForStateChangeNoLock( 848 void DataPipe::OnConsumerMaybeStateChange(
849 const HandleSignalsState& old_consumer_state,
866 const HandleSignalsState& new_consumer_state) { 850 const HandleSignalsState& new_consumer_state) {
867 mutex_.AssertHeld(); 851 mutex_.AssertHeld();
868 if (!has_local_consumer_no_lock()) 852 if (!new_consumer_state.equals(old_consumer_state) &&
869 return; 853 has_local_consumer_no_lock()) {
870 consumer_awakable_list_->AwakeForStateChange(new_consumer_state); 854 consumer_awakable_list_->OnStateChange(old_consumer_state,
855 new_consumer_state);
856 }
871 } 857 }
872 858
873 void DataPipe::SetProducerClosed() { 859 void DataPipe::SetProducerClosed() {
874 MutexLocker locker(&mutex_); 860 MutexLocker locker(&mutex_);
875 SetProducerClosedNoLock(); 861 SetProducerClosedNoLock();
876 } 862 }
877 863
878 void DataPipe::SetConsumerClosed() { 864 void DataPipe::SetConsumerClosed() {
879 MutexLocker locker(&mutex_); 865 MutexLocker locker(&mutex_);
880 SetConsumerClosedNoLock(); 866 SetConsumerClosedNoLock();
881 } 867 }
882 868
883 } // namespace system 869 } // namespace system
884 } // namespace mojo 870 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe.h ('k') | mojo/edk/system/local_message_pipe_endpoint.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698