| Index: mojo/system/data_pipe.cc
|
| diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc
|
| index 687b96837f108495ab1bc5e29961022128e7a460..7b7a0d35e42f535cb49a02748cd9d4ebb1ee3f4f 100644
|
| --- a/mojo/system/data_pipe.cc
|
| +++ b/mojo/system/data_pipe.cc
|
| @@ -230,8 +230,8 @@ void DataPipe::ConsumerClose() {
|
| ProducerGetHandleSignalsStateNoLock());
|
| }
|
|
|
| -MojoResult DataPipe::ConsumerReadData(void* elements,
|
| - uint32_t* num_bytes,
|
| +MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements,
|
| + UserPointer<uint32_t> num_bytes,
|
| bool all_or_none) {
|
| base::AutoLock locker(lock_);
|
| DCHECK(has_local_consumer_no_lock());
|
| @@ -239,21 +239,26 @@ MojoResult DataPipe::ConsumerReadData(void* elements,
|
| if (consumer_in_two_phase_read_no_lock())
|
| return MOJO_RESULT_BUSY;
|
|
|
| - if (*num_bytes % element_num_bytes_ != 0)
|
| + uint32_t max_num_bytes_to_read = num_bytes.Get();
|
| + if (max_num_bytes_to_read % element_num_bytes_ != 0)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| - if (*num_bytes == 0)
|
| + if (max_num_bytes_to_read == 0)
|
| return MOJO_RESULT_OK; // Nothing to do.
|
|
|
| + uint32_t min_num_bytes_to_read = all_or_none ? max_num_bytes_to_read : 0;
|
| +
|
| HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateNoLock();
|
| - MojoResult rv = ConsumerReadDataImplNoLock(elements, num_bytes, all_or_none);
|
| + MojoResult rv = ConsumerReadDataImplNoLock(elements, num_bytes,
|
| + max_num_bytes_to_read,
|
| + min_num_bytes_to_read);
|
| HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
|
| if (!new_producer_state.equals(old_producer_state))
|
| AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
|
| return rv;
|
| }
|
|
|
| -MojoResult DataPipe::ConsumerDiscardData(uint32_t* num_bytes,
|
| +MojoResult DataPipe::ConsumerDiscardData(UserPointer<uint32_t> num_bytes,
|
| bool all_or_none) {
|
| base::AutoLock locker(lock_);
|
| DCHECK(has_local_consumer_no_lock());
|
| @@ -261,21 +266,27 @@ MojoResult DataPipe::ConsumerDiscardData(uint32_t* num_bytes,
|
| if (consumer_in_two_phase_read_no_lock())
|
| return MOJO_RESULT_BUSY;
|
|
|
| - if (*num_bytes % element_num_bytes_ != 0)
|
| + uint32_t max_num_bytes_to_discard = num_bytes.Get();
|
| + if (max_num_bytes_to_discard % element_num_bytes_ != 0)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| - if (*num_bytes == 0)
|
| + if (max_num_bytes_to_discard == 0)
|
| return MOJO_RESULT_OK; // Nothing to do.
|
|
|
| + uint32_t min_num_bytes_to_discard = all_or_none ? max_num_bytes_to_discard :
|
| + 0;
|
| +
|
| HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateNoLock();
|
| - MojoResult rv = ConsumerDiscardDataImplNoLock(num_bytes, all_or_none);
|
| + MojoResult rv = ConsumerDiscardDataImplNoLock(num_bytes,
|
| + max_num_bytes_to_discard,
|
| + min_num_bytes_to_discard);
|
| HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
|
| if (!new_producer_state.equals(old_producer_state))
|
| AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
|
| return rv;
|
| }
|
|
|
| -MojoResult DataPipe::ConsumerQueryData(uint32_t* num_bytes) {
|
| +MojoResult DataPipe::ConsumerQueryData(UserPointer<uint32_t> num_bytes) {
|
| base::AutoLock locker(lock_);
|
| DCHECK(has_local_consumer_no_lock());
|
|
|
|
|