Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a942af8a authored by Adrian Salido's avatar Adrian Salido
Browse files

SF: fix deadlock while switching resolution

Trying to grab mStateLock during kernelTimerChanged could lead to
deadlock when changing resolution as display gets recreated and the idle
timer may get stopped/re-started. The deadlock could happen when
calling OneShotTimer::stop() (due to thread join) in main thread while
kernelTimerChanged is waiting for lock.

Bug: 222755257
Test: cmd display set-user-preferred-display-mode
Change-Id: I0ccc7bccdcee98722c1dced09032ab3953d851cb
parent 57b91217
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -6063,7 +6063,6 @@ void SurfaceFlinger::kernelTimerChanged(bool expired) {
    static bool updateOverlay =
            property_get_bool("debug.sf.kernel_idle_timer_update_overlay", true);
    if (!updateOverlay) return;
    if (Mutex::Autolock lock(mStateLock); !isRefreshRateOverlayEnabled()) return;

    // Update the overlay on the main thread to avoid race conditions with
    // mRefreshRateConfigs->getCurrentRefreshRate()
@@ -6073,6 +6072,7 @@ void SurfaceFlinger::kernelTimerChanged(bool expired) {
            ALOGW("%s: default display is null", __func__);
            return;
        }
        if (!display->isRefreshRateOverlayEnabled()) return;

        const auto desiredActiveMode = display->getDesiredActiveMode();
        const std::optional<DisplayModeId> desiredModeId = desiredActiveMode