summaryrefslogtreecommitdiff
path: root/libs/gui/BufferQueueProducer.cpp
diff options
context:
space:
mode:
author Dan Stoza <stoza@google.com> 2015-06-30 13:43:32 -0700
committer Dan Stoza <stoza@google.com> 2016-01-05 15:02:32 -0800
commit127fc63e8a15366b4395f1363e8e18eb058d1709 (patch)
tree10dee6e3a6e3e3e50c351834c2c88a5516ae429d /libs/gui/BufferQueueProducer.cpp
parent1e9edc619c6b1ca3998a26eaa4882b55ce801f12 (diff)
libgui: Add dequeue/attach timeout
Adds the ability to specify the timeout when dequeueBuffer or attachBuffer block due to the lack of a free buffer/slot. By default, these will block indefinitely (which is signified by a timeout of -1). When a timeout (other than -1) is specified, non-blocking mode is disabled and the given timeout will be used instead. Bug: 25196773 Change-Id: I17fdbeebccb7c8d878703d758ac1209608258e61
Diffstat (limited to 'libs/gui/BufferQueueProducer.cpp')
-rw-r--r--libs/gui/BufferQueueProducer.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp
index 9271ed8bcd..c48f23728c 100644
--- a/libs/gui/BufferQueueProducer.cpp
+++ b/libs/gui/BufferQueueProducer.cpp
@@ -43,7 +43,8 @@ BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) :
mCallbackMutex(),
mNextCallbackTicket(0),
mCurrentCallbackTicket(0),
- mCallbackCondition() {}
+ mCallbackCondition(),
+ mDequeueTimeout(-1) {}
BufferQueueProducer::~BufferQueueProducer() {}
@@ -271,7 +272,15 @@ status_t BufferQueueProducer::waitForFreeSlotThenRelock(const char* caller,
(acquiredCount <= mCore->mMaxAcquiredBufferCount)) {
return WOULD_BLOCK;
}
- mCore->mDequeueCondition.wait(mCore->mMutex);
+ if (mDequeueTimeout >= 0) {
+ status_t result = mCore->mDequeueCondition.waitRelative(
+ mCore->mMutex, mDequeueTimeout);
+ if (result == TIMED_OUT) {
+ return result;
+ }
+ } else {
+ mCore->mDequeueCondition.wait(mCore->mMutex);
+ }
}
} // while (tryAgain)
@@ -1012,8 +1021,11 @@ status_t BufferQueueProducer::connect(const sp<IProducerListener>& listener,
}
mCore->mBufferHasBeenQueued = false;
- mCore->mDequeueBufferCannotBlock = mCore->mConsumerControlledByApp &&
- producerControlledByApp;
+ mCore->mDequeueBufferCannotBlock = false;
+ if (mDequeueTimeout < 0) {
+ mCore->mDequeueBufferCannotBlock =
+ mCore->mConsumerControlledByApp && producerControlledByApp;
+ }
mCore->mAllowAllocation = true;
return status;
@@ -1247,7 +1259,16 @@ status_t BufferQueueProducer::setSingleBufferMode(bool singleBufferMode) {
mCore->mSingleBufferSlot = BufferQueueCore::INVALID_BUFFER_SLOT;
}
mCore->mSingleBufferMode = singleBufferMode;
+ return NO_ERROR;
+}
+
+status_t BufferQueueProducer::setDequeueTimeout(nsecs_t timeout) {
+ ATRACE_CALL();
+ BQ_LOGV("setDequeueTimeout: %" PRId64, timeout);
+ Mutex::Autolock lock(mCore->mMutex);
+ mDequeueTimeout = timeout;
+ mCore->mDequeueBufferCannotBlock = false;
return NO_ERROR;
}