diff options
author | Haynes Mathew George <hgeorge@codeaurora.org> | 2013-12-06 11:31:57 -0800 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2013-12-17 22:06:22 +0000 |
commit | 25cb85cd3c96c28f64aae52f9c66c76773aa124c (patch) | |
tree | 6376a6e510582d2834f03e03e9fa0dd6f30d9c53 /media/libstagefright/TimedEventQueue.cpp | |
parent | f81f7a52d4720f441197f75918d2b2c05d41ab45 (diff) | |
download | frameworks_av-25cb85cd3c96c28f64aae52f9c66c76773aa124c.zip frameworks_av-25cb85cd3c96c28f64aae52f9c66c76773aa124c.tar.gz frameworks_av-25cb85cd3c96c28f64aae52f9c66c76773aa124c.tar.bz2 |
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: I71a5f3ac4a57e1d05dd5d9ab5c6f91ed7bb64c87
Diffstat (limited to 'media/libstagefright/TimedEventQueue.cpp')
-rw-r--r-- | media/libstagefright/TimedEventQueue.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp index 1a9a26b..dedd186 100644 --- a/media/libstagefright/TimedEventQueue.cpp +++ b/media/libstagefright/TimedEventQueue.cpp @@ -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; } |