SF: fix SurfaceFlinger crash [1/1]
PD#SWPL-144146
Problem:
SurfaceFlinger crash. The race condition was described in
b/312686113#comment4.
Solution:
during VSyncDispatchTimerQueue deconstruction
skip timerCallback to avoid sf crash
Verify:
adt4, a TV set top box.
Bug: 312686113
Test: Suspend <-> resume for over 7 days. "Skip timerCallback" showed 15 times without SF crash.
Change-Id: I3cbf0294ee70dde697cba91962477d51c1bc986e
Signed-off-by: En Liu <en.liu@amlogic.com>
diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
index ef30887..9d271dc 100644
--- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
@@ -237,6 +237,7 @@
VSyncDispatchTimerQueue::~VSyncDispatchTimerQueue() {
std::lock_guard lock(mMutex);
+ mRunning = false;
cancelTimer();
for (auto& [_, entry] : mCallbacks) {
ALOGE("Forgot to unregister a callback on VSyncDispatch!");
@@ -305,6 +306,10 @@
std::vector<Invocation> invocations;
{
std::lock_guard lock(mMutex);
+ if (!mRunning) {
+ ALOGD("TimerQueue is not running. Skipping callback.");
+ return;
+ }
auto const now = mTimeKeeper->now();
mLastTimerCallback = now;
for (auto it = mCallbacks.begin(); it != mCallbacks.end(); it++) {