+
+ GetDBusTaskRunner()->PostTask(
+ FROM_HERE,
+ base::Bind(&Bus::RemoveObjectManagerInternal,
+ this, object_manager, callback));
+
+ return true;
+}
+
+void Bus::RemoveObjectManagerInternal(
+ scoped_refptr<dbus::ObjectManager> object_manager,
+ const base::Closure& callback) {
+ AssertOnDBusThread();
+ DCHECK(object_manager.get());
+
+ object_manager->CleanUp();
+
+ // The ObjectManager has to be deleted on the origin thread since it was
+ // created there.
+ GetOriginTaskRunner()->PostTask(
+ FROM_HERE,
+ base::Bind(&Bus::RemoveObjectManagerInternalHelper,
+ this, object_manager, callback));
+}
+
+void Bus::RemoveObjectManagerInternalHelper(
+ scoped_refptr<dbus::ObjectManager> object_manager,
+ const base::Closure& callback) {
+ AssertOnOriginThread();
+ DCHECK(object_manager.get());
+
+ // Release the object manager and run the callback.
+ object_manager = NULL;
+ callback.Run();