summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Sams <>2009-03-24 18:45:22 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-24 18:45:22 -0700
commit1af452f333664e8b0a61d96a9b3bb682d8b9a00f (patch)
tree47fe626c09316b14f5faa3db3553d1b6330c2c67
parent859d22fb31792fd9c2c77fba9be3378774b2cfe9 (diff)
downloadframeworks_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.h1
-rw-r--r--media/libmedia/mediaplayer.cpp28
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) {