Make sure we don't trigger a log warning if calling ALooper::stop() from the looper thread.

Change-Id: I669d589ab4521fe44a3e8f638c7ce8e79174d625
related-to-bug: 4179898
This commit is contained in:
Andreas Huber
2011-03-29 11:50:24 -07:00
parent 397de169e5
commit 21e73bf25a

View File

@ -33,18 +33,30 @@ ALooperRoster gLooperRoster;
struct ALooper::LooperThread : public Thread {
LooperThread(ALooper *looper, bool canCallJava)
: Thread(canCallJava),
mLooper(looper) {
mLooper(looper),
mThreadId(NULL) {
}
virtual status_t readyToRun() {
mThreadId = androidGetThreadId();
return Thread::readyToRun();
}
virtual bool threadLoop() {
return mLooper->loop();
}
bool isCurrentThread() const {
return mThreadId == androidGetThreadId();
}
protected:
virtual ~LooperThread() {}
private:
ALooper *mLooper;
android_thread_id_t mThreadId;
DISALLOW_EVIL_CONSTRUCTORS(LooperThread);
};
@ -136,7 +148,9 @@ status_t ALooper::stop() {
mQueueChangedCondition.signal();
if (!runningLocally) {
if (!runningLocally && !thread->isCurrentThread()) {
// If not running locally and this thread _is_ the looper thread,
// the loop() function will return and never be called again.
thread->requestExitAndWait();
}
@ -197,6 +211,11 @@ bool ALooper::loop() {
gLooperRoster.deliverMessage(event.mMessage);
// NOTE: It's important to note that at this point our "ALooper" object
// may no longer exist (its final reference may have gone away while
// delivering the message). We have made sure, however, that loop()
// won't be called again.
return true;
}