OSDN Git Service

fix a crasher when starting SF with the screen off
authorMathias Agopian <mathias@google.com>
Sun, 5 Feb 2012 10:15:28 +0000 (02:15 -0800)
committerMathias Agopian <mathias@google.com>
Sun, 5 Feb 2012 10:15:28 +0000 (02:15 -0800)
SF could end-up in an infinite crash-loop during startup if it
was stopped while the screen was off. This happened because
the thread that manages screen blanking was started before
other important pieces of SF were initialized.

Change-Id: I0dded11dbf2395fdd57b673859a7aa0fa9eb32b6

services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
services/surfaceflinger/DisplayHardware/DisplayHardwareBase.h
services/surfaceflinger/SurfaceFlinger.cpp

index 09f1906..69f1aca 100644 (file)
@@ -43,14 +43,6 @@ DisplayHardwareBase::DisplayEventThread::DisplayEventThread(
 DisplayHardwareBase::DisplayEventThread::~DisplayEventThread() {
 }
 
-void DisplayHardwareBase::DisplayEventThread::onFirstRef() {
-    if (initCheck() == NO_ERROR) {
-        run("DisplayEventThread", PRIORITY_URGENT_DISPLAY);
-    } else {
-        ALOGW("/sys/power/wait_for_fb_{wake|sleep} don't exist");
-    }
-}
-
 status_t DisplayHardwareBase::DisplayEventThread::initCheck() const {
     return ((access(kSleepFileName, R_OK) == 0 &&
             access(kWakeFileName, R_OK) == 0)) ? NO_ERROR : NO_INIT;
@@ -120,6 +112,14 @@ DisplayHardwareBase::DisplayHardwareBase(const sp<SurfaceFlinger>& flinger,
     mDisplayEventThread = new DisplayEventThread(flinger);
 }
 
+void DisplayHardwareBase::startSleepManagement() const {
+    if (mDisplayEventThread->initCheck() == NO_ERROR) {
+        mDisplayEventThread->run("DisplayEventThread", PRIORITY_URGENT_DISPLAY);
+    } else {
+        ALOGW("/sys/power/wait_for_fb_{wake|sleep} don't exist");
+    }
+}
+
 DisplayHardwareBase::~DisplayHardwareBase() {
     // request exit
     mDisplayEventThread->requestExitAndWait();
index 91ea602..fba211b 100644 (file)
@@ -35,6 +35,8 @@ public:
 
     ~DisplayHardwareBase();
 
+    void startSleepManagement() const;
+
     // console management
     void releaseScreen() const;
     void acquireScreen() const;
@@ -52,7 +54,6 @@ private:
     public:
         DisplayEventThread(const sp<SurfaceFlinger>& flinger);
         virtual ~DisplayEventThread();
-        virtual void onFirstRef();
         virtual bool threadLoop();
         status_t releaseScreen() const;
         status_t initCheck() const;
index 88666ea..ab09bfa 100644 (file)
@@ -300,6 +300,7 @@ status_t SurfaceFlinger::readyToRun()
     // start the EventThread
     mEventThread = new EventThread(this);
     mEventQueue.setEventThread(mEventThread);
+    hw.startSleepManagement();
 
     /*
      *  We're now ready to accept clients...