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); }
status_t rtm_delete_pool(rtm_pool* pool) { if (pool == NULL) return B_BAD_VALUE; mutex_lock(&pool->lock); { MutexLocker _(&sPoolsLock); sPools.Remove(pool); } delete_area(pool->area); mutex_destroy(&pool->lock); free(pool); return B_OK; }