| 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));
|
|
|