use broadcast() instead of signal() when signaling the condition-variable Thread::RequestExitAndWait() is waiting for

we could have several thread waiting on the condition and they all need to wake-up.
also added a debug "mTid" field in the class, which contains the tid of the thread (as opposed to pthread_t), this
is useful when debugging under gdb for instance.
This commit is contained in:
Mathias Agopian 2009-09-09 02:38:13 -07:00 committed by Alex Ray
parent 641b630d2b
commit 51ce3ad760
2 changed files with 10 additions and 2 deletions

View File

@ -408,6 +408,9 @@ private:
volatile bool mExitPending;
volatile bool mRunning;
sp<Thread> mHoldSelf;
#if HAVE_ANDROID_OS
int mTid;
#endif
};

View File

@ -655,6 +655,11 @@ int Thread::_threadLoop(void* user)
wp<Thread> weak(strong);
self->mHoldSelf.clear();
#if HAVE_ANDROID_OS
// this is very useful for debugging with gdb
self->mTid = gettid();
#endif
bool first = true;
do {
@ -685,7 +690,7 @@ int Thread::_threadLoop(void* user)
self->mExitPending = true;
self->mLock.lock();
self->mRunning = false;
self->mThreadExitedCondition.signal();
self->mThreadExitedCondition.broadcast();
self->mLock.unlock();
break;
}
@ -693,7 +698,7 @@ int Thread::_threadLoop(void* user)
// Release our strong reference, to let a chance to the thread
// to die a peaceful death.
strong.clear();
// And immediately, reacquire a strong reference for the next loop
// And immediately, re-acquire a strong reference for the next loop
strong = weak.promote();
} while(strong != 0);