blob: ba578f3820376b7c545c84df76a7edfca0e7d004 [file] [log] [blame]
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_HEAP_CPPGC_FREE_LIST_H_
#define V8_HEAP_CPPGC_FREE_LIST_H_
#include <array>
#include "src/base/macros.h"
#include "src/heap/cppgc/globals.h"
#include "src/heap/cppgc/heap-object-header.h"
namespace cppgc {
namespace internal {
class V8_EXPORT_PRIVATE FreeList {
public:
struct Block {
void* address;
size_t size;
};
FreeList();
FreeList(const FreeList&) = delete;
FreeList& operator=(const FreeList&) = delete;
FreeList(FreeList&& freelist) V8_NOEXCEPT;
FreeList& operator=(FreeList&& freelist) V8_NOEXCEPT;
// Allocates entries which are at least of the provided size.
Block Allocate(size_t);
// Adds block to the freelist. The minimal block size is two words.
void Add(Block);
// Append other freelist into this.
void Append(FreeList&&);
void Clear();
size_t Size() const;
bool IsEmpty() const;
bool Contains(Block) const;
private:
class Entry;
bool IsConsistent(size_t) const;
// All |Entry|s in the nth list have size >= 2^n.
std::array<Entry*, kPageSizeLog2> free_list_heads_;
std::array<Entry*, kPageSizeLog2> free_list_tails_;
size_t biggest_free_list_index_ = 0;
};
} // namespace internal
} // namespace cppgc
#endif // V8_HEAP_CPPGC_FREE_LIST_H_