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 | 1af452f333664e8b0a61d96a9b3bb682d8b9a00f (patch) | |
tree | 47fe626c09316b14f5faa3db3553d1b6330c2c67 | |
parent | 859d22fb31792fd9c2c77fba9be3378774b2cfe9 (diff) | |
download | frameworks_av-1af452f333664e8b0a61d96a9b3bb682d8b9a00f.zip frameworks_av-1af452f333664e8b0a61d96a9b3bb682d8b9a00f.tar.gz frameworks_av-1af452f333664e8b0a61d96a9b3bb682d8b9a00f.tar.bz2 |
Automated import from //branches/master/...@140868,140868
-rw-r--r-- | include/media/mediaplayer.h | 1 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 28 |
2 files changed, 24 insertions, 5 deletions
diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 58906d1..255a67b 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -173,6 +173,7 @@ private: }; sp<IMediaPlayer> mPlayer; + thread_id_t mLockThreadId; Mutex mLock; Mutex mNotifyLock; Condition mSignal; 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) { |