Index: mojo/system/local_data_pipe.cc |
diff --git a/mojo/system/local_data_pipe.cc b/mojo/system/local_data_pipe.cc |
index 3ad1a2605c50ae0a0533cfe9785ca5dee8811663..acab04cfe9491b0af3ea951a31c71de3ba117fb6 100644 |
--- a/mojo/system/local_data_pipe.cc |
+++ b/mojo/system/local_data_pipe.cc |
@@ -44,19 +44,22 @@ void LocalDataPipe::ProducerCloseImplNoLock() { |
} |
} |
-MojoResult LocalDataPipe::ProducerWriteDataImplNoLock(const void* elements, |
- uint32_t* num_bytes, |
- bool all_or_none) { |
- DCHECK_EQ(*num_bytes % element_num_bytes(), 0u); |
- DCHECK_GT(*num_bytes, 0u); |
+MojoResult LocalDataPipe::ProducerWriteDataImplNoLock( |
+ UserPointer<const void> elements, |
+ UserPointer<uint32_t> num_bytes, |
+ uint32_t max_num_bytes_to_write, |
+ uint32_t min_num_bytes_to_write) { |
+ DCHECK_EQ(max_num_bytes_to_write % element_num_bytes(), 0u); |
+ DCHECK_EQ(min_num_bytes_to_write % element_num_bytes(), 0u); |
+ DCHECK_GT(max_num_bytes_to_write, 0u); |
DCHECK(consumer_open_no_lock()); |
size_t num_bytes_to_write = 0; |
if (may_discard()) { |
- if (all_or_none && *num_bytes > capacity_num_bytes()) |
+ if (min_num_bytes_to_write > capacity_num_bytes()) |
return MOJO_RESULT_OUT_OF_RANGE; |
- num_bytes_to_write = std::min(static_cast<size_t>(*num_bytes), |
+ num_bytes_to_write = std::min(static_cast<size_t>(max_num_bytes_to_write), |
capacity_num_bytes()); |
if (num_bytes_to_write > capacity_num_bytes() - current_num_bytes_) { |
// Discard as much as needed (discard oldest first). |
@@ -66,13 +69,13 @@ MojoResult LocalDataPipe::ProducerWriteDataImplNoLock(const void* elements, |
// the buffer full. |
} |
} else { |
- if (all_or_none && *num_bytes > capacity_num_bytes() - current_num_bytes_) { |
+ if (min_num_bytes_to_write > capacity_num_bytes() - current_num_bytes_) { |
// Don't return "should wait" since you can't wait for a specified amount |
// of data. |
return MOJO_RESULT_OUT_OF_RANGE; |
} |
- num_bytes_to_write = std::min(static_cast<size_t>(*num_bytes), |
+ num_bytes_to_write = std::min(static_cast<size_t>(max_num_bytes_to_write), |
capacity_num_bytes() - current_num_bytes_); |
} |
if (num_bytes_to_write == 0) |
@@ -85,18 +88,18 @@ MojoResult LocalDataPipe::ProducerWriteDataImplNoLock(const void* elements, |
size_t first_write_index = |
(start_index_ + current_num_bytes_) % capacity_num_bytes(); |
EnsureBufferNoLock(); |
- memcpy(buffer_.get() + first_write_index, elements, num_bytes_to_write_first); |
+ elements.GetArray(buffer_.get() + first_write_index, |
+ num_bytes_to_write_first); |
if (num_bytes_to_write_first < num_bytes_to_write) { |
// The "second write index" is zero. |
- memcpy(buffer_.get(), |
- static_cast<const char*>(elements) + num_bytes_to_write_first, |
- num_bytes_to_write - num_bytes_to_write_first); |
+ elements.At(num_bytes_to_write_first).GetArray( |
+ buffer_.get(), num_bytes_to_write - num_bytes_to_write_first); |
} |
current_num_bytes_ += num_bytes_to_write; |
DCHECK_LE(current_num_bytes_, capacity_num_bytes()); |
- *num_bytes = static_cast<uint32_t>(num_bytes_to_write); |
+ num_bytes.Put(static_cast<uint32_t>(num_bytes_to_write)); |
return MOJO_RESULT_OK; |
} |