summaryrefslogtreecommitdiffstats
path: root/libs/utils
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2011-06-13 10:30:29 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-13 10:30:29 -0700
commit041120754aa59ddd28927fa6c5db0c90bb8f5e95 (patch)
tree6e2bc633ab17347da11c06ebaffaf1b33f81d6fe /libs/utils
parent622d5441975fa16636d3304d42d27659af14cb49 (diff)
parent9dbd7d818916dca77e53ababdaf05311d5c7bce2 (diff)
downloadframeworks_base-041120754aa59ddd28927fa6c5db0c90bb8f5e95.zip
frameworks_base-041120754aa59ddd28927fa6c5db0c90bb8f5e95.tar.gz
frameworks_base-041120754aa59ddd28927fa6c5db0c90bb8f5e95.tar.bz2
Merge "Remove redundant memory barrier"
Diffstat (limited to 'libs/utils')
-rw-r--r--libs/utils/Threads.cpp13
1 files changed, 5 insertions, 8 deletions
diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp
index 8b5da0e..c748228 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -168,6 +168,9 @@ int androidCreateRawThreadEtc(android_thread_func_t entryFunction,
return 0;
}
+ // Note that *threadID is directly available to the parent only, as it is
+ // assigned after the child starts. Use memory barrier / lock if the child
+ // or other threads also need access.
if (threadId != NULL) {
*threadId = (android_thread_id_t)thread; // XXX: this is not portable
}
@@ -718,7 +721,6 @@ status_t Thread::run(const char* name, int32_t priority, size_t stack)
res = androidCreateRawThreadEtc(_threadLoop,
this, name, priority, stack, &mThread);
}
- // The new thread wakes up at _threadLoop, but immediately blocks on mLock
if (res == false) {
mStatus = UNKNOWN_ERROR; // something happened!
@@ -742,11 +744,6 @@ int Thread::_threadLoop(void* user)
{
Thread* const self = static_cast<Thread*>(user);
- // force a memory barrier before reading any fields, in particular mHoldSelf
- {
- Mutex::Autolock _l(self->mLock);
- }
-
sp<Thread> strong(self->mHoldSelf);
wp<Thread> weak(strong);
self->mHoldSelf.clear();
@@ -816,6 +813,7 @@ void Thread::requestExit()
status_t Thread::requestExitAndWait()
{
+ Mutex::Autolock _l(mLock);
if (mThread == getThreadId()) {
LOGW(
"Thread (this=%p): don't call waitForExit() from this "
@@ -825,9 +823,8 @@ status_t Thread::requestExitAndWait()
return WOULD_BLOCK;
}
- requestExit();
+ mExitPending = true;
- Mutex::Autolock _l(mLock);
while (mRunning == true) {
mThreadExitedCondition.wait(mLock);
}