Index: dbus/bus.cc |
diff --git a/dbus/bus.cc b/dbus/bus.cc |
index 1c258d20b19b8949c58178f77253962b3ff74c27..30089abaa3625b8cb403bc2e2d665e3b888db533 100644 |
--- a/dbus/bus.cc |
+++ b/dbus/bus.cc |
@@ -189,7 +189,8 @@ Bus::Bus(const Options& options) |
shutdown_completed_(false), |
num_pending_watches_(0), |
num_pending_timeouts_(0), |
- address_(options.address) { |
+ address_(options.address), |
+ on_disconnected_closure_(options.disconnected_callback) { |
// This is safe to call multiple times. |
dbus_threads_init_default(); |
// The origin message loop is unnecessary if the client uses synchronous |
@@ -373,6 +374,14 @@ bool Bus::Connect() { |
return true; |
} |
+void Bus::ClosePrivateConnection() { |
+ // dbus_connection_close is blocking call. |
+ AssertOnDBusThread(); |
+ DCHECK_EQ(PRIVATE, connection_type_) |
+ << "non-private connection should not be closed"; |
+ dbus_connection_close(connection_); |
+} |
+ |
void Bus::ShutdownAndBlock() { |
AssertOnDBusThread(); |
@@ -418,7 +427,7 @@ void Bus::ShutdownAndBlock() { |
RemoveMatch(kDisconnectedMatchRule, error.get()); |
if (connection_type_ == PRIVATE) |
- dbus_connection_close(connection_); |
+ ClosePrivateConnection(); |
// dbus_connection_close() won't unref. |
dbus_connection_unref(connection_); |
} |
@@ -871,6 +880,9 @@ void Bus::OnDispatchStatusChanged(DBusConnection* connection, |
void Bus::OnConnectionDisconnected(DBusConnection* connection) { |
AssertOnDBusThread(); |
+ if (!on_disconnected_closure_.is_null()) |
+ PostTaskToOriginThread(FROM_HERE, on_disconnected_closure_); |
+ |
if (!connection) |
return; |
DCHECK(!dbus_connection_get_is_connected(connection)); |