Index: dbus/bus.cc |
diff --git a/dbus/bus.cc b/dbus/bus.cc |
index 1c258d20b19b8949c58178f77253962b3ff74c27..e850244426da5d02280f85018568675d72837ae1 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,13 @@ bool Bus::Connect() { |
return true; |
} |
+void Bus::CloseConnection() { |
+ // dbus_connection_close is blocking call. |
+ AssertOnDBusThread(); |
+ CHECK_EQ(PRIVATE, connection_type_) << "Do not close non private connection."; |
satorux1
2013/02/15 04:25:12
Let's make it a DCHECK_EQ(). We rarely use CHECKs.
Seigo Nonaka
2013/02/15 04:36:10
Done.
|
+ dbus_connection_close(connection_); |
+} |
+ |
void Bus::ShutdownAndBlock() { |
AssertOnDBusThread(); |
@@ -418,7 +426,7 @@ void Bus::ShutdownAndBlock() { |
RemoveMatch(kDisconnectedMatchRule, error.get()); |
if (connection_type_ == PRIVATE) |
- dbus_connection_close(connection_); |
+ CloseConnection(); |
// dbus_connection_close() won't unref. |
dbus_connection_unref(connection_); |
} |
@@ -871,6 +879,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)); |