summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-26 19:29:55 +0000
committerviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-26 19:29:55 +0000
commitc58c744ce4171fcaa4812fc882348bf0b0666a81 (patch)
tree0aca683b0721078a9d248ed0e1469b234ee42437
parentb1480c5d328b24830325a62088f92404fef47113 (diff)
downloadchromium_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.cc3
-rw-r--r--mojo/system/core_test_base.cc4
-rw-r--r--mojo/system/data_pipe.cc15
-rw-r--r--mojo/system/data_pipe.h16
-rw-r--r--mojo/system/data_pipe_producer_dispatcher.cc10
-rw-r--r--mojo/system/data_pipe_producer_dispatcher.h4
-rw-r--r--mojo/system/dispatcher.cc8
-rw-r--r--mojo/system/dispatcher.h8
-rw-r--r--mojo/system/dispatcher_unittest.cc8
-rw-r--r--mojo/system/local_data_pipe.cc31
-rw-r--r--mojo/system/local_data_pipe.h8
-rw-r--r--mojo/system/local_data_pipe_unittest.cc113
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;