Add MessageLoop::QuitNow and use it to terminate a sync IPC.

This is a test to observe the performance impact of this change.
As such, I'm reverting r39518 as part of this change.

R=jam
BUG=36310
TEST=none

Review URL: http://codereview.chromium.org/652089

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39699 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 781a7edbdb3288b237acbeff4926b47b243cef17
diff --git a/base/message_loop.cc b/base/message_loop.cc
index dbe780a..6a73124 100644
--- a/base/message_loop.cc
+++ b/base/message_loop.cc
@@ -233,6 +233,15 @@
   }
 }
 
+void MessageLoop::QuitNow() {
+  DCHECK(current() == this);
+  if (state_) {
+    pump_->Quit();
+  } else {
+    NOTREACHED() << "Must be inside Run to call Quit";
+  }
+}
+
 void MessageLoop::PostTask(
     const tracked_objects::Location& from_here, Task* task) {
   PostTask_Helper(from_here, task, 0, true);
diff --git a/base/message_loop.h b/base/message_loop.h
index 0338963..1a04323 100644
--- a/base/message_loop.h
+++ b/base/message_loop.h
@@ -158,6 +158,10 @@
   //
   void Quit();
 
+  // This method is a variant of Quit, that does not wait for pending messages
+  // to be processed before returning from Run.
+  void QuitNow();
+
   // Invokes Quit on the current MessageLoop when run.  Useful to schedule an
   // arbitrary MessageLoop to Quit.
   class QuitTask : public Task {
diff --git a/ipc/ipc_sync_channel.cc b/ipc/ipc_sync_channel.cc
index 3aa7a26..bb0a245 100644
--- a/ipc/ipc_sync_channel.cc
+++ b/ipc/ipc_sync_channel.cc
@@ -350,7 +350,7 @@
   } else {
     // We got the reply, timed out or the process shutdown.
     DCHECK(event == GetSendDoneEvent());
-    MessageLoop::current()->Quit();
+    MessageLoop::current()->QuitNow();
   }
 }