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。