fix an issue where invalidate/transactions could be missed

Change-Id: I84a1fcba1317b2631f5441de7b7ecd12af5ad022
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 @@
 // ---------------------------------------------------------------------------
 
 MessageQueue::MessageQueue()
-    : mLooper(new Looper(true))
+    : mLooper(new Looper(true)), mWorkPending(0)
 {
 }
 
@@ -58,11 +58,11 @@
         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::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 @@
 
 class MessageQueue {
     sp<Looper> mLooper;
+    volatile int32_t mWorkPending;
 
 public:
     MessageQueue();