summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2012-11-02 13:05:14 -0700
committerGlenn Kasten <gkasten@google.com>2012-11-07 16:11:56 -0800
commitd5ed6e88a9bea1879e41d7defaf1edea7c09f554 (patch)
tree99a34f51474700f4873e3f817b6b9f2c47001fc3
parent8fa3ad0e4c77f7868348ad2a4cacc34c34e7c39e (diff)
downloadframeworks_av-d5ed6e88a9bea1879e41d7defaf1edea7c09f554.zip
frameworks_av-d5ed6e88a9bea1879e41d7defaf1edea7c09f554.tar.gz
frameworks_av-d5ed6e88a9bea1879e41d7defaf1edea7c09f554.tar.bz2
Fix call to restoreTrack_l() without lock held
Also document lock order Change-Id: I2c1f273a0a51fa79ee3dd766de8d23083e270051
-rw-r--r--include/media/AudioTrack.h7
-rw-r--r--media/libmedia/AudioTrack.cpp6
2 files changed, 13 insertions, 0 deletions
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index 529f74e..1a19999 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -481,6 +481,7 @@ protected:
// body of AudioTrackThread::threadLoop()
bool processAudioBuffer(const sp<AudioTrackThread>& thread);
+ // caller must hold lock on mLock for all _l methods
status_t createTrack_l(audio_stream_type_t streamType,
uint32_t sampleRate,
audio_format_t format,
@@ -535,7 +536,13 @@ protected:
audio_output_flags_t mFlags;
int mSessionId;
int mAuxEffectId;
+
+ // When locking both mLock and mCblk->lock, must lock in this order to avoid deadlock:
+ // 1. mLock
+ // 2. mCblk->lock
+ // It is OK to lock only mCblk->lock.
mutable Mutex mLock;
+
status_t mRestoreStatus;
bool mIsTimed;
int mPreviousPriority; // before start()
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 5348646..1f4f3d0 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -1122,8 +1122,14 @@ TimedAudioTrack::TimedAudioTrack() {
status_t TimedAudioTrack::allocateTimedBuffer(size_t size, sp<IMemory>* buffer)
{
+ AutoMutex lock(mLock);
status_t result = UNKNOWN_ERROR;
+ // acquire a strong reference on the IMemory and IAudioTrack so that they cannot be destroyed
+ // while we are accessing the cblk
+ sp<IAudioTrack> audioTrack = mAudioTrack;
+ sp<IMemory> iMem = mCblkMemory;
+
// If the track is not invalid already, try to allocate a buffer. alloc
// fails indicating that the server is dead, flag the track as invalid so
// we can attempt to restore in just a bit.