diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-05 06:07:35 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-05 06:07:35 +0000 |
commit | eb692294cd856d59161cc4b48e453e4916bed0f9 (patch) | |
tree | 6020d859fa3ed51690b8d1c62fbc54d9a7d2cd97 /mojo/public | |
parent | a836fad35e581bc73de683bb468bef74c9984c76 (diff) | |
download | chromium_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.cc | 30 | ||||
-rw-r--r-- | mojo/public/bindings/lib/message.cc | 37 | ||||
-rw-r--r-- | mojo/public/bindings/lib/sync_dispatcher.cc | 36 | ||||
-rw-r--r-- | mojo/public/bindings/message.h | 9 |
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_ |