summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Glenn Kasten <gkasten@google.com> 2011-07-06 11:37:53 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2011-07-06 11:37:53 -0700
commit5161eb7b233cf3b806046fd935f248b3844d9bd7 (patch)
tree59ec630bb655b3c66819a8ce35dfa0b0101f7da7
parent55aaccd7e8e3f5a4b0f4333c6bd2404eeac7bbb1 (diff)
parent697283e9177ee5730bf5c652c3c05d3aa3838ace (diff)
Merge "Add Thread::join"
-rw-r--r--include/utils/threads.h4
-rw-r--r--libs/utils/Threads.cpp19
2 files changed, 23 insertions, 0 deletions
diff --git a/include/utils/threads.h b/include/utils/threads.h
index 41f67e40580c..c8e9c0413d90 100644
--- a/include/utils/threads.h
+++ b/include/utils/threads.h
@@ -510,6 +510,10 @@ public:
// that case.
status_t requestExitAndWait();
+ // Wait until this object's thread exits. Returns immediately if not yet running.
+ // Do not call from this object's thread; will return WOULD_BLOCK in that case.
+ status_t join();
+
protected:
// exitPending() returns true if requestExit() has been called.
bool exitPending() const;
diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp
index 71352a864fee..50312e7bb7d3 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -846,6 +846,25 @@ status_t Thread::requestExitAndWait()
return mStatus;
}
+status_t Thread::join()
+{
+ Mutex::Autolock _l(mLock);
+ if (mThread == getThreadId()) {
+ LOGW(
+ "Thread (this=%p): don't call join() from this "
+ "Thread object's thread. It's a guaranteed deadlock!",
+ this);
+
+ return WOULD_BLOCK;
+ }
+
+ while (mRunning == true) {
+ mThreadExitedCondition.wait(mLock);
+ }
+
+ return mStatus;
+}
+
bool Thread::exitPending() const
{
Mutex::Autolock _l(mLock);