diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-26 19:29:55 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-26 19:29:55 +0000 |
commit | c58c744ce4171fcaa4812fc882348bf0b0666a81 (patch) | |
tree | 0aca683b0721078a9d248ed0e1469b234ee42437 | |
parent | b1480c5d328b24830325a62088f92404fef47113 (diff) | |
download | chromium_src-c58c744ce4171fcaa4812fc882348bf0b0666a81.zip chromium_src-c58c744ce4171fcaa4812fc882348bf0b0666a81.tar.gz chromium_src-c58c744ce4171fcaa4812fc882348bf0b0666a81.tar.bz2 |
Convert WriteData...() to use the new user pointer handling (see r285350).
R=darin@chromium.org
Review URL: https://codereview.chromium.org/423583002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285782 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | mojo/system/core.cc | 3 | ||||
-rw-r--r-- | mojo/system/core_test_base.cc | 4 | ||||
-rw-r--r-- | mojo/system/data_pipe.cc | 15 | ||||
-rw-r--r-- | mojo/system/data_pipe.h | 16 | ||||
-rw-r--r-- | mojo/system/data_pipe_producer_dispatcher.cc | 10 | ||||
-rw-r--r-- | mojo/system/data_pipe_producer_dispatcher.h | 4 | ||||
-rw-r--r-- | mojo/system/dispatcher.cc | 8 | ||||
-rw-r--r-- | mojo/system/dispatcher.h | 8 | ||||
-rw-r--r-- | mojo/system/dispatcher_unittest.cc | 8 | ||||
-rw-r--r-- | mojo/system/local_data_pipe.cc | 31 | ||||
-rw-r--r-- | mojo/system/local_data_pipe.h | 8 | ||||
-rw-r--r-- | mojo/system/local_data_pipe_unittest.cc | 113 |
12 files changed, 141 insertions, 87 deletions
diff --git a/mojo/system/core.cc b/mojo/system/core.cc index 66278cc..8899434 100644 --- a/mojo/system/core.cc +++ b/mojo/system/core.cc @@ -360,8 +360,7 @@ MojoResult Core::WriteData(MojoHandle data_pipe_producer_handle, if (!dispatcher) return MOJO_RESULT_INVALID_ARGUMENT; - return dispatcher->WriteData(elements.GetPointerUnsafe(), - num_bytes.GetPointerUnsafe(), flags); + return dispatcher->WriteData(elements, num_bytes, flags); } MojoResult Core::BeginWriteData(MojoHandle data_pipe_producer_handle, diff --git a/mojo/system/core_test_base.cc b/mojo/system/core_test_base.cc index 5e407b0..f0293f7 100644 --- a/mojo/system/core_test_base.cc +++ b/mojo/system/core_test_base.cc @@ -84,8 +84,8 @@ class MockDispatcher : public Dispatcher { } virtual MojoResult WriteDataImplNoLock( - const void* /*elements*/, - uint32_t* /*num_bytes*/, + UserPointer<const void> /*elements*/, + UserPointer<uint32_t> /*num_bytes*/, MojoWriteDataFlags /*flags*/) OVERRIDE { info_->IncrementWriteDataCallCount(); lock().AssertAcquired(); diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc index 7b7a0d3..b0b350f 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); diff --git a/mojo/system/data_pipe.h b/mojo/system/data_pipe.h index d2bdf0d..0cdaad8 100644 --- a/mojo/system/data_pipe.h +++ b/mojo/system/data_pipe.h @@ -50,10 +50,8 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipe : // corresponding names. void ProducerCancelAllWaiters(); void ProducerClose(); - // This does not validate its arguments, except to check that |*num_bytes| is - // a multiple of |element_num_bytes_|. - MojoResult ProducerWriteData(const void* elements, - uint32_t* num_bytes, + MojoResult ProducerWriteData(UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, bool all_or_none); MojoResult ProducerBeginWriteData(UserPointer<void*> buffer, UserPointer<uint32_t> buffer_num_bytes, @@ -96,10 +94,12 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipe : virtual ~DataPipe(); virtual void ProducerCloseImplNoLock() = 0; - // |*num_bytes| will be a nonzero multiple of |element_num_bytes_|. - virtual MojoResult ProducerWriteDataImplNoLock(const void* elements, - uint32_t* num_bytes, - bool all_or_none) = 0; + // |num_bytes.Get()| will be a nonzero multiple of |element_num_bytes_|. + virtual MojoResult ProducerWriteDataImplNoLock( + UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, + uint32_t max_num_bytes_to_write, + uint32_t min_num_bytes_to_write) = 0; virtual MojoResult ProducerBeginWriteDataImplNoLock( UserPointer<void*> buffer, UserPointer<uint32_t> buffer_num_bytes, diff --git a/mojo/system/data_pipe_producer_dispatcher.cc b/mojo/system/data_pipe_producer_dispatcher.cc index b54f2d2..57f0ed6 100644 --- a/mojo/system/data_pipe_producer_dispatcher.cc +++ b/mojo/system/data_pipe_producer_dispatcher.cc @@ -51,16 +51,10 @@ DataPipeProducerDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { } MojoResult DataPipeProducerDispatcher::WriteDataImplNoLock( - const void* elements, - uint32_t* num_bytes, + UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, MojoWriteDataFlags flags) { lock().AssertAcquired(); - - if (!VerifyUserPointer<uint32_t>(num_bytes)) - return MOJO_RESULT_INVALID_ARGUMENT; - if (!VerifyUserPointerWithSize<1>(elements, *num_bytes)) - return MOJO_RESULT_INVALID_ARGUMENT; - return data_pipe_->ProducerWriteData( elements, num_bytes, (flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); } diff --git a/mojo/system/data_pipe_producer_dispatcher.h b/mojo/system/data_pipe_producer_dispatcher.h index 3aaf1f0..9b7b375 100644 --- a/mojo/system/data_pipe_producer_dispatcher.h +++ b/mojo/system/data_pipe_producer_dispatcher.h @@ -37,8 +37,8 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher : public Dispatcher { virtual void CloseImplNoLock() OVERRIDE; virtual scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() OVERRIDE; - virtual MojoResult WriteDataImplNoLock(const void* elements, - uint32_t* num_bytes, + virtual MojoResult WriteDataImplNoLock(UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, MojoWriteDataFlags flags) OVERRIDE; virtual MojoResult BeginWriteDataImplNoLock( UserPointer<void*> buffer, diff --git a/mojo/system/dispatcher.cc b/mojo/system/dispatcher.cc index b636b37..e802dee 100644 --- a/mojo/system/dispatcher.cc +++ b/mojo/system/dispatcher.cc @@ -136,8 +136,8 @@ MojoResult Dispatcher::ReadMessage(UserPointer<void> bytes, flags); } -MojoResult Dispatcher::WriteData(const void* elements, - uint32_t* num_bytes, +MojoResult Dispatcher::WriteData(UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, MojoWriteDataFlags flags) { base::AutoLock locker(lock_); if (is_closed_) @@ -277,8 +277,8 @@ MojoResult Dispatcher::ReadMessageImplNoLock( return MOJO_RESULT_INVALID_ARGUMENT; } -MojoResult Dispatcher::WriteDataImplNoLock(const void* /*elements*/, - uint32_t* /*num_bytes*/, +MojoResult Dispatcher::WriteDataImplNoLock(UserPointer<const void> /*elements*/, + UserPointer<uint32_t> /*num_bytes*/, MojoWriteDataFlags /*flags*/) { lock_.AssertAcquired(); DCHECK(!is_closed_); diff --git a/mojo/system/dispatcher.h b/mojo/system/dispatcher.h index f00edc4..143f44e 100644 --- a/mojo/system/dispatcher.h +++ b/mojo/system/dispatcher.h @@ -92,8 +92,8 @@ class MOJO_SYSTEM_IMPL_EXPORT Dispatcher : DispatcherVector* dispatchers, uint32_t* num_dispatchers, MojoReadMessageFlags flags); - MojoResult WriteData(const void* elements, - uint32_t* elements_num_bytes, + MojoResult WriteData(UserPointer<const void> elements, + UserPointer<uint32_t> elements_num_bytes, MojoWriteDataFlags flags); MojoResult BeginWriteData(UserPointer<void*> buffer, UserPointer<uint32_t> buffer_num_bytes, @@ -222,8 +222,8 @@ class MOJO_SYSTEM_IMPL_EXPORT Dispatcher : DispatcherVector* dispatchers, uint32_t* num_dispatchers, MojoReadMessageFlags flags); - virtual MojoResult WriteDataImplNoLock(const void* elements, - uint32_t* num_bytes, + virtual MojoResult WriteDataImplNoLock(UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, MojoWriteDataFlags flags); virtual MojoResult BeginWriteDataImplNoLock( UserPointer<void*> buffer, diff --git a/mojo/system/dispatcher_unittest.cc b/mojo/system/dispatcher_unittest.cc index 6d7ead4..cd2b255 100644 --- a/mojo/system/dispatcher_unittest.cc +++ b/mojo/system/dispatcher_unittest.cc @@ -52,7 +52,8 @@ TEST(DispatcherTest, Basic) { d->ReadMessage(NullUserPointer(), NullUserPointer(), NULL, NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, - d->WriteData(NULL, NULL, MOJO_WRITE_DATA_FLAG_NONE)); + d->WriteData(NullUserPointer(), NullUserPointer(), + MOJO_WRITE_DATA_FLAG_NONE)); EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->BeginWriteData(NullUserPointer(), NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE)); @@ -83,7 +84,8 @@ TEST(DispatcherTest, Basic) { d->ReadMessage(NullUserPointer(), NullUserPointer(), NULL, NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, - d->WriteData(NULL, NULL, MOJO_WRITE_DATA_FLAG_NONE)); + d->WriteData(NullUserPointer(), NullUserPointer(), + MOJO_WRITE_DATA_FLAG_NONE)); EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->BeginWriteData(NullUserPointer(), NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE)); @@ -162,7 +164,7 @@ class ThreadSafetyStressThread : public base::SimpleThread { break; case WRITE_DATA: EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, - dispatcher_->WriteData(NULL, NULL, + dispatcher_->WriteData(NullUserPointer(), NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE)); break; case BEGIN_WRITE_DATA: diff --git a/mojo/system/local_data_pipe.cc b/mojo/system/local_data_pipe.cc index 3ad1a26..acab04c 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; } diff --git a/mojo/system/local_data_pipe.h b/mojo/system/local_data_pipe.h index 87b1e28..b63df20 100644 --- a/mojo/system/local_data_pipe.h +++ b/mojo/system/local_data_pipe.h @@ -31,9 +31,11 @@ class MOJO_SYSTEM_IMPL_EXPORT LocalDataPipe : public DataPipe { // |DataPipe| implementation: virtual void ProducerCloseImplNoLock() OVERRIDE; - virtual MojoResult ProducerWriteDataImplNoLock(const void* elements, - uint32_t* num_bytes, - bool all_or_none) OVERRIDE; + virtual MojoResult ProducerWriteDataImplNoLock( + UserPointer<const void> elements, + UserPointer<uint32_t> num_bytes, + uint32_t max_num_bytes_to_write, + uint32_t min_num_bytes_to_write) OVERRIDE; virtual MojoResult ProducerBeginWriteDataImplNoLock( UserPointer<void*> buffer, UserPointer<uint32_t> buffer_num_bytes, diff --git a/mojo/system/local_data_pipe_unittest.cc b/mojo/system/local_data_pipe_unittest.cc index b5e9da8..28727f7 100644 --- a/mojo/system/local_data_pipe_unittest.cc +++ b/mojo/system/local_data_pipe_unittest.cc @@ -136,7 +136,8 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { elements[1] = 456; num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(elements, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), false)); // It should have written everything (even without "all or none"). EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); @@ -224,7 +225,9 @@ TEST(LocalDataPipeTest, BasicProducerWaiting) { // Write two elements. int32_t elements[2] = { 123, 456 }; uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); // Adding a waiter should now succeed. @@ -299,7 +302,9 @@ TEST(LocalDataPipeTest, BasicProducerWaiting) { // Write one element. elements[0] = 123; num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); // Add a waiter. @@ -350,7 +355,8 @@ TEST(LocalDataPipeTest, BasicConsumerWaiting) { int32_t elements[2] = { 123, 456 }; uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(elements, &num_bytes, true)); + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), true)); // Should already be readable. waiter.Init(); @@ -389,7 +395,8 @@ TEST(LocalDataPipeTest, BasicConsumerWaiting) { elements[1] = -1; num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(elements, &num_bytes, true)); + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), true)); // Waiting should now succeed. EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); @@ -642,7 +649,8 @@ TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); int32_t element = 123; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(&element, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(&element), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); // Still writable (even though it's full). @@ -659,7 +667,8 @@ TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { num_bytes = static_cast<uint32_t>(sizeof(int32_t)); element = 456; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(&element, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(&element), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); // Still writable. @@ -722,7 +731,9 @@ TEST(LocalDataPipeTest, MayDiscard) { Seq(0, arraysize(buffer), buffer); // Try writing more than capacity. (This test relies on the implementation // enforcing the capacity strictly.) - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(10u * sizeof(int32_t), num_bytes); // Read half of what we wrote. @@ -742,7 +753,9 @@ TEST(LocalDataPipeTest, MayDiscard) { // Write a bit more than the space that's available. num_bytes = 8u * sizeof(int32_t); Seq(100, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(8u * sizeof(int32_t), num_bytes); // Internally, a circular buffer would now look like: // 100, 101, 102, 103, 104, 105, 106, 107, 8, 9 @@ -767,7 +780,9 @@ TEST(LocalDataPipeTest, MayDiscard) { // Write one integer. num_bytes = 1u * sizeof(int32_t); Seq(200, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(1u * sizeof(int32_t), num_bytes); // Internally, a circular buffer would now look like: // -, -, -, 103, 104, 105, 106, 107, 200, - @@ -775,7 +790,9 @@ TEST(LocalDataPipeTest, MayDiscard) { // Write five more. num_bytes = 5u * sizeof(int32_t); Seq(300, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(5u * sizeof(int32_t), num_bytes); // Internally, a circular buffer would now look like: // 301, 302, 303, 304, 104, 105, 106, 107, 200, 300 @@ -905,7 +922,8 @@ TEST(LocalDataPipeTest, AllOrNone) { int32_t buffer[100]; Seq(0, arraysize(buffer), buffer); EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, - dp->ProducerWriteData(buffer, &num_bytes, true)); + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); // Should still be empty. num_bytes = ~0u; @@ -915,7 +933,9 @@ TEST(LocalDataPipeTest, AllOrNone) { // Write some data. num_bytes = 5u * sizeof(int32_t); Seq(100, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(5u * sizeof(int32_t), num_bytes); // Half full. @@ -927,7 +947,8 @@ TEST(LocalDataPipeTest, AllOrNone) { num_bytes = 6u * sizeof(int32_t); Seq(200, arraysize(buffer), buffer); EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, - dp->ProducerWriteData(buffer, &num_bytes, true)); + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); // Try reading too much. num_bytes = 11u * sizeof(int32_t); @@ -947,13 +968,17 @@ TEST(LocalDataPipeTest, AllOrNone) { // Just a little. num_bytes = 2u * sizeof(int32_t); Seq(300, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(2u * sizeof(int32_t), num_bytes); // Just right. num_bytes = 3u * sizeof(int32_t); Seq(400, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(3u * sizeof(int32_t), num_bytes); // Exactly full. @@ -1057,18 +1082,23 @@ TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { int32_t buffer[100]; Seq(0, arraysize(buffer), buffer); EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, - dp->ProducerWriteData(buffer, &num_bytes, true)); + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); // Write some stuff. num_bytes = 5u * sizeof(int32_t); Seq(100, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(5u * sizeof(int32_t), num_bytes); // Write lots of stuff (discarding all but "104"). num_bytes = 9u * sizeof(int32_t); Seq(200, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(9u * sizeof(int32_t), num_bytes); // Read one. @@ -1110,7 +1140,9 @@ TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { // Write as much as possible. num_bytes = 10u * sizeof(int32_t); Seq(300, arraysize(buffer), buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(10u * sizeof(int32_t), num_bytes); // Read everything. @@ -1214,7 +1246,9 @@ TEST(LocalDataPipeTest, TwoPhaseAllOrNone) { num_bytes = 6u * sizeof(int32_t); int32_t buffer[100]; Seq(100, 6, buffer); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(buffer), + MakeUserPointer(&num_bytes), true)); EXPECT_EQ(6u * sizeof(int32_t), num_bytes); // We have ten. @@ -1287,7 +1321,8 @@ TEST(LocalDataPipeTest, WrapAround) { // Write 20 bytes. uint32_t num_bytes = 20u; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(&test_data[0], &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(&test_data[0]), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(20u, num_bytes); // Read 10 bytes. @@ -1315,7 +1350,8 @@ TEST(LocalDataPipeTest, WrapAround) { // 90 bytes. num_bytes = 200u; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(&test_data[20], &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(&test_data[20]), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(90u, num_bytes); // Check that a two-phase read can now only read (at most) 90 bytes. (This @@ -1368,13 +1404,15 @@ TEST(LocalDataPipeTest, CloseWriteRead) { // Write some data, so we'll have something to read. uint32_t num_bytes = kTestDataSize; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(kTestData, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(kTestData), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(kTestDataSize, num_bytes); // Write it again, so we'll have something left over. num_bytes = kTestDataSize; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(kTestData, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(kTestData), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(kTestDataSize, num_bytes); // Start two-phase write. @@ -1422,7 +1460,8 @@ TEST(LocalDataPipeTest, CloseWriteRead) { // Write some data, so we'll have something to read. uint32_t num_bytes = kTestDataSize; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(kTestData, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(kTestData), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(kTestDataSize, num_bytes); // Start two-phase write. @@ -1456,7 +1495,8 @@ TEST(LocalDataPipeTest, CloseWriteRead) { // But trying to write should result in failure. num_bytes = kTestDataSize; EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, - dp->ProducerWriteData(kTestData, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(kTestData), + MakeUserPointer(&num_bytes), false)); // As will trying to start another two-phase write. write_buffer_ptr = NULL; @@ -1493,7 +1533,8 @@ TEST(LocalDataPipeTest, CloseWriteRead) { // Write some data, so we'll have something to read. uint32_t num_bytes = kTestDataSize; EXPECT_EQ(MOJO_RESULT_OK, - dp->ProducerWriteData(kTestData, &num_bytes, false)); + dp->ProducerWriteData(UserPointer<const void>(kTestData), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(kTestDataSize, num_bytes); // Close the producer. @@ -1596,7 +1637,9 @@ TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { // Now write some data, so we'll be able to try reading. int32_t element = 123; num_bytes = 1u * sizeof(int32_t); - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(&element, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(&element), + MakeUserPointer(&num_bytes), false)); // One element available. num_bytes = 0u; @@ -1670,7 +1713,9 @@ TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { // Write some elements. char elements[2] = { 'a', 'b' }; uint32_t num_bytes = 2u; - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), false)); EXPECT_EQ(2u, num_bytes); // Begin reading. @@ -1692,7 +1737,9 @@ TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { // dp->ProducerWriteData(elements, &num_bytes, false)); // but we incorrectly think that the bytes being read are discardable. Letting // this through reveals the significant consequence. - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), false)); // Check that our read buffer hasn't changed underneath us. EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]); @@ -1702,7 +1749,9 @@ TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); // Now writing should succeed. - EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); + EXPECT_EQ(MOJO_RESULT_OK, + dp->ProducerWriteData(UserPointer<const void>(elements), + MakeUserPointer(&num_bytes), false)); // And if we read, we should get the new values. read_ptr = NULL; |