summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2014-01-29 15:17:32 -0800
committerEric Laurent <elaurent@google.com>2014-01-29 15:25:32 -0800
commit000a4193dd82549192277fd4b9bb571d8a4c262f (patch)
tree62bb97def825703a634d8a4260431ce5afd68b53 /services
parent0eed5ac1a14067d0fd51282e97b43b4fd9121842 (diff)
downloadframeworks_av-000a4193dd82549192277fd4b9bb571d8a4c262f.zip
frameworks_av-000a4193dd82549192277fd4b9bb571d8a4c262f.tar.gz
frameworks_av-000a4193dd82549192277fd4b9bb571d8a4c262f.tar.bz2
audioflinger: fix record thread exit pending check
RecordThread loop must not release the mutex after checking for exitPending and before waiting for a new wake up condition. This can happen under the hood when methods like processConfigEvents_l() or checkForNewParameters_l() are called. So exitPending() must be checked after calling these functions. Bug: 12787961. Change-Id: Ia18c518bd5344fbb2401067303fcfe76a86879c4
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/Threads.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 2b37761..515368c 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -4474,13 +4474,17 @@ reacquire_wakelock:
{ // scope for mLock
Mutex::Autolock _l(mLock);
- if (exitPending()) {
- break;
- }
+
processConfigEvents_l();
// return value 'reconfig' is currently unused
bool reconfig = checkForNewParameters_l();
+ // check exitPending here because checkForNewParameters_l() and
+ // checkForNewParameters_l() can temporarily release mLock
+ if (exitPending()) {
+ break;
+ }
+
// if no active track(s), then standby and release wakelock
size_t size = mActiveTracks.size();
if (size == 0) {