Commit 371f225c authored by satorux@chromium.org's avatar satorux@chromium.org

Delete D-Bus clients before shutting down the system bus

Previously, D-Bus clients were deleted after the system bus was
shut down. This order was not desirable because D-Bus clients
could access the system bus in their destructors, even though the
system bus was already shut down.

BUG=344270
TEST=Chrome shuts down cleanly as before
R=hashimoto@chromium.org, stevenjb@chromium.org

Review URL: https://codereview.chromium.org/166593005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@252002 0039d316-1c4b-4281-b951-d872f2087c98
parent 4e4bbaae
...@@ -53,6 +53,183 @@ namespace chromeos { ...@@ -53,6 +53,183 @@ namespace chromeos {
static DBusThreadManager* g_dbus_thread_manager = NULL; static DBusThreadManager* g_dbus_thread_manager = NULL;
static DBusThreadManager* g_dbus_thread_manager_for_testing = NULL; static DBusThreadManager* g_dbus_thread_manager_for_testing = NULL;
// The bundle of all D-Bus clients used in DBusThreadManagerImpl. The bundle
// is used to delete them at once in the right order before shutting down the
// system bus. See also the comment in the destructor of DBusThreadManagerImpl.
class DBusClientBundle {
public:
DBusClientBundle() {
DBusClientImplementationType client_type = REAL_DBUS_CLIENT_IMPLEMENTATION;
DBusClientImplementationType client_type_override = client_type;
// If --dbus-stub was requested, pass STUB to specific components;
// Many components like login are not useful with a stub implementation.
if (CommandLine::ForCurrentProcess()->HasSwitch(
chromeos::switches::kDbusStub)) {
client_type_override = STUB_DBUS_CLIENT_IMPLEMENTATION;
}
bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create());
bluetooth_agent_manager_client_.reset(
BluetoothAgentManagerClient::Create());
bluetooth_device_client_.reset(BluetoothDeviceClient::Create());
bluetooth_input_client_.reset(BluetoothInputClient::Create());
bluetooth_profile_manager_client_.reset(
BluetoothProfileManagerClient::Create());
cras_audio_client_.reset(CrasAudioClient::Create());
cros_disks_client_.reset(CrosDisksClient::Create(client_type));
cryptohome_client_.reset(CryptohomeClient::Create());
debug_daemon_client_.reset(DebugDaemonClient::Create());
shill_manager_client_.reset(ShillManagerClient::Create());
shill_device_client_.reset(ShillDeviceClient::Create());
shill_ipconfig_client_.reset(ShillIPConfigClient::Create());
shill_service_client_.reset(ShillServiceClient::Create());
shill_profile_client_.reset(ShillProfileClient::Create());
gsm_sms_client_.reset(GsmSMSClient::Create());
image_burner_client_.reset(ImageBurnerClient::Create());
introspectable_client_.reset(IntrospectableClient::Create());
modem_messaging_client_.reset(ModemMessagingClient::Create());
// Create the NFC clients in the correct order based on their dependencies.
nfc_manager_client_.reset(NfcManagerClient::Create());
nfc_adapter_client_.reset(
NfcAdapterClient::Create(nfc_manager_client_.get()));
nfc_device_client_.reset(
NfcDeviceClient::Create(nfc_adapter_client_.get()));
nfc_tag_client_.reset(NfcTagClient::Create(nfc_adapter_client_.get()));
nfc_record_client_.reset(NfcRecordClient::Create(nfc_device_client_.get(),
nfc_tag_client_.get()));
permission_broker_client_.reset(PermissionBrokerClient::Create());
power_manager_client_.reset(
PowerManagerClient::Create(client_type_override));
session_manager_client_.reset(SessionManagerClient::Create(client_type));
sms_client_.reset(SMSClient::Create());
system_clock_client_.reset(SystemClockClient::Create());
update_engine_client_.reset(UpdateEngineClient::Create(client_type));
}
BluetoothAdapterClient* bluetooth_adapter_client() {
return bluetooth_adapter_client_.get();
}
BluetoothAgentManagerClient* bluetooth_agent_manager_client() {
return bluetooth_agent_manager_client_.get();
}
BluetoothDeviceClient* bluetooth_device_client() {
return bluetooth_device_client_.get();
}
BluetoothInputClient* bluetooth_input_client() {
return bluetooth_input_client_.get();
}
BluetoothProfileManagerClient* bluetooth_profile_manager_client() {
return bluetooth_profile_manager_client_.get();
}
CrasAudioClient* cras_audio_client() {
return cras_audio_client_.get();
}
CrosDisksClient* cros_disks_client() {
return cros_disks_client_.get();
}
CryptohomeClient* cryptohome_client() {
return cryptohome_client_.get();
}
DebugDaemonClient* debug_daemon_client() {
return debug_daemon_client_.get();
}
ShillDeviceClient* shill_device_client() {
return shill_device_client_.get();
}
ShillIPConfigClient* shill_ipconfig_client() {
return shill_ipconfig_client_.get();
}
ShillManagerClient* shill_manager_client() {
return shill_manager_client_.get();
}
ShillServiceClient* shill_service_client() {
return shill_service_client_.get();
}
ShillProfileClient* shill_profile_client() {
return shill_profile_client_.get();
}
GsmSMSClient* gsm_sms_client() {
return gsm_sms_client_.get();
}
ImageBurnerClient* image_burner_client() {
return image_burner_client_.get();
}
IntrospectableClient* introspectable_client() {
return introspectable_client_.get();
}
ModemMessagingClient* modem_messaging_client() {
return modem_messaging_client_.get();
}
NfcManagerClient* nfc_manager_client() {
return nfc_manager_client_.get();
}
NfcAdapterClient* nfc_adapter_client() {
return nfc_adapter_client_.get();
}
NfcDeviceClient* nfc_device_client() {
return nfc_device_client_.get();
}
NfcTagClient* nfc_tag_client() {
return nfc_tag_client_.get();
}
NfcRecordClient* nfc_record_client() {
return nfc_record_client_.get();
}
PermissionBrokerClient* permission_broker_client() {
return permission_broker_client_.get();
}
SystemClockClient* system_clock_client() {
return system_clock_client_.get();
}
PowerManagerClient* power_manager_client() {
return power_manager_client_.get();
}
SessionManagerClient* session_manager_client() {
return session_manager_client_.get();
}
SMSClient* sms_client() {
return sms_client_.get();
}
UpdateEngineClient* update_engine_client() {
return update_engine_client_.get();
}
private:
scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_;
scoped_ptr<BluetoothAgentManagerClient> bluetooth_agent_manager_client_;
scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_;
scoped_ptr<BluetoothInputClient> bluetooth_input_client_;
scoped_ptr<BluetoothProfileManagerClient> bluetooth_profile_manager_client_;
scoped_ptr<CrasAudioClient> cras_audio_client_;
scoped_ptr<CrosDisksClient> cros_disks_client_;
scoped_ptr<CryptohomeClient> cryptohome_client_;
scoped_ptr<DebugDaemonClient> debug_daemon_client_;
scoped_ptr<ShillDeviceClient> shill_device_client_;
scoped_ptr<ShillIPConfigClient> shill_ipconfig_client_;
scoped_ptr<ShillManagerClient> shill_manager_client_;
scoped_ptr<ShillServiceClient> shill_service_client_;
scoped_ptr<ShillProfileClient> shill_profile_client_;
scoped_ptr<GsmSMSClient> gsm_sms_client_;
scoped_ptr<ImageBurnerClient> image_burner_client_;
scoped_ptr<IntrospectableClient> introspectable_client_;
scoped_ptr<ModemMessagingClient> modem_messaging_client_;
// The declaration order for NFC client objects is important. See
// DBusThreadManager::CreateDefaultClients for the dependencies.
scoped_ptr<NfcManagerClient> nfc_manager_client_;
scoped_ptr<NfcAdapterClient> nfc_adapter_client_;
scoped_ptr<NfcDeviceClient> nfc_device_client_;
scoped_ptr<NfcTagClient> nfc_tag_client_;
scoped_ptr<NfcRecordClient> nfc_record_client_;
scoped_ptr<PermissionBrokerClient> permission_broker_client_;
scoped_ptr<SystemClockClient> system_clock_client_;
scoped_ptr<PowerManagerClient> power_manager_client_;
scoped_ptr<SessionManagerClient> session_manager_client_;
scoped_ptr<SMSClient> sms_client_;
scoped_ptr<UpdateEngineClient> update_engine_client_;
DISALLOW_COPY_AND_ASSIGN(DBusClientBundle);
};
// The DBusThreadManager implementation used in production. // The DBusThreadManager implementation used in production.
class DBusThreadManagerImpl : public DBusThreadManager { class DBusThreadManagerImpl : public DBusThreadManager {
public: public:
...@@ -77,6 +254,9 @@ class DBusThreadManagerImpl : public DBusThreadManager { ...@@ -77,6 +254,9 @@ class DBusThreadManagerImpl : public DBusThreadManager {
FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_, FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_,
OnDBusThreadManagerDestroying(this)); OnDBusThreadManagerDestroying(this));
// Delete all D-Bus clients before shutting down the system bus.
client_bundle_.reset();
// Shut down the bus. During the browser shutdown, it's ok to shut down // Shut down the bus. During the browser shutdown, it's ok to shut down
// the bus synchronously. // the bus synchronously.
system_bus_->ShutdownOnDBusThreadAndBlock(); system_bus_->ShutdownOnDBusThreadAndBlock();
...@@ -101,178 +281,132 @@ class DBusThreadManagerImpl : public DBusThreadManager { ...@@ -101,178 +281,132 @@ class DBusThreadManagerImpl : public DBusThreadManager {
} }
virtual BluetoothAdapterClient* GetBluetoothAdapterClient() OVERRIDE { virtual BluetoothAdapterClient* GetBluetoothAdapterClient() OVERRIDE {
return bluetooth_adapter_client_.get(); return client_bundle_->bluetooth_adapter_client();
} }
virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient() virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient()
OVERRIDE { OVERRIDE {
return bluetooth_agent_manager_client_.get(); return client_bundle_->bluetooth_agent_manager_client();
} }
virtual BluetoothDeviceClient* GetBluetoothDeviceClient() OVERRIDE { virtual BluetoothDeviceClient* GetBluetoothDeviceClient() OVERRIDE {
return bluetooth_device_client_.get(); return client_bundle_->bluetooth_device_client();
} }
virtual BluetoothInputClient* GetBluetoothInputClient() OVERRIDE { virtual BluetoothInputClient* GetBluetoothInputClient() OVERRIDE {
return bluetooth_input_client_.get(); return client_bundle_->bluetooth_input_client();
} }
virtual BluetoothProfileManagerClient* GetBluetoothProfileManagerClient() virtual BluetoothProfileManagerClient* GetBluetoothProfileManagerClient()
OVERRIDE { OVERRIDE {
return bluetooth_profile_manager_client_.get(); return client_bundle_->bluetooth_profile_manager_client();
} }
virtual CrasAudioClient* GetCrasAudioClient() OVERRIDE { virtual CrasAudioClient* GetCrasAudioClient() OVERRIDE {
return cras_audio_client_.get(); return client_bundle_->cras_audio_client();
} }
virtual CrosDisksClient* GetCrosDisksClient() OVERRIDE { virtual CrosDisksClient* GetCrosDisksClient() OVERRIDE {
return cros_disks_client_.get(); return client_bundle_->cros_disks_client();
} }
virtual CryptohomeClient* GetCryptohomeClient() OVERRIDE { virtual CryptohomeClient* GetCryptohomeClient() OVERRIDE {
return cryptohome_client_.get(); return client_bundle_->cryptohome_client();
} }
virtual DebugDaemonClient* GetDebugDaemonClient() OVERRIDE { virtual DebugDaemonClient* GetDebugDaemonClient() OVERRIDE {
return debug_daemon_client_.get(); return client_bundle_->debug_daemon_client();
} }
virtual ShillDeviceClient* GetShillDeviceClient() OVERRIDE { virtual ShillDeviceClient* GetShillDeviceClient() OVERRIDE {
return shill_device_client_.get(); return client_bundle_->shill_device_client();
} }
virtual ShillIPConfigClient* GetShillIPConfigClient() OVERRIDE { virtual ShillIPConfigClient* GetShillIPConfigClient() OVERRIDE {
return shill_ipconfig_client_.get(); return client_bundle_->shill_ipconfig_client();
} }
virtual ShillManagerClient* GetShillManagerClient() OVERRIDE { virtual ShillManagerClient* GetShillManagerClient() OVERRIDE {
return shill_manager_client_.get(); return client_bundle_->shill_manager_client();
} }
virtual ShillServiceClient* GetShillServiceClient() OVERRIDE { virtual ShillServiceClient* GetShillServiceClient() OVERRIDE {
return shill_service_client_.get(); return client_bundle_->shill_service_client();
} }
virtual ShillProfileClient* GetShillProfileClient() OVERRIDE { virtual ShillProfileClient* GetShillProfileClient() OVERRIDE {
return shill_profile_client_.get(); return client_bundle_->shill_profile_client();
} }
virtual GsmSMSClient* GetGsmSMSClient() OVERRIDE { virtual GsmSMSClient* GetGsmSMSClient() OVERRIDE {
return gsm_sms_client_.get(); return client_bundle_->gsm_sms_client();
} }
virtual ImageBurnerClient* GetImageBurnerClient() OVERRIDE { virtual ImageBurnerClient* GetImageBurnerClient() OVERRIDE {
return image_burner_client_.get(); return client_bundle_->image_burner_client();
} }
virtual IntrospectableClient* GetIntrospectableClient() OVERRIDE { virtual IntrospectableClient* GetIntrospectableClient() OVERRIDE {
return introspectable_client_.get(); return client_bundle_->introspectable_client();
} }
virtual ModemMessagingClient* GetModemMessagingClient() OVERRIDE { virtual ModemMessagingClient* GetModemMessagingClient() OVERRIDE {
return modem_messaging_client_.get(); return client_bundle_->modem_messaging_client();
} }
virtual NfcAdapterClient* GetNfcAdapterClient() OVERRIDE { virtual NfcAdapterClient* GetNfcAdapterClient() OVERRIDE {
return nfc_adapter_client_.get(); return client_bundle_->nfc_adapter_client();
} }
virtual NfcDeviceClient* GetNfcDeviceClient() OVERRIDE { virtual NfcDeviceClient* GetNfcDeviceClient() OVERRIDE {
return nfc_device_client_.get(); return client_bundle_->nfc_device_client();
} }
virtual NfcManagerClient* GetNfcManagerClient() OVERRIDE { virtual NfcManagerClient* GetNfcManagerClient() OVERRIDE {
return nfc_manager_client_.get(); return client_bundle_->nfc_manager_client();
} }
virtual NfcRecordClient* GetNfcRecordClient() OVERRIDE { virtual NfcRecordClient* GetNfcRecordClient() OVERRIDE {
return nfc_record_client_.get(); return client_bundle_->nfc_record_client();
} }
virtual NfcTagClient* GetNfcTagClient() OVERRIDE { virtual NfcTagClient* GetNfcTagClient() OVERRIDE {
return nfc_tag_client_.get(); return client_bundle_->nfc_tag_client();
} }
virtual PermissionBrokerClient* GetPermissionBrokerClient() OVERRIDE { virtual PermissionBrokerClient* GetPermissionBrokerClient() OVERRIDE {
return permission_broker_client_.get(); return client_bundle_->permission_broker_client();
} }
virtual PowerManagerClient* GetPowerManagerClient() OVERRIDE { virtual PowerManagerClient* GetPowerManagerClient() OVERRIDE {
return power_manager_client_.get(); return client_bundle_->power_manager_client();
}
virtual PowerPolicyController* GetPowerPolicyController() OVERRIDE {
return power_policy_controller_.get();
} }
virtual SessionManagerClient* GetSessionManagerClient() OVERRIDE { virtual SessionManagerClient* GetSessionManagerClient() OVERRIDE {
return session_manager_client_.get(); return client_bundle_->session_manager_client();
} }
virtual SMSClient* GetSMSClient() OVERRIDE { virtual SMSClient* GetSMSClient() OVERRIDE {
return sms_client_.get(); return client_bundle_->sms_client();
} }
virtual SystemClockClient* GetSystemClockClient() OVERRIDE { virtual SystemClockClient* GetSystemClockClient() OVERRIDE {
return system_clock_client_.get(); return client_bundle_->system_clock_client();
} }
virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE { virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE {
return update_engine_client_.get(); return client_bundle_->update_engine_client();
}
virtual PowerPolicyController* GetPowerPolicyController() OVERRIDE {
return power_policy_controller_.get();
} }
private: private:
// Constructs all clients and stores them in the respective *_client_ member // Constructs all clients and stores them in the respective *_client_ member
// variable. // variable.
void CreateDefaultClients() { void CreateDefaultClients() {
DBusClientImplementationType client_type = REAL_DBUS_CLIENT_IMPLEMENTATION; client_bundle_.reset(new DBusClientBundle);
DBusClientImplementationType client_type_override =
REAL_DBUS_CLIENT_IMPLEMENTATION;
// If --dbus-stub was requested, pass STUB to specific components;
// Many components like login are not useful with a stub implementation.
if (CommandLine::ForCurrentProcess()->HasSwitch(
chromeos::switches::kDbusStub)) {
client_type_override = STUB_DBUS_CLIENT_IMPLEMENTATION;
}
bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create());
bluetooth_agent_manager_client_.reset(
BluetoothAgentManagerClient::Create());
bluetooth_device_client_.reset(BluetoothDeviceClient::Create());
bluetooth_input_client_.reset(BluetoothInputClient::Create());
bluetooth_profile_manager_client_.reset(
BluetoothProfileManagerClient::Create());
cras_audio_client_.reset(CrasAudioClient::Create());
cros_disks_client_.reset(CrosDisksClient::Create(client_type));
cryptohome_client_.reset(CryptohomeClient::Create());
debug_daemon_client_.reset(DebugDaemonClient::Create());
shill_manager_client_.reset(ShillManagerClient::Create());
shill_device_client_.reset(ShillDeviceClient::Create());
shill_ipconfig_client_.reset(ShillIPConfigClient::Create());
shill_service_client_.reset(ShillServiceClient::Create());
shill_profile_client_.reset(ShillProfileClient::Create());
gsm_sms_client_.reset(GsmSMSClient::Create());
image_burner_client_.reset(ImageBurnerClient::Create());
introspectable_client_.reset(IntrospectableClient::Create());
modem_messaging_client_.reset(ModemMessagingClient::Create());
// Create the NFC clients in the correct order based on their dependencies.
nfc_manager_client_.reset(NfcManagerClient::Create());
nfc_adapter_client_.reset(
NfcAdapterClient::Create(nfc_manager_client_.get()));
nfc_device_client_.reset(
NfcDeviceClient::Create(nfc_adapter_client_.get()));
nfc_tag_client_.reset(NfcTagClient::Create(nfc_adapter_client_.get()));
nfc_record_client_.reset(NfcRecordClient::Create(nfc_device_client_.get(),
nfc_tag_client_.get()));
permission_broker_client_.reset(PermissionBrokerClient::Create());
power_manager_client_.reset(
PowerManagerClient::Create(client_type_override));
session_manager_client_.reset(SessionManagerClient::Create(client_type));
sms_client_.reset(SMSClient::Create());
system_clock_client_.reset(SystemClockClient::Create());
update_engine_client_.reset(UpdateEngineClient::Create(client_type));
power_policy_controller_.reset(new PowerPolicyController); power_policy_controller_.reset(new PowerPolicyController);
} }
...@@ -282,38 +416,7 @@ class DBusThreadManagerImpl : public DBusThreadManager { ...@@ -282,38 +416,7 @@ class DBusThreadManagerImpl : public DBusThreadManager {
scoped_ptr<base::Thread> dbus_thread_; scoped_ptr<base::Thread> dbus_thread_;
scoped_refptr<dbus::Bus> system_bus_; scoped_refptr<dbus::Bus> system_bus_;
scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_; scoped_ptr<DBusClientBundle> client_bundle_;
scoped_ptr<BluetoothAgentManagerClient> bluetooth_agent_manager_client_;
scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_;
scoped_ptr<BluetoothInputClient> bluetooth_input_client_;
scoped_ptr<BluetoothProfileManagerClient> bluetooth_profile_manager_client_;
scoped_ptr<CrasAudioClient> cras_audio_client_;
scoped_ptr<CrosDisksClient> cros_disks_client_;
scoped_ptr<CryptohomeClient> cryptohome_client_;
scoped_ptr<DebugDaemonClient> debug_daemon_client_;
scoped_ptr<ShillDeviceClient> shill_device_client_;
scoped_ptr<ShillIPConfigClient> shill_ipconfig_client_;
scoped_ptr<ShillManagerClient> shill_manager_client_;
scoped_ptr<ShillServiceClient> shill_service_client_;
scoped_ptr<ShillProfileClient> shill_profile_client_;
scoped_ptr<GsmSMSClient> gsm_sms_client_;
scoped_ptr<ImageBurnerClient> image_burner_client_;
scoped_ptr<IntrospectableClient> introspectable_client_;
scoped_ptr<ModemMessagingClient> modem_messaging_client_;
// The declaration order for NFC client objects is important. See
// DBusThreadManager::CreateDefaultClients for the dependencies.
scoped_ptr<NfcManagerClient> nfc_manager_client_;
scoped_ptr<NfcAdapterClient> nfc_adapter_client_;
scoped_ptr<NfcDeviceClient> nfc_device_client_;
scoped_ptr<NfcTagClient> nfc_tag_client_;
scoped_ptr<NfcRecordClient> nfc_record_client_;
scoped_ptr<PermissionBrokerClient> permission_broker_client_;
scoped_ptr<SystemClockClient> system_clock_client_;
scoped_ptr<PowerManagerClient> power_manager_client_;
scoped_ptr<SessionManagerClient> session_manager_client_;
scoped_ptr<SMSClient> sms_client_;
scoped_ptr<UpdateEngineClient> update_engine_client_;
scoped_ptr<PowerPolicyController> power_policy_controller_; scoped_ptr<PowerPolicyController> power_policy_controller_;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment