blob: 100a7803614b31e00c444aa7b44cfa32fdb45de5 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/heap/page_pool.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/heap/page_memory.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"
namespace blink {
PagePool::PagePool() {
for (int i = 0; i < BlinkGC::kNumberOfArenas; ++i) {
pool_[i] = nullptr;
}
}
PagePool::~PagePool() {
for (int index = 0; index < BlinkGC::kNumberOfArenas; ++index) {
while (PoolEntry* entry = pool_[index]) {
pool_[index] = entry->next;
PageMemory* memory = entry->data;
DCHECK(memory);
delete memory;
delete entry;
}
}
}
void PagePool::Add(int index, PageMemory* memory) {
// When adding a page to the pool we decommit it to ensure it is unused
// while in the pool. This also allows the physical memory, backing the
// page, to be given back to the OS.
memory->Decommit();
PoolEntry* entry = new PoolEntry(memory, pool_[index]);
pool_[index] = entry;
}
PageMemory* PagePool::Take(int index) {
while (PoolEntry* entry = pool_[index]) {
pool_[index] = entry->next;
PageMemory* memory = entry->data;
DCHECK(memory);
delete entry;
if (memory->Commit())
return memory;
// We got some memory, but failed to commit it, try again.
delete memory;
}
return nullptr;
}
} // namespace blink