status_t MediaBufferGroup::acquire_buffer( MediaBuffer **out, bool nonBlocking) { Mutex::Autolock autoLock(mLock); for (;;) { for (MediaBuffer *buffer = mFirstBuffer; buffer != NULL; buffer = buffer->nextBuffer()) { if (buffer->refcount() == 0) { buffer->add_ref(); buffer->reset(); *out = buffer; goto exit; } } if (nonBlocking) { *out = NULL; return WOULD_BLOCK; } // All buffers are in use. Block until one of them is returned to us. mCondition.wait(mLock); } exit: return OK; }
MediaBufferPool::~MediaBufferPool() { MediaBuffer *next; for (MediaBuffer *buffer = mFirstBuffer; buffer != NULL; buffer = next) { next = buffer->nextBuffer(); CHECK_EQ(buffer->refcount(), 0); buffer->setObserver(NULL); buffer->release(); } }