Reland "Mojo: Allow duplicate events in SyncHandleRegistry"
This is a reland of 327ed962ca0353e72e18a5eeeab5112d7d7058b6
Original change's description:
> Mojo: Allow duplicate events in SyncHandleRegistry
>
> Allows mulitple registrations for the same WaitableEvent in
> SyncHandleRegistry to allow for instances of independent nested waiters
> unwittingly waiting on the same event.
>
> BUG=754945
> [email protected]
>
> Change-Id: Ia166d860bf2a07a2db9dc39ae1350b8758950ff4
> Reviewed-on: https://chromium-review.googlesource.com/641402
> Reviewed-by: Yuzhu Shen <[email protected]>
> Commit-Queue: Ken Rockot <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#498246}
Bug: 754945
Change-Id: Id0296e7aac938a6a13202766da2b8cb14ea30502
Reviewed-on: https://chromium-review.googlesource.com/643487
Reviewed-by: Yuzhu Shen <[email protected]>
Commit-Queue: Ken Rockot <[email protected]>
Cr-Commit-Position: refs/heads/master@{#498665}
diff --git a/ipc/ipc_sync_channel.cc b/ipc/ipc_sync_channel.cc
index 16a6878..dd636b5 100644
--- a/ipc/ipc_sync_channel.cc
+++ b/ipc/ipc_sync_channel.cc
@@ -646,15 +646,14 @@
bool dispatch = false;
bool send_done = false;
bool should_pump_messages = false;
- bool registered = registry->RegisterEvent(
- context->GetSendDoneEvent(), base::Bind(&OnEventReady, &send_done));
- DCHECK(registered);
+ base::Closure on_send_done_callback = base::Bind(&OnEventReady, &send_done);
+ registry->RegisterEvent(context->GetSendDoneEvent(), on_send_done_callback);
+ base::Closure on_pump_messages_callback;
if (pump_messages_event) {
- registered = registry->RegisterEvent(
- pump_messages_event,
- base::Bind(&OnEventReady, &should_pump_messages));
- DCHECK(registered);
+ on_pump_messages_callback =
+ base::Bind(&OnEventReady, &should_pump_messages);
+ registry->RegisterEvent(pump_messages_event, on_pump_messages_callback);
}
const bool* stop_flags[] = { &dispatch, &send_done, &should_pump_messages };
@@ -662,9 +661,10 @@
registry->Wait(stop_flags, 3);
context->received_sync_msgs()->UnblockDispatch();
- registry->UnregisterEvent(context->GetSendDoneEvent());
+ registry->UnregisterEvent(context->GetSendDoneEvent(),
+ on_send_done_callback);
if (pump_messages_event)
- registry->UnregisterEvent(pump_messages_event);
+ registry->UnregisterEvent(pump_messages_event, on_pump_messages_callback);
if (dispatch) {
// We're waiting for a reply, but we received a blocking synchronous call.