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

Commit 145b727b authored by Haynes Mathew George's avatar Haynes Mathew George Committed by Eric Laurent
Browse files

libstagefright: Delay release of wakelock in TimedEventQueue

Delay release of wakelock in the TimedEventQueue to
after an event has been processed.
This ensures AP shutdown does not happen while an event
is ready but hasn't been processed yet.

Bug: 11976087.
Change-Id: I9bce83b9ff0f2b4d174a53c95e5b0f135b5ccc70
parent 281dd4e1
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ void TimedEventQueue::threadEntry() {
    for (;;) {
        int64_t now_us = 0;
        sp<Event> event;
        bool wakeLocked = false;

        {
            Mutex::Autolock autoLock(mLock);
@@ -283,26 +284,28 @@ void TimedEventQueue::threadEntry() {
            // removeEventFromQueue_l will return NULL.
            // Otherwise, the QueueItem will be removed
            // from the queue and the referenced event returned.
            event = removeEventFromQueue_l(eventID);
            event = removeEventFromQueue_l(eventID, &wakeLocked);
        }

        if (event != NULL) {
            // Fire event with the lock NOT held.
            event->fire(this, now_us);
            if (wakeLocked) {
                Mutex::Autolock autoLock(mLock);
                releaseWakeLock_l();
            }
        }
    }
}

sp<TimedEventQueue::Event> TimedEventQueue::removeEventFromQueue_l(
        event_id id) {
        event_id id, bool *wakeLocked) {
    for (List<QueueItem>::iterator it = mQueue.begin();
         it != mQueue.end(); ++it) {
        if ((*it).event->eventID() == id) {
            sp<Event> event = (*it).event;
            event->setEventID(0);
            if ((*it).has_wakelock) {
                releaseWakeLock_l();
            }
            *wakeLocked = (*it).has_wakelock;
            mQueue.erase(it);
            return event;
        }
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ private:
    static void *ThreadWrapper(void *me);
    void threadEntry();

    sp<Event> removeEventFromQueue_l(event_id id);
    sp<Event> removeEventFromQueue_l(event_id id, bool *wakeLocked);

    void acquireWakeLock_l();
    void releaseWakeLock_l(bool force = false);