rework screen on/off code

Change-Id: I13f71e850592a588bbd4805b1830c503bd4decb4
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7023e0f..f891b29 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -96,7 +96,6 @@
         mDebugInTransaction(0),
         mLastTransactionTime(0),
         mBootFinished(false),
-        mConsoleSignals(0),
         mSecureFrameBuffer(0)
 {
     init();
@@ -410,11 +409,6 @@
     switch (what) {
         case MessageQueue::REFRESH: {
 //        case MessageQueue::INVALIDATE: {
-            // check for transactions
-            if (CC_UNLIKELY(mConsoleSignals)) {
-                handleConsoleEvents();
-            }
-
             // if we're in a global transaction, don't do anything.
             const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
             uint32_t transactionFlags = peekTransactionFlags(mask);
@@ -482,28 +476,6 @@
     mSwapRegion.clear();
 }
 
-void SurfaceFlinger::handleConsoleEvents()
-{
-    // something to do with the console
-    const DisplayHardware& hw = graphicPlane(0).displayHardware();
-
-    int what = android_atomic_and(0, &mConsoleSignals);
-    if (what & eConsoleAcquired) {
-        hw.acquireScreen();
-        // this is a temporary work-around, eventually this should be called
-        // by the power-manager
-        SurfaceFlinger::turnElectronBeamOn(mElectronBeamAnimationMode);
-    }
-
-    if (what & eConsoleReleased) {
-        if (hw.isScreenAcquired()) {
-            hw.releaseScreen();
-        }
-    }
-
-    mDirtyRegion.set(hw.bounds());
-}
-
 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
 {
     ATRACE_CALL();
@@ -1490,20 +1462,57 @@
     return flags;
 }
 
-void SurfaceFlinger::screenReleased(int dpy)
-{
-    // this may be called by a signal handler, we can't do too much in here
-    android_atomic_or(eConsoleReleased, &mConsoleSignals);
-    signalTransaction();
+// ---------------------------------------------------------------------------
+
+void SurfaceFlinger::onScreenAcquired() {
+    const DisplayHardware& hw(graphicPlane(0).displayHardware());
+    hw.acquireScreen();
+    // this is a temporary work-around, eventually this should be called
+    // by the power-manager
+    SurfaceFlinger::turnElectronBeamOn(mElectronBeamAnimationMode);
+    mDirtyRegion.set(hw.bounds());
+    // from this point on, SF will priocess updates again
 }
 
-void SurfaceFlinger::screenAcquired(int dpy)
-{
-    // this may be called by a signal handler, we can't do too much in here
-    android_atomic_or(eConsoleAcquired, &mConsoleSignals);
-    signalTransaction();
+void SurfaceFlinger::onScreenReleased() {
+    const DisplayHardware& hw(graphicPlane(0).displayHardware());
+    if (hw.isScreenAcquired()) {
+        mDirtyRegion.set(hw.bounds());
+        hw.releaseScreen();
+        // from this point on, SF will stop drawing
+    }
 }
 
+void SurfaceFlinger::screenAcquired() {
+    class MessageScreenAcquired : public MessageBase {
+        SurfaceFlinger* flinger;
+    public:
+        MessageScreenAcquired(SurfaceFlinger* flinger) : flinger(flinger) { }
+        virtual bool handler() {
+            flinger->onScreenAcquired();
+            return true;
+        }
+    };
+    sp<MessageBase> msg = new MessageScreenAcquired(this);
+    postMessageSync(msg);
+}
+
+void SurfaceFlinger::screenReleased() {
+    class MessageScreenReleased : public MessageBase {
+        SurfaceFlinger* flinger;
+    public:
+        MessageScreenReleased(SurfaceFlinger* flinger) : flinger(flinger) { }
+        virtual bool handler() {
+            flinger->onScreenReleased();
+            return true;
+        }
+    };
+    sp<MessageBase> msg = new MessageScreenReleased(this);
+    postMessageSync(msg);
+}
+
+// ---------------------------------------------------------------------------
+
 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
 {
     const size_t SIZE = 4096;