am 17c195c8: Merge change 9340 into donut

Merge commit '17c195c8da3470b2e69880e206342f0c2d85f938'

* commit '17c195c8da3470b2e69880e206342f0c2d85f938':
  Fix issue 2025872: Deadlock in SoundPool.stop
This commit is contained in:
Android (Google) Code Review
2009-07-31 08:55:51 -07:00
committed by Android Git Automerger
2 changed files with 9 additions and 11 deletions

View File

@@ -93,7 +93,7 @@ SoundPool::~SoundPool()
void SoundPool::addToRestartList(SoundChannel* channel)
{
Mutex::Autolock lock(&mLock);
Mutex::Autolock lock(&mRestartLock);
mRestart.push_back(channel);
mCondition.signal();
}
@@ -106,9 +106,9 @@ int SoundPool::beginThread(void* arg)
int SoundPool::run()
{
mLock.lock();
mRestartLock.lock();
while (!mQuit) {
mCondition.wait(mLock);
mCondition.wait(mRestartLock);
LOGV("awake");
if (mQuit) break;
@@ -125,19 +125,19 @@ int SoundPool::run()
mRestart.clear();
mCondition.signal();
mLock.unlock();
mRestartLock.unlock();
LOGV("goodbye");
return 0;
}
void SoundPool::quit()
{
mLock.lock();
mRestartLock.lock();
mQuit = true;
mCondition.signal();
mCondition.wait(mLock);
mCondition.wait(mRestartLock);
LOGV("return from quit");
mLock.unlock();
mRestartLock.unlock();
}
bool SoundPool::startThreads()
@@ -484,11 +484,8 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
// if not idle, this voice is being stolen
if (mState != IDLE) {
LOGV("channel %d stolen - event queued for channel %d", channelID(), nextChannelID);
stop_l();
mNextEvent.set(sample, nextChannelID, leftVolume, rightVolume, priority, loop, rate);
#ifdef USE_SHARED_MEM_BUFFER
mSoundPool->done(this);
#endif
stop();
return;
}

View File

@@ -204,6 +204,7 @@ private:
jobject mSoundPoolRef;
Mutex mLock;
Mutex mRestartLock;
Condition mCondition;
SoundPoolThread* mDecodeThread;
SoundChannel* mChannelPool;