diff options
| author | 2011-03-29 12:23:34 -0700 | |
|---|---|---|
| committer | 2011-03-29 12:23:34 -0700 | |
| commit | 2fd376bd126115c86ff33c9bd3a1a480332e9c7f (patch) | |
| tree | 8f1d6281df4fb3edaf851c74f60f438ffafd2590 | |
| parent | 87a8f316a659fc54c9f126aede13afad348684d4 (diff) | |
| parent | 21e73bf25af7583121dc7ff57f88a7a5500d9e9f (diff) | |
Merge "Make sure we don't trigger a log warning if calling ALooper::stop() from the looper thread."
| -rw-r--r-- | media/libstagefright/foundation/ALooper.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/media/libstagefright/foundation/ALooper.cpp b/media/libstagefright/foundation/ALooper.cpp index b7087f83df38..a5b316d7899f 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; } |