void BufferQueueCore::freeAllBuffersLocked() {
for (int s : mFreeSlots) {
clearBufferSlotLocked(s);
}
for (int s : mFreeBuffers) {
mFreeSlots.insert(s);
clearBufferSlotLocked(s);
}
mFreeBuffers.clear();
for (int s : mActiveBuffers) {
mFreeSlots.insert(s);
clearBufferSlotLocked(s);
}
mActiveBuffers.clear();
for (auto& b : mQueue) {
b.mIsStale = true;
// We set this to false to force the BufferQueue to resend the buffer
// handle upon acquire, since if we're here due to a producer
// disconnect, the consumer will have been told to purge its cache of
// slot-to-buffer-handle mappings and will not be able to otherwise
// obtain a valid buffer handle.
b.mAcquireCalled = false;
}
}
遍历 mFreeSlots、mFreeBuffers 和 mActiveBuffers,调用 BufferQueueCore::clearBufferSlotLocked() 释放 BufferSlot,并把所有 slot 加入到 mFreeSlots。
遍历 mQueue,设置 mIsState 为 true,意思就是坏了不能用。同时设置 mAcquiredCalled 为 false,因为已经释放 buffer 了,下次 BufferQueueConsumer::acquireBuffer() 必须重新发送 GraphicBuffer。