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

Commit e2f8b60e authored by zhenjun.zhang's avatar zhenjun.zhang Committed by Andy Hung
Browse files

AudioTrack: Fix Java offload blocking in AudioTrack::write

With Java offload support, both the AudioTrack::write() and the
AudioTrackThread obtainBuffer/waitStreamEndDone can be blocked
on the AudioTrackShared Proxy futex.

Prior to the Java offload support, AudioTrack::write() was not
called simultaneous to the AudioTrackThread
obtainBuffer/waitStreamEndDone, thus only one thread was
blocked on the futex.

Solution: Change the FUTEX_WAKE to wake more than one thread

Test: invoke android.media.cts.AudioTrackOffloadTest#testMP3AudioTrackOffload
repeatly, check if the case may blocked in AudioTrack::write (syscall)
Bug: 209612569
Change-Id: I40d531863486f66e65c2bfe7d8e00156c804232d
parent fe5ce1bd
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ void ClientProxy::binderDied()
        android_atomic_or(CBLK_FUTEX_WAKE, &cblk->mFutex);
        // it seems that a FUTEX_WAKE_PRIVATE will not wake a FUTEX_WAIT, even within same process
        (void) syscall(__NR_futex, &cblk->mFutex, mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE,
                1);
                INT_MAX);
    }
}

@@ -419,7 +419,7 @@ void ClientProxy::interrupt()
    if (!(android_atomic_or(CBLK_INTERRUPT, &cblk->mFlags) & CBLK_INTERRUPT)) {
        android_atomic_or(CBLK_FUTEX_WAKE, &cblk->mFutex);
        (void) syscall(__NR_futex, &cblk->mFutex, mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE,
                1);
                INT_MAX);
    }
}

@@ -747,7 +747,7 @@ void ServerProxy::flushBufferIfNeeded()
            int32_t old = android_atomic_or(CBLK_FUTEX_WAKE, &cblk->mFutex);
            if (!(old & CBLK_FUTEX_WAKE)) {
                (void) syscall(__NR_futex, &cblk->mFutex,
                        mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE, 1);
                        mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE, INT_MAX);
            }
        }
        mFlushed += (newFront - front) & mask;
@@ -917,7 +917,7 @@ void ServerProxy::releaseBuffer(Buffer* buffer)
        int32_t old = android_atomic_or(CBLK_FUTEX_WAKE, &cblk->mFutex);
        if (!(old & CBLK_FUTEX_WAKE)) {
            (void) syscall(__NR_futex, &cblk->mFutex,
                    mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE, 1);
                    mClientInServer ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE, INT_MAX);
        }
    }