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
This commit is contained in:
parent
303d538bb0
commit
f6de1c04ff
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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...
|
||||
|
|
Loading…
Reference in New Issue