Skip to content

Commit

Permalink
chromebox_for_meetings: Cleanly shutdown CfM Services
Browse files Browse the repository at this point in the history
Add a function to cleanly shutdown CfM services before DBus and other
critical services are destroyed.

Bug: b:174954521
Change-Id: I70fcc743f4129fe9aae84fcb5b6f52bc0b1a4076
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2576010
Commit-Queue: Kyle Williams <[email protected]>
Reviewed-by: Steven Bennetts <[email protected]>
Cr-Commit-Position: refs/heads/master@{#834782}
  • Loading branch information
kdgwill authored and Chromium LUCI CQ committed Dec 8, 2020
1 parent fbc5e53 commit d93bdf3
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 18 deletions.
6 changes: 6 additions & 0 deletions chrome/browser/chromeos/chrome_browser_main_chromeos.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1256,6 +1256,12 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
}
}

#if BUILDFLAG(PLATFORM_CFM)
// Cleanly shutdown all Chromebox For Meetings services before DBus and other
// critical services are destroyed
chromeos::cfm::ShutdownCfmServices();
#endif // BUILDFLAG(PLATFORM_CFM)

// Cleans up dbus services depending on ash.
dbus_services_->PreAshShutdown();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,44 @@

#include "base/bind.h"
#include "base/macros.h"
#include "chromeos/dbus/chromebox_for_meetings/cfm_hotline_client.h"
#include "mojo/public/cpp/bindings/receiver_set.h"

namespace chromeos {
namespace cfm {

CfmBrowserService::CfmBrowserService()
: service_adaptor_(mojom::CfmBrowser::Name_, this) {
receivers_.set_disconnect_handler(base::BindRepeating(
&CfmBrowserService::OnMojoDisconnect, base::Unretained(this)));
namespace {
static CfmBrowserService* g_browser_service = nullptr;
} // namespace

// static
void CfmBrowserService::Initialize() {
CHECK(!g_browser_service);
g_browser_service = new CfmBrowserService();
}

CfmBrowserService::~CfmBrowserService() = default;
// static
void CfmBrowserService::Shutdown() {
CHECK(g_browser_service);
delete g_browser_service;
g_browser_service = nullptr;
}

// static
CfmBrowserService* CfmBrowserService::Get() {
CHECK(g_browser_service)
<< "CfmBrowserService::Get() called before Initialize()";
return g_browser_service;
}

bool CfmBrowserService::ServiceRequestReceived(const std::string& service_id) {
if (service_id != mojom::CfmBrowser::Name_) {
// static
bool CfmBrowserService::IsInitialized() {
return g_browser_service;
}

bool CfmBrowserService::ServiceRequestReceived(
const std::string& interface_name) {
if (interface_name != mojom::CfmBrowser::Name_) {
return false;
}
service_adaptor_.BindServiceAdaptor();
Expand All @@ -43,10 +66,18 @@ void CfmBrowserService::OnMojoDisconnect() {
VLOG(3) << "mojom::CfmBrowser disconnected";
}

CfmBrowserService* CfmBrowserService::GetInstance() {
static base::NoDestructor<CfmBrowserService> cfm_browser_service;
// Private methods

CfmBrowserService::CfmBrowserService()
: service_adaptor_(mojom::CfmBrowser::Name_, this) {
CfmHotlineClient::Get()->AddObserver(this);

receivers_.set_disconnect_handler(base::BindRepeating(
&CfmBrowserService::OnMojoDisconnect, base::Unretained(this)));
}

return cfm_browser_service.get();
CfmBrowserService::~CfmBrowserService() {
CfmHotlineClient::Get()->RemoveObserver(this);
}

} // namespace cfm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
#define CHROME_BROWSER_CHROMEOS_CHROMEBOX_FOR_MEETINGS_BROWSER_CFM_BROWSER_SERVICE_H_

#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
#include "chrome/browser/chromeos/chromebox_for_meetings/service_adaptor.h"
#include "chromeos/dbus/chromebox_for_meetings/cfm_observer.h"
#include "chromeos/services/chromebox_for_meetings/public/mojom/cfm_browser.mojom.h"
Expand All @@ -24,15 +23,14 @@ class CfmBrowserService : public CfmObserver,
public:
CfmBrowserService(const CfmBrowserService&) = delete;
CfmBrowserService& operator=(const CfmBrowserService&) = delete;
~CfmBrowserService() override;

// Returns the global instance
static CfmBrowserService* GetInstance();
// Manage singleton instance.
static void Initialize();
static void Shutdown();
static CfmBrowserService* Get();
static bool IsInitialized();

protected:
friend class base::NoDestructor<CfmBrowserService>;
CfmBrowserService();

// Forward |CfmObserver| implementation
bool ServiceRequestReceived(const std::string& interface_name) override;

Expand All @@ -46,6 +44,9 @@ class CfmBrowserService : public CfmObserver,
virtual void OnMojoDisconnect();

private:
CfmBrowserService();
~CfmBrowserService() override;

ServiceAdaptor service_adaptor_;
mojo::ReceiverSet<mojom::CfmBrowser> receivers_;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,15 @@ void InitializeCfmServices() {
return;
}

CfmHotlineClient::Get()->AddObserver(CfmBrowserService::GetInstance());
CfmBrowserService::Initialize();
}

void ShutdownCfmServices() {
if (!features::IsCfmMojoEnabled() || !CfmHotlineClient::Get()) {
return;
}

CfmBrowserService::Shutdown();
}

} // namespace cfm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ namespace cfm {
// |CfmServiceContext| granting hotline access to services.
void InitializeCfmServices();

// Removes the observers for service interface requests by the
// |CfmServiceContext| removing hotline access to services.
void ShutdownCfmServices();

} // namespace cfm
} // namespace chromeos

Expand Down

0 comments on commit d93bdf3

Please sign in to comment.