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:
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user