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

Commit aef04853 authored by Eric Laurent's avatar Eric Laurent
Browse files

stagefright: fix TimedEventQueue wakelock

If an event is taking a wakelock, the wakelock must be
released after the event is fired.
If the wakelock is released before and the event execution
implies some sleeps or I/O the system can go idle as
no wakelock is held anymore.

Bug: 11976087.

Change-Id: Ie7df8ed4834952ff818ff27d6be415c0b1794a9f
parent cdece9fe
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -127,7 +127,6 @@ TimedEventQueue::event_id TimedEventQueue::postTimedEvent(
    QueueItem item;
    item.event = event;
    item.realtime_us = realtime_us;
    item.has_wakelock = false;

    if (it == mQueue.begin()) {
        mQueueHeadChangedCondition.signal();
@@ -135,7 +134,7 @@ TimedEventQueue::event_id TimedEventQueue::postTimedEvent(

    if (realtime_us > ALooper::GetNowUs() + kWakelockMinDelay) {
        acquireWakeLock_l();
        item.has_wakelock = true;
        event->setWakeLock();
    }
    mQueue.insert(it, item);

@@ -191,7 +190,7 @@ void TimedEventQueue::cancelEvents(
        ALOGV("cancelling event %d", (*it).event->eventID());

        (*it).event->setEventID(0);
        if ((*it).has_wakelock) {
        if ((*it).event->hasWakeLock()) {
            releaseWakeLock_l();
        }
        it = mQueue.erase(it);
@@ -289,6 +288,9 @@ void TimedEventQueue::threadEntry() {
        if (event != NULL) {
            // Fire event with the lock NOT held.
            event->fire(this, now_us);
            if (event->hasWakeLock()) {
                releaseWakeLock_l();
            }
        }
    }
}
@@ -300,9 +302,6 @@ sp<TimedEventQueue::Event> TimedEventQueue::removeEventFromQueue_l(
        if ((*it).event->eventID() == id) {
            sp<Event> event = (*it).event;
            event->setEventID(0);
            if ((*it).has_wakelock) {
                releaseWakeLock_l();
            }
            mQueue.erase(it);
            return event;
        }
+10 −2
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ struct TimedEventQueue {

    struct Event : public RefBase {
        Event()
            : mEventID(0) {
            : mEventID(0), mHasWakeLock(false) {
        }

        virtual ~Event() {}
@@ -42,6 +42,14 @@ struct TimedEventQueue {
            return mEventID;
        }

        void setWakeLock() {
            mHasWakeLock = true;
        }

        bool hasWakeLock() {
            return mHasWakeLock;
        }

    protected:
        virtual void fire(TimedEventQueue *queue, int64_t now_us) = 0;

@@ -49,6 +57,7 @@ struct TimedEventQueue {
        friend class TimedEventQueue;

        event_id mEventID;
        bool mHasWakeLock;

        void setEventID(event_id id) {
            mEventID = id;
@@ -118,7 +127,6 @@ private:
    struct QueueItem {
        sp<Event> event;
        int64_t realtime_us;
        bool has_wakelock;
    };

    struct StopEvent : public TimedEventQueue::Event {