diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index fdde75c0a..85845c922 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -44,7 +44,7 @@ void MessageBase::handleMessage(const Message&) { // --------------------------------------------------------------------------- MessageQueue::MessageQueue() - : mLooper(new Looper(true)) + : mLooper(new Looper(true)), mWorkPending(0) { } @@ -58,11 +58,11 @@ void MessageQueue::waitMessage() { int32_t ret = mLooper->pollOnce(-1); switch (ret) { case ALOOPER_POLL_WAKE: - // we got woken-up there is work to do in the main loop - return; - case ALOOPER_POLL_CALLBACK: - // callback was handled, loop again + // callback and/or wake + if (android_atomic_and(0, &mWorkPending)) { + return; + } continue; case ALOOPER_POLL_TIMEOUT: @@ -94,7 +94,9 @@ status_t MessageQueue::postMessage( } status_t MessageQueue::invalidate() { - mLooper->wake(); + if (android_atomic_or(1, &mWorkPending) == 0) { + mLooper->wake(); + } return NO_ERROR; } diff --git a/services/surfaceflinger/MessageQueue.h b/services/surfaceflinger/MessageQueue.h index 775400f98..2317d81ab 100644 --- a/services/surfaceflinger/MessageQueue.h +++ b/services/surfaceflinger/MessageQueue.h @@ -55,6 +55,7 @@ private: class MessageQueue { sp mLooper; + volatile int32_t mWorkPending; public: MessageQueue();