diff options
author | Jason Sams <> | 2009-03-24 18:45:22 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-24 18:45:22 -0700 |
commit | ebb020aebc157ff127458dc20e1d0066b86bb99d (patch) | |
tree | d03e3189e8f14e32bd3a43babe33fe972c204f80 /media/libmedia/mediaplayer.cpp | |
parent | 94574de5977332bb620ba4d037c5b6cc0b7103b3 (diff) | |
download | frameworks_base-ebb020aebc157ff127458dc20e1d0066b86bb99d.zip frameworks_base-ebb020aebc157ff127458dc20e1d0066b86bb99d.tar.gz frameworks_base-ebb020aebc157ff127458dc20e1d0066b86bb99d.tar.bz2 |
Automated import from //branches/master/...@140868,140868
Diffstat (limited to 'media/libmedia/mediaplayer.cpp')
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 6b40412..5841922 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -91,6 +91,7 @@ MediaPlayer::MediaPlayer() mLoop = false; mLeftVolume = mRightVolume = 1.0; mVideoWidth = mVideoHeight = 0; + mLockThreadId = 0; } void MediaPlayer::onFirstRef() @@ -223,16 +224,24 @@ status_t MediaPlayer::prepare() { LOGV("prepare"); Mutex::Autolock _l(mLock); - if (mPrepareSync) return -EALREADY; + mLockThreadId = getThreadId(); + if (mPrepareSync) { + mLockThreadId = 0; + return -EALREADY; + } mPrepareSync = true; status_t ret = prepareAsync_l(); - if (ret != NO_ERROR) return ret; + if (ret != NO_ERROR) { + mLockThreadId = 0; + return ret; + } if (mPrepareSync) { mSignal.wait(mLock); // wait for prepare done mPrepareSync = false; } LOGV("prepare complete - status=%d", mPrepareStatus); + mLockThreadId = 0; return mPrepareStatus; } @@ -485,14 +494,23 @@ void MediaPlayer::notify(int msg, int ext1, int ext2) { LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2); bool send = true; + bool locked = false; // TODO: In the future, we might be on the same thread if the app is // running in the same process as the media server. In that case, // this will deadlock. - mLock.lock(); + // + // The threadId hack below works around this for the care of prepare + // within the same process. + + if (mLockThreadId != getThreadId()) { + mLock.lock(); + locked = true; + } + if (mPlayer == 0) { LOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2); - mLock.unlock(); // release the lock when done. + if (locked) mLock.unlock(); // release the lock when done. return; } @@ -561,7 +579,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2) } sp<MediaPlayerListener> listener = mListener; - mLock.unlock(); + if (locked) mLock.unlock(); // this prevents re-entrant calls into client code if ((listener != 0) && send) { |