| Index: mojo/public/cpp/bindings/lib/sync_handle_registry.cc
|
| diff --git a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
|
| index 7619bfae13b03c814f196c36d329c941494a7740..fd3df396ece35544701e06a72c90b2b769a61202 100644
|
| --- a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
|
| +++ b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
|
| @@ -55,8 +55,26 @@ void SyncHandleRegistry::UnregisterHandle(const Handle& handle) {
|
| handles_.erase(handle);
|
| }
|
|
|
| -bool SyncHandleRegistry::WatchAllHandles(const bool* should_stop[],
|
| - size_t count) {
|
| +bool SyncHandleRegistry::RegisterEvent(base::WaitableEvent* event,
|
| + const base::Closure& callback) {
|
| + auto result = events_.insert({event, callback});
|
| + DCHECK(result.second);
|
| + MojoResult rv = wait_set_.AddEvent(event);
|
| + if (rv == MOJO_RESULT_OK)
|
| + return true;
|
| + DCHECK_EQ(MOJO_RESULT_ALREADY_EXISTS, rv);
|
| + return false;
|
| +}
|
| +
|
| +void SyncHandleRegistry::UnregisterEvent(base::WaitableEvent* event) {
|
| + auto it = events_.find(event);
|
| + DCHECK(it != events_.end());
|
| + events_.erase(it);
|
| + MojoResult rv = wait_set_.RemoveEvent(event);
|
| + DCHECK_EQ(MOJO_RESULT_OK, rv);
|
| +}
|
| +
|
| +bool SyncHandleRegistry::Wait(const bool* should_stop[], size_t count) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| size_t num_ready_handles;
|
| @@ -71,12 +89,21 @@ bool SyncHandleRegistry::WatchAllHandles(const bool* should_stop[],
|
|
|
| // TODO(yzshen): Theoretically it can reduce sync call re-entrancy if we
|
| // give priority to the handle that is waiting for sync response.
|
| + base::WaitableEvent* ready_event = nullptr;
|
| num_ready_handles = 1;
|
| - wait_set_.Wait(&num_ready_handles, &ready_handle, &ready_handle_result);
|
| - DCHECK_EQ(1u, num_ready_handles);
|
| -
|
| - const auto iter = handles_.find(ready_handle);
|
| - iter->second.Run(ready_handle_result);
|
| + wait_set_.Wait(&ready_event, &num_ready_handles, &ready_handle,
|
| + &ready_handle_result);
|
| + if (num_ready_handles) {
|
| + DCHECK_EQ(1u, num_ready_handles);
|
| + const auto iter = handles_.find(ready_handle);
|
| + iter->second.Run(ready_handle_result);
|
| + }
|
| +
|
| + if (ready_event) {
|
| + const auto iter = events_.find(ready_event);
|
| + DCHECK(iter != events_.end());
|
| + iter->second.Run();
|
| + }
|
| };
|
|
|
| return false;
|
|
|