Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6de1c04 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

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
parent 303d538b
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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();
+2 −1
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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...