From 58e012d1e37e1272d43c9ff0f56c9b236dd1d7f1 Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Thu, 23 Jun 2011 12:55:29 -0700 Subject: [PATCH] Add Thread::join This new API will be used by applications that previously used the lower-level pthread APIs (including pthread_join). Centralizing on the Thread class instead of pthread will permit additional functionality to be added later in only one location. Change-Id: I8460169ac9c61ac9f85752405ed54c94651058d7 --- include/utils/threads.h | 4 ++++ libs/utils/Threads.cpp | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/utils/threads.h b/include/utils/threads.h index 0bd69cf37..432805e2c 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 15bb1d226..48ce5d125 100644 --- a/libs/utils/Threads.cpp +++ b/libs/utils/Threads.cpp @@ -842,6 +842,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);