summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorZach Jang <zachjang@google.com>2015-10-27 01:33:58 +0000
committerandroid-build-merger <android-build-merger@google.com>2015-10-27 01:33:58 +0000
commit1fcbd9b0e973d662ed566967af71c8f5b2383320 (patch)
tree6191f640f705ee0f78a3034f1a06fe68718ede22 /services
parentfd16414d341b1c104068c489103aeb2ddb8995e6 (diff)
parentcda487148602325701ffd7f595ca096a182f380c (diff)
downloadframeworks_av-1fcbd9b0e973d662ed566967af71c8f5b2383320.zip
frameworks_av-1fcbd9b0e973d662ed566967af71c8f5b2383320.tar.gz
frameworks_av-1fcbd9b0e973d662ed566967af71c8f5b2383320.tar.bz2
Merge "Revert "AudioPolicyService: fix race in AudioCommandThread"" into mnc-dev
am: cda4871486 * commit 'cda487148602325701ffd7f595ca096a182f380c': Revert "AudioPolicyService: fix race in AudioCommandThread"
Diffstat (limited to 'services')
-rw-r--r--services/audiopolicy/service/AudioPolicyService.cpp24
1 files changed, 8 insertions, 16 deletions
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index c77cc45..eefff3d 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -577,28 +577,22 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
}
}
waitTime = INT64_MAX;
- // release mLock before releasing strong reference on the service as
- // AudioPolicyService destructor calls AudioCommandThread::exit() which
- // acquires mLock.
- mLock.unlock();
- svc.clear();
- mLock.lock();
} else {
waitTime = mAudioCommands[0]->mTime - curTime;
break;
}
}
-
- // release delayed commands wake lock if the queue is empty
- if (mAudioCommands.isEmpty()) {
+ // release mLock before releasing strong reference on the service as
+ // AudioPolicyService destructor calls AudioCommandThread::exit() which acquires mLock.
+ mLock.unlock();
+ svc.clear();
+ mLock.lock();
+ if (!exitPending() && (mAudioCommands.isEmpty() || waitTime != INT64_MAX)) {
+ // release delayed commands wake lock
release_wake_lock(mName.string());
- }
-
- // At this stage we have either an empty command queue or the first command in the queue
- // has a finite delay. So unless we are exiting it is safe to wait.
- if (!exitPending()) {
ALOGV("AudioCommandThread() going to sleep");
mWaitWorkCV.waitRelative(mLock, waitTime);
+ ALOGV("AudioCommandThread() waking up");
}
}
// release delayed commands wake lock before quitting
@@ -1009,8 +1003,6 @@ void AudioPolicyService::AudioCommandThread::exit()
requestExit();
mWaitWorkCV.signal();
}
- // Note that we can call it from the thread loop if all other references have been released
- // but it will safely return WOULD_BLOCK in this case
requestExitAndWait();
}