summaryrefslogtreecommitdiffstats
path: root/mojo/public
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-05 06:07:35 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-05 06:07:35 +0000
commiteb692294cd856d59161cc4b48e453e4916bed0f9 (patch)
tree6020d859fa3ed51690b8d1c62fbc54d9a7d2cd97 /mojo/public
parenta836fad35e581bc73de683bb468bef74c9984c76 (diff)
downloadchromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.zip
chromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.tar.gz
chromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.tar.bz2
Mojo: share code between SyncDispatcher and Connector
R=piman@chromium.org Review URL: https://codereview.chromium.org/185723003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254952 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/public')
-rw-r--r--mojo/public/bindings/lib/connector.cc30
-rw-r--r--mojo/public/bindings/lib/message.cc37
-rw-r--r--mojo/public/bindings/lib/sync_dispatcher.cc36
-rw-r--r--mojo/public/bindings/message.h9
4 files changed, 55 insertions, 57 deletions
diff --git a/mojo/public/bindings/lib/connector.cc b/mojo/public/bindings/lib/connector.cc
index 076e30b..ccdee5c 100644
--- a/mojo/public/bindings/lib/connector.cc
+++ b/mojo/public/bindings/lib/connector.cc
@@ -107,44 +107,18 @@ void Connector::WaitToReadMore() {
}
void Connector::ReadMore() {
- for (;;) {
+ while (true) {
MojoResult rv;
- uint32_t num_bytes = 0, num_handles = 0;
- rv = ReadMessageRaw(message_pipe_.get(),
- NULL,
- &num_bytes,
- NULL,
- &num_handles,
- MOJO_READ_MESSAGE_FLAG_NONE);
+ rv = ReadAndDispatchMessage(message_pipe_.get(), incoming_receiver_, NULL);
if (rv == MOJO_RESULT_SHOULD_WAIT) {
WaitToReadMore();
break;
}
- if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED) {
- error_ = true;
- break;
- }
-
- Message message;
- message.AllocUninitializedData(num_bytes);
- message.mutable_handles()->resize(num_handles);
-
- rv = ReadMessageRaw(
- message_pipe_.get(),
- message.mutable_data(),
- &num_bytes,
- message.mutable_handles()->empty() ? NULL :
- reinterpret_cast<MojoHandle*>(&message.mutable_handles()->front()),
- &num_handles,
- MOJO_READ_MESSAGE_FLAG_NONE);
if (rv != MOJO_RESULT_OK) {
error_ = true;
break;
}
-
- if (incoming_receiver_)
- incoming_receiver_->Accept(&message);
}
}
diff --git a/mojo/public/bindings/lib/message.cc b/mojo/public/bindings/lib/message.cc
index f33f250a..b57061d 100644
--- a/mojo/public/bindings/lib/message.cc
+++ b/mojo/public/bindings/lib/message.cc
@@ -44,4 +44,41 @@ void Message::Swap(Message* other) {
std::swap(handles_, other->handles_);
}
+MojoResult ReadAndDispatchMessage(MessagePipeHandle handle,
+ MessageReceiver* receiver,
+ bool* receiver_result) {
+ MojoResult rv;
+
+ uint32_t num_bytes = 0, num_handles = 0;
+ rv = ReadMessageRaw(handle,
+ NULL,
+ &num_bytes,
+ NULL,
+ &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED)
+ return rv;
+
+ Message message;
+ message.AllocUninitializedData(num_bytes);
+ message.mutable_handles()->resize(num_handles);
+
+ rv = ReadMessageRaw(handle,
+ message.mutable_data(),
+ &num_bytes,
+ message.mutable_handles()->empty()
+ ? NULL
+ : reinterpret_cast<MojoHandle*>(
+ &message.mutable_handles()->front()),
+ &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (receiver && rv == MOJO_RESULT_OK) {
+ bool result = receiver->Accept(&message);
+ if (receiver_result)
+ *receiver_result = result;
+ }
+
+ return rv;
+}
+
} // namespace mojo
diff --git a/mojo/public/bindings/lib/sync_dispatcher.cc b/mojo/public/bindings/lib/sync_dispatcher.cc
index f27fc17..4c3c6d6 100644
--- a/mojo/public/bindings/lib/sync_dispatcher.cc
+++ b/mojo/public/bindings/lib/sync_dispatcher.cc
@@ -11,39 +11,17 @@
namespace mojo {
bool WaitForMessageAndDispatch(MessagePipeHandle handle,
- mojo::MessageReceiver* receiver) {
- uint32_t num_bytes = 0, num_handles = 0;
+ MessageReceiver* receiver) {
while (true) {
- MojoResult rv = ReadMessageRaw(handle,
- NULL,
- &num_bytes,
- NULL,
- &num_handles,
- MOJO_READ_MESSAGE_FLAG_NONE);
- if (rv == MOJO_RESULT_RESOURCE_EXHAUSTED)
- break;
- if (rv != MOJO_RESULT_SHOULD_WAIT)
- return false;
- rv = Wait(handle, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE);
+ bool result;
+ MojoResult rv = ReadAndDispatchMessage(handle, receiver, &result);
+ if (rv == MOJO_RESULT_OK)
+ return result;
+ if (rv == MOJO_RESULT_SHOULD_WAIT)
+ rv = Wait(handle, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE);
if (rv != MOJO_RESULT_OK)
return false;
}
-
- Message message;
- message.AllocUninitializedData(num_bytes);
- message.mutable_handles()->resize(num_handles);
-
- MojoResult rv = ReadMessageRaw(
- handle,
- message.mutable_data(),
- &num_bytes,
- message.mutable_handles()->empty() ? NULL :
- reinterpret_cast<MojoHandle*>(&message.mutable_handles()->front()),
- &num_handles,
- MOJO_READ_MESSAGE_FLAG_NONE);
- if (rv != MOJO_RESULT_OK)
- return false;
- return receiver->Accept(&message);
}
} // namespace mojo
diff --git a/mojo/public/bindings/message.h b/mojo/public/bindings/message.h
index 7b058b8..3198f459 100644
--- a/mojo/public/bindings/message.h
+++ b/mojo/public/bindings/message.h
@@ -79,6 +79,15 @@ class MessageReceiver {
MessageReceiver* responder) = 0;
};
+// Read a single message from the pipe and dispatch to the given receiver. The
+// receiver may be null, in which case the message is simply discarded.
+// Returns MOJO_RESULT_SHOULD_WAIT if the caller should wait on the handle to
+// become readable. Returns MOJO_RESULT_OK if a message was dispatched and
+// otherwise returns an error code if something went wrong.
+MojoResult ReadAndDispatchMessage(MessagePipeHandle handle,
+ MessageReceiver* receiver,
+ bool* receiver_result);
+
} // namespace mojo
#endif // MOJO_PUBLIC_BINDINGS_MESSAGE_H_