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(
std::move(callback).Run(dim_deferred_);
}
void UserActivityManager::OnSessionManagerDestroyed() {
session_manager_observer_.RemoveAll();
session_manager_ = nullptr;
}
void UserActivityManager::OnSessionStateChanged() {
DCHECK(session_manager_);
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
......
......@@ -117,6 +117,7 @@ class UserActivityManager : public ui::UserActivityObserver,
UserActivityEvent::ModelPrediction prediction);
// session_manager::SessionManagerObserver overrides:
void OnSessionManagerDestroyed() override;
void OnSessionStateChanged() override;
private:
......@@ -202,7 +203,7 @@ class UserActivityManager : public ui::UserActivityObserver,
session_manager::SessionManagerObserver>
session_manager_observer_;
session_manager::SessionManager* const session_manager_;
session_manager::SessionManager* session_manager_ = nullptr;
mojo::Binding<viz::mojom::VideoDetectorObserver> binding_;
......
......@@ -24,6 +24,9 @@ SessionManager::SessionManager() {
SessionManager::~SessionManager() {
DCHECK_EQ(instance, this);
SessionManager::SetInstance(nullptr);
for (auto& observer : observers_)
observer.OnSessionManagerDestroyed();
}
// static
......
......@@ -16,6 +16,9 @@ namespace session_manager {
// http://crbug.com/657149.
class SessionManagerObserver : public base::CheckedObserver {
public:
// Inovked when session manager is destroyed.
virtual void OnSessionManagerDestroyed() {}
// Invoked when session state is changed.
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