From f8be8c0c8055ead961d23b969bf46315eb93e887 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 29 Mar 2011 11:50:24 -0700 Subject: Make sure we don't trigger a log warning if calling ALooper::stop() from the looper thread. Change-Id: I669d589ab4521fe44a3e8f638c7ce8e79174d625 related-to-bug: 4179898 --- media/libstagefright/foundation/ALooper.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'media/libstagefright/foundation') diff --git a/media/libstagefright/foundation/ALooper.cpp b/media/libstagefright/foundation/ALooper.cpp index b7087f8..a5b316d 100644 --- a/media/libstagefright/foundation/ALooper.cpp +++ b/media/libstagefright/foundation/ALooper.cpp @@ -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; } -- cgit v1.1