From 587ae01ad65a331ba259c31fbc1729cb5fbdf226 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Sun, 5 Feb 2012 02:15:28 -0800 Subject: [PATCH] fix a crasher when starting SF with the screen off 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 --- .../DisplayHardware/DisplayHardwareBase.cpp | 16 ++++++++-------- .../DisplayHardware/DisplayHardwareBase.h | 3 ++- services/surfaceflinger/SurfaceFlinger.cpp | 1 + 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp index 09f190629928f..69f1aca3d944c 100644 --- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp +++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp @@ -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& 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(); diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.h b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.h index 91ea60298033e..fba211beeb7cd 100644 --- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.h +++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.h @@ -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& flinger); virtual ~DisplayEventThread(); - virtual void onFirstRef(); virtual bool threadLoop(); status_t releaseScreen() const; status_t initCheck() const; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 88666ea04f6c0..ab09bfafc73cc 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -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...