diff options
Diffstat (limited to 'dbus/exported_object.cc')
-rw-r--r-- | dbus/exported_object.cc | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/dbus/exported_object.cc b/dbus/exported_object.cc index e4a1641..de25168 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, |