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++) {