// 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 INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_ #define INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_ #include #include "cppgc/internal/api-constants.h" #include "cppgc/internal/logging.h" #include "cppgc/platform.h" namespace cppgc { namespace internal { class HeapBase; #if defined(CPPGC_YOUNG_GENERATION) // AgeTable contains entries that correspond to 4KB memory regions. Each entry // can be in one of three states: kOld, kYoung or kUnknown. class AgeTable final { static constexpr size_t kGranularityBits = 12; // 4KiB per byte. public: enum class Age : uint8_t { kOld, kYoung, kUnknown }; static constexpr size_t kEntrySizeInBytes = 1 << kGranularityBits; Age& operator[](uintptr_t offset) { return table_[entry(offset)]; } Age operator[](uintptr_t offset) const { return table_[entry(offset)]; } void Reset(PageAllocator* allocator); private: static constexpr size_t kAgeTableSize = api_constants::kCagedHeapReservationSize >> kGranularityBits; size_t entry(uintptr_t offset) const { const size_t entry = offset >> kGranularityBits; CPPGC_DCHECK(table_.size() > entry); return entry; } std::array table_; }; static_assert(sizeof(AgeTable) == 1 * api_constants::kMB, "Size of AgeTable is 1MB"); #endif // CPPGC_YOUNG_GENERATION struct CagedHeapLocalData final { explicit CagedHeapLocalData(HeapBase* heap_base) : heap_base(heap_base) {} bool is_marking_in_progress = false; HeapBase* heap_base = nullptr; #if defined(CPPGC_YOUNG_GENERATION) AgeTable age_table; #endif }; } // namespace internal } // namespace cppgc #endif // INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_