status_t LargeMemoryPhysicalPageMapper::GetSlot(bool canWait, PhysicalPageSlot*& slot) { MutexLocker locker(fLock); PhysicalPageSlotPool* pool = fNonEmptyPools.Head(); if (pool == NULL) { if (!canWait) return B_WOULD_BLOCK; // allocate new pool locker.Unlock(); status_t error = fInitialPool->AllocatePool(pool); if (error != B_OK) return error; locker.Lock(); fNonEmptyPools.Add(pool); pool = fNonEmptyPools.Head(); } slot = pool->GetSlot(); if (pool->IsEmpty()) { fNonEmptyPools.Remove(pool); fEmptyPools.Add(pool); } return B_OK; }
void LargeMemoryPhysicalPageMapper::PutSlot(PhysicalPageSlot* slot) { MutexLocker locker(fLock); PhysicalPageSlotPool* pool = slot->pool; if (pool->IsEmpty()) { fEmptyPools.Remove(pool); fNonEmptyPools.Add(pool); } pool->PutSlot(slot); }