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

Commit 6958b021 authored by Ytai Ben-Tsvi's avatar Ytai Ben-Tsvi Committed by Ytai Ben-tsvi
Browse files

Fix race condition resulting in unbalanced wakelock calls

Because we release the lock during threadLoop(), we might actually
make the queue empty more than once during a cycle, but only release
the wakelock once in the end.

This change makes sure we release once for every time we make the
queue empty, just like we acquire once for every time we make it non-
empty.

Test: No good way to repro. Will submit and wait for the power monitor
      results.
Bug: 228012293
Change-Id: I740b438dbddb6aace41263427bde95f902ed25a0
parent 83302867
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1938,12 +1938,16 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
    while (!exitPending())
    {
        sp<AudioPolicyService> svc;
        int numTimesBecameEmpty = 0;
        while (!mAudioCommands.isEmpty() && !exitPending()) {
            nsecs_t curTime = systemTime();
            // commands are sorted by increasing time stamp: execute them from index 0 and up
            if (mAudioCommands[0]->mTime <= curTime) {
                sp<AudioCommand> command = mAudioCommands[0];
                mAudioCommands.removeAt(0);
                if (mAudioCommands.isEmpty()) {
                  ++numTimesBecameEmpty;
                }
                mLastCommand = command;

                switch (command->mCommand) {
@@ -2180,8 +2184,9 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
            }
        }

        // release delayed commands wake lock if the queue is empty
        if (mAudioCommands.isEmpty()) {
        // release delayed commands wake lock as many times as we made the  queue is
        // empty during popping.
        while (numTimesBecameEmpty--) {
            release_wake_lock(mName.string());
        }