Index: dbus/exported_object.cc |
diff --git a/dbus/exported_object.cc b/dbus/exported_object.cc |
index e4a1641fa6e5ee67692bd383da896237e07a139c..de2516841420e75de4e3abbe7f4adf0edf57aa3d 100644 |
--- a/dbus/exported_object.cc |
+++ b/dbus/exported_object.cc |
@@ -224,12 +224,13 @@ DBusHandlerResult ExportedObject::HandleMessage( |
method_call.release(), |
start_time)); |
} else { |
- // If the D-Bus thread is not used, just call the method directly. We |
- // don't need the complicated logic to wait for the method call to be |
- // complete. |
- // |response| will be deleted in OnMethodCompleted(). |
- Response* response = iter->second.Run(method_call.get()); |
- OnMethodCompleted(method_call.release(), response, start_time); |
+ // If the D-Bus thread is not used, just call the method directly. |
+ MethodCall* released_method_call = method_call.release(); |
+ iter->second.Run(released_method_call, |
+ base::Bind(&ExportedObject::SendResponse, |
+ this, |
+ start_time, |
+ released_method_call)); |
} |
// It's valid to say HANDLED here, and send a method response at a later |
@@ -241,14 +242,27 @@ void ExportedObject::RunMethod(MethodCallCallback method_call_callback, |
MethodCall* method_call, |
base::TimeTicks start_time) { |
bus_->AssertOnOriginThread(); |
+ method_call_callback.Run(method_call, |
+ base::Bind(&ExportedObject::SendResponse, |
+ this, |
+ start_time, |
+ method_call)); |
+} |
- Response* response = method_call_callback.Run(method_call); |
- bus_->PostTaskToDBusThread(FROM_HERE, |
- base::Bind(&ExportedObject::OnMethodCompleted, |
- this, |
- method_call, |
- response, |
- start_time)); |
+void ExportedObject::SendResponse(base::TimeTicks start_time, |
+ MethodCall* method_call, |
+ Response* response) { |
+ DCHECK(method_call); |
+ if (bus_->HasDBusThread()) { |
+ bus_->PostTaskToDBusThread(FROM_HERE, |
+ base::Bind(&ExportedObject::OnMethodCompleted, |
+ this, |
+ method_call, |
+ response, |
+ start_time)); |
+ } else { |
+ OnMethodCompleted(method_call, response, start_time); |
+ } |
} |
void ExportedObject::OnMethodCompleted(MethodCall* method_call, |