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.