| Index: mojo/system/data_pipe.cc
|
| diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc
|
| index 7b7a0d35e42f535cb49a02748cd9d4ebb1ee3f4f..b0b350f808b154d73a898a8fb14a86fcee4b40c5 100644
|
| --- a/mojo/system/data_pipe.cc
|
| +++ b/mojo/system/data_pipe.cc
|
| @@ -94,8 +94,8 @@ void DataPipe::ProducerClose() {
|
| ConsumerGetHandleSignalsStateNoLock());
|
| }
|
|
|
| -MojoResult DataPipe::ProducerWriteData(const void* elements,
|
| - uint32_t* num_bytes,
|
| +MojoResult DataPipe::ProducerWriteData(UserPointer<const void> elements,
|
| + UserPointer<uint32_t> num_bytes,
|
| bool all_or_none) {
|
| base::AutoLock locker(lock_);
|
| DCHECK(has_local_producer_no_lock());
|
| @@ -106,14 +106,19 @@ MojoResult DataPipe::ProducerWriteData(const void* elements,
|
| return MOJO_RESULT_FAILED_PRECONDITION;
|
|
|
| // Returning "busy" takes priority over "invalid argument".
|
| - if (*num_bytes % element_num_bytes_ != 0)
|
| + uint32_t max_num_bytes_to_write = num_bytes.Get();
|
| + if (max_num_bytes_to_write % element_num_bytes_ != 0)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| - if (*num_bytes == 0)
|
| + if (max_num_bytes_to_write == 0)
|
| return MOJO_RESULT_OK; // Nothing to do.
|
|
|
| + uint32_t min_num_bytes_to_write = all_or_none ? max_num_bytes_to_write : 0;
|
| +
|
| HandleSignalsState old_consumer_state = ConsumerGetHandleSignalsStateNoLock();
|
| - MojoResult rv = ProducerWriteDataImplNoLock(elements, num_bytes, all_or_none);
|
| + MojoResult rv = ProducerWriteDataImplNoLock(elements, num_bytes,
|
| + max_num_bytes_to_write,
|
| + min_num_bytes_to_write);
|
| HandleSignalsState new_consumer_state = ConsumerGetHandleSignalsStateNoLock();
|
| if (!new_consumer_state.equals(old_consumer_state))
|
| AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state);
|
|
|