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

Commit 134266b6 authored by Alec Mouri's avatar Alec Mouri
Browse files

[AChoreographer] Resolves a deadlock

This deadlock could occur when posting a delayed frame callback while a
pending refresh rate callback had not yet been processed by the looper
thread. Resolve the deadlock by releasing the lock in
Choreographer::scheduleCallbacks once the earliest dueTime is retrieved.

Bug: 150731776
Test: ChoreographerNativeTest
Change-Id: I9e1ace12beb4bbc75af0671ddf1b1653d04c9df4
parent 1c7bc86a
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -185,9 +185,18 @@ void Choreographer::unregisterRefreshRateCallback(AChoreographer_refreshRateCall
}

void Choreographer::scheduleCallbacks() {
    const nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
    nsecs_t dueTime;
    {
        AutoMutex _{mLock};
    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
    if (mFrameCallbacks.top().dueTime <= now) {
        // If there are no pending callbacks then don't schedule a vsync
        if (mFrameCallbacks.empty()) {
            return;
        }
        dueTime = mFrameCallbacks.top().dueTime;
    }

    if (dueTime <= now) {
        ALOGV("choreographer %p ~ scheduling vsync", this);
        scheduleVsync();
        return;