diff options
author | Andreas Huber <andih@google.com> | 2010-02-17 15:58:57 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-02-17 16:01:01 -0800 |
commit | d29345dfa29cdcc650f3705e43950ef2500f6728 (patch) | |
tree | f0ffa3b9682ced2ddd608f93bfbcd58d92fb8c61 /media/libstagefright/AwesomePlayer.cpp | |
parent | 349a733b58c3b4c656c4ddfa8cbbb06c008d3bc5 (diff) | |
download | frameworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.zip frameworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.tar.gz frameworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.tar.bz2 |
We are cancelling this event during reset, but the event may have already been dispatched at the time, blocking on the mutex. While it's blocking, reset() cancels the event, we're then unblocked and bad things(tm) happen.
related-to-bug: 2451174
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 1c9f4fd..59a5f9d 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -401,6 +401,9 @@ void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { void AwesomePlayer::onBufferingUpdate() { Mutex::Autolock autoLock(mLock); + if (!mBufferingEventPending) { + return; + } mBufferingEventPending = false; if (mDurationUs >= 0) { @@ -425,6 +428,9 @@ void AwesomePlayer::onStreamDone() { // Posted whenever any stream finishes playing. Mutex::Autolock autoLock(mLock); + if (!mStreamDoneEventPending) { + return; + } mStreamDoneEventPending = false; if (mFlags & LOOPING) { @@ -918,6 +924,12 @@ void AwesomePlayer::postCheckAudioStatusEvent_l() { void AwesomePlayer::onCheckAudioStatus() { Mutex::Autolock autoLock(mLock); + if (!mAudioStatusEventPending) { + // Event was dispatched and while we were blocking on the mutex, + // has already been cancelled. + return; + } + mAudioStatusEventPending = false; if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { |