summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaynes Mathew George <hgeorge@codeaurora.org>2013-12-06 11:31:57 -0800
committerEric Laurent <elaurent@google.com>2014-03-05 14:05:27 -0800
commit145b727b4cce8b1b8d161612f30d12bbdfc8d134 (patch)
tree96caa4aef35c2d016a89fbf6a8a509fc2aa10906
parent281dd4e13309973dbb85bce531f884237e0d8fb0 (diff)
downloadframeworks_av-145b727b4cce8b1b8d161612f30d12bbdfc8d134.zip
frameworks_av-145b727b4cce8b1b8d161612f30d12bbdfc8d134.tar.gz
frameworks_av-145b727b4cce8b1b8d161612f30d12bbdfc8d134.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: I9bce83b9ff0f2b4d174a53c95e5b0f135b5ccc70
-rw-r--r--media/libstagefright/TimedEventQueue.cpp13
-rw-r--r--media/libstagefright/include/TimedEventQueue.h2
2 files changed, 9 insertions, 6 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;
}
diff --git a/media/libstagefright/include/TimedEventQueue.h b/media/libstagefright/include/TimedEventQueue.h
index 38a08b1..3e84256 100644
--- a/media/libstagefright/include/TimedEventQueue.h
+++ b/media/libstagefright/include/TimedEventQueue.h
@@ -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);