summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2011-12-04 00:45:50 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-12-04 00:45:50 -0800
commitb5119aa774d8814ae0ccbb3f081739d83b3fe27f (patch)
treef567decb75430a72759420b5ebf28222fbc1db5e /services/surfaceflinger
parentf3a0a60917af4e11122fb8f10ebae08bfb395e81 (diff)
parent5edbf4f36639a6d52c3629165bfabd1c2eb85455 (diff)
downloadframeworks_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.cpp14
-rw-r--r--services/surfaceflinger/MessageQueue.h1
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();