BufferQueue: add a setMaxAcquiredBufferCount check

This change adds a check to verify the validity of the value passed to
setMaxAcquiredBufferCount.

Change-Id: I39730557aa58261e678bd6e4fce11bab78e98362
This commit is contained in:
Jamie Gennis 2012-08-30 18:36:22 -07:00
parent 9e75ddda93
commit c68f2ecfa0
3 changed files with 30 additions and 0 deletions

View File

@ -41,6 +41,10 @@ public:
enum { INVALID_BUFFER_SLOT = -1 }; enum { INVALID_BUFFER_SLOT = -1 };
enum { STALE_BUFFER_SLOT = 1, NO_BUFFER_AVAILABLE }; enum { STALE_BUFFER_SLOT = 1, NO_BUFFER_AVAILABLE };
// When in async mode we reserve two slots in order to guarantee that the
// producer and consumer can run asynchronously.
enum { MAX_MAX_ACQUIRED_BUFFERS = NUM_BUFFER_SLOTS - 2 };
// ConsumerListener is the interface through which the BufferQueue notifies // ConsumerListener is the interface through which the BufferQueue notifies
// the consumer of events that the consumer may wish to react to. Because // the consumer of events that the consumer may wish to react to. Because
// the consumer will generally have a mutex that is locked during calls from // the consumer will generally have a mutex that is locked during calls from

View File

@ -974,6 +974,11 @@ status_t BufferQueue::setDefaultMaxBufferCount(int bufferCount) {
status_t BufferQueue::setMaxAcquiredBufferCount(int maxAcquiredBuffers) { status_t BufferQueue::setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
ATRACE_CALL(); ATRACE_CALL();
Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex);
if (maxAcquiredBuffers < 1 || maxAcquiredBuffers > MAX_MAX_ACQUIRED_BUFFERS) {
ST_LOGE("setMaxAcquiredBufferCount: invalid count specified: %d",
maxAcquiredBuffers);
return BAD_VALUE;
}
if (mConnectedApi != NO_CONNECTED_API) { if (mConnectedApi != NO_CONNECTED_API) {
return INVALID_OPERATION; return INVALID_OPERATION;
} }

View File

@ -93,4 +93,25 @@ TEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item)); ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item));
} }
TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
sp<DummyConsumer> dc(new DummyConsumer);
mBQ->consumerConnect(dc);
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(0));
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(-3));
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(
BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(100));
}
TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
sp<DummyConsumer> dc(new DummyConsumer);
mBQ->consumerConnect(dc);
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(1));
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(2));
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(
BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
}
} // namespace android } // namespace android