summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-01-04 11:58:04 -0800
committerEric Laurent <elaurent@google.com>2011-01-12 18:28:25 -0800
commit41f4d4d84790f49a0771c3ebfd12d87a5b879f94 (patch)
tree46202c299f6ad14ed6f46d4131912688fa926b68 /libs
parente9739d09cb53fd05cc9229049b3d54c7f6816450 (diff)
downloadframeworks_base-41f4d4d84790f49a0771c3ebfd12d87a5b879f94.zip
frameworks_base-41f4d4d84790f49a0771c3ebfd12d87a5b879f94.tar.gz
frameworks_base-41f4d4d84790f49a0771c3ebfd12d87a5b879f94.tar.bz2
Fix issue 3302649.
The cause of the problem is that AudioTrack::start() can fail if it is called from a newly created thread that has the same ID as the AudioTrack callback thread that has just been stopped and not yet exited. This is possible as the thread ID used by the Thread class is not the TID. The fix consists in clearing the thread ID before exiting the thread loop. Change-Id: I8b5f6a63feeaeb9a01267380e85f6f1456e7aa01
Diffstat (limited to 'libs')
-rw-r--r--libs/utils/Threads.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp
index f6c55e4..ad9a94f 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -774,6 +774,9 @@ int Thread::_threadLoop(void* user)
self->mExitPending = true;
self->mLock.lock();
self->mRunning = false;
+ // clear thread ID so that requestExitAndWait() does not exit if
+ // called by a new thread using the same thread ID as this one.
+ self->mThread = thread_id_t(-1);
self->mThreadExitedCondition.broadcast();
self->mLock.unlock();
break;