| 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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |