Eliminate a timed wait from ExportedObject::HandleMessage().

Previouslly, we blocked in D-Bus thread until the method call is handled
in the UI thread. Turned out this was a bad idea, and caused a crash when
the UI thread is hanging (crosbug.com/21341).

This patch will eliminate the timed wait and incoming methods will be handled
completely asynchronously.

BUG=chromium-os:21341
TEST=run dbus_unittests under valgrind


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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104497 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/dbus/exported_object.h b/dbus/exported_object.h
index a6edb97a..24456f7a 100644
--- a/dbus/exported_object.h
+++ b/dbus/exported_object.h
@@ -123,7 +123,14 @@
 
   // Runs the method. Helper function for HandleMessage().
   void RunMethod(MethodCallCallback method_call_callback,
-                 MethodCall* method_call);
+                 MethodCall* method_call,
+                 base::TimeTicks start_time);
+
+  // Called on completion of the method run from RunMethod().
+  // Takes ownership of |method_call| and |response|.
+  void OnMethodCompleted(MethodCall* method_call,
+                         Response* response,
+                         base::TimeTicks start_time);
 
   // Called when the object is unregistered.
   void OnUnregistered(DBusConnection* connection);
@@ -141,8 +148,6 @@
   std::string service_name_;
   std::string object_path_;
   bool object_is_registered_;
-  dbus::Response* response_from_method_;
-  base::WaitableEvent on_method_is_called_;
 
   // The method table where keys are absolute method names (i.e. interface
   // name + method name), and values are the corresponding callbacks.