bool BufferQueueCore::adjustAvailableSlotsLocked(int delta) {
if (delta >= 0) {
// If we're going to fail, do so before modifying anything
if (delta > static_cast<int>(mUnusedSlots.size())) {
return false;
}
while (delta > 0) {
if (mUnusedSlots.empty()) {
return false;
}
int slot = mUnusedSlots.back();
mUnusedSlots.pop_back();
mFreeSlots.insert(slot);
delta--;
}
- 如果
delta
大于等于 0,需要扩容,即从 mUnusedSlots
移除加入到 mFreeSlots
。
- 如果
delta
超过了可用空位 mUnusedSlots
,返回 false
。
- 从
mUnusedSlots
取 delta
个 slot,插入到 mFreeSlots
。
} else {
// If we're going to fail, do so before modifying anything
if (-delta > static_cast<int>(mFreeSlots.size() +
mFreeBuffers.size())) {
return false;
}
while (delta < 0) {
if (!mFreeSlots.empty()) {
auto slot = mFreeSlots.begin();
clearBufferSlotLocked(*slot);
mUnusedSlots.push_back(*slot);
mFreeSlots.erase(slot);
} else if (!mFreeBuffers.empty()) {
int slot = mFreeBuffers.back();
clearBufferSlotLocked(slot);
mUnusedSlots.push_back(slot);
mFreeBuffers.pop_back();
} else {
return false;
}
delta++;
}
}
return true;
}
delta
小于零表示需要缩减。mFreeSlots
和 mFreeBuffer
之和是 FREE
slot 个数,如果 -delta
大于 FREE
slot 个数,则返回 false
。
- 优先从
mFreeSlots
取 slot,调用 BufferQueueCore::clearBufferSlotLocked() 清理,再插入到 mUnusedSlots
。如果 mFreeSlots
空了,则从 mFreeBuffers
取 slot。