diff options
author | Mathias Agopian <mathias@google.com> | 2011-12-04 00:45:50 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-12-04 00:45:50 -0800 |
commit | b5119aa774d8814ae0ccbb3f081739d83b3fe27f (patch) | |
tree | f567decb75430a72759420b5ebf28222fbc1db5e /services/surfaceflinger | |
parent | f3a0a60917af4e11122fb8f10ebae08bfb395e81 (diff) | |
parent | 5edbf4f36639a6d52c3629165bfabd1c2eb85455 (diff) | |
download | frameworks_base-b5119aa774d8814ae0ccbb3f081739d83b3fe27f.zip frameworks_base-b5119aa774d8814ae0ccbb3f081739d83b3fe27f.tar.gz frameworks_base-b5119aa774d8814ae0ccbb3f081739d83b3fe27f.tar.bz2 |
Merge "fix an issue where invalidate/transactions could be missed"
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/MessageQueue.cpp | 14 | ||||
-rw-r--r-- | services/surfaceflinger/MessageQueue.h | 1 |
2 files changed, 9 insertions, 6 deletions
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index fdde75c..85845c9 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 775400f..2317d81 100644 --- a/services/surfaceflinger/MessageQueue.h +++ b/services/surfaceflinger/MessageQueue.h @@ -55,6 +55,7 @@ private: class MessageQueue { sp<Looper> mLooper; + volatile int32_t mWorkPending; public: MessageQueue(); |