Commit 2c8bdfae authored by Xiyuan Xia's avatar Xiyuan Xia Committed by Commit Bot

cros: Fix ml::UserActivityManager shutdown crash

SessionManager is released in PostMainMessageLoopRun that
happens before PostDestroyThreads. ml::UserActivityManager
is released with DbusServices PostDestroyThreads. Hence it
crashes on shutdown when trying to un-observe SessionManager.

This CL adds a OnSessionManagerDestroyed to SessionManagerObserver
interface so that ml::UserActivityManager could clean up in time.

Bug: 987010
Change-Id: I05043a3e0b946bfb9e733ad476dacc35e9a9a3b6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1715401Reviewed-by: default avatarJia Meng <jiameng@chromium.org>
Commit-Queue: Xiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#680197}
parent 1356f510
...@@ -306,6 +306,11 @@ void UserActivityManager::HandleSmartDimDecision( ...@@ -306,6 +306,11 @@ void UserActivityManager::HandleSmartDimDecision(
std::move(callback).Run(dim_deferred_); std::move(callback).Run(dim_deferred_);
} }
void UserActivityManager::OnSessionManagerDestroyed() {
session_manager_observer_.RemoveAll();
session_manager_ = nullptr;
}
void UserActivityManager::OnSessionStateChanged() { void UserActivityManager::OnSessionStateChanged() {
DCHECK(session_manager_); DCHECK(session_manager_);
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
......
...@@ -117,6 +117,7 @@ class UserActivityManager : public ui::UserActivityObserver, ...@@ -117,6 +117,7 @@ class UserActivityManager : public ui::UserActivityObserver,
UserActivityEvent::ModelPrediction prediction); UserActivityEvent::ModelPrediction prediction);
// session_manager::SessionManagerObserver overrides: // session_manager::SessionManagerObserver overrides:
void OnSessionManagerDestroyed() override;
void OnSessionStateChanged() override; void OnSessionStateChanged() override;
private: private:
...@@ -202,7 +203,7 @@ class UserActivityManager : public ui::UserActivityObserver, ...@@ -202,7 +203,7 @@ class UserActivityManager : public ui::UserActivityObserver,
session_manager::SessionManagerObserver> session_manager::SessionManagerObserver>
session_manager_observer_; session_manager_observer_;
session_manager::SessionManager* const session_manager_; session_manager::SessionManager* session_manager_ = nullptr;
mojo::Binding<viz::mojom::VideoDetectorObserver> binding_; mojo::Binding<viz::mojom::VideoDetectorObserver> binding_;
......
...@@ -24,6 +24,9 @@ SessionManager::SessionManager() { ...@@ -24,6 +24,9 @@ SessionManager::SessionManager() {
SessionManager::~SessionManager() { SessionManager::~SessionManager() {
DCHECK_EQ(instance, this); DCHECK_EQ(instance, this);
SessionManager::SetInstance(nullptr); SessionManager::SetInstance(nullptr);
for (auto& observer : observers_)
observer.OnSessionManagerDestroyed();
} }
// static // static
......
...@@ -16,6 +16,9 @@ namespace session_manager { ...@@ -16,6 +16,9 @@ namespace session_manager {
// http://crbug.com/657149. // http://crbug.com/657149.
class SessionManagerObserver : public base::CheckedObserver { class SessionManagerObserver : public base::CheckedObserver {
public: public:
// Inovked when session manager is destroyed.
virtual void OnSessionManagerDestroyed() {}
// Invoked when session state is changed. // Invoked when session state is changed.
virtual void OnSessionStateChanged() {} virtual void OnSessionStateChanged() {}
......
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