• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
6 #define INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
7 
8 #include <array>
9 
10 #include "cppgc/internal/api-constants.h"
11 #include "cppgc/internal/logging.h"
12 #include "cppgc/platform.h"
13 
14 namespace cppgc {
15 namespace internal {
16 
17 class HeapBase;
18 
19 #if defined(CPPGC_YOUNG_GENERATION)
20 
21 // AgeTable contains entries that correspond to 4KB memory regions. Each entry
22 // can be in one of three states: kOld, kYoung or kUnknown.
23 class AgeTable final {
24   static constexpr size_t kGranularityBits = 12;  // 4KiB per byte.
25 
26  public:
27   enum class Age : uint8_t { kOld, kYoung, kUnknown };
28 
29   static constexpr size_t kEntrySizeInBytes = 1 << kGranularityBits;
30 
31   Age& operator[](uintptr_t offset) { return table_[entry(offset)]; }
32   Age operator[](uintptr_t offset) const { return table_[entry(offset)]; }
33 
34   void Reset(PageAllocator* allocator);
35 
36  private:
37   static constexpr size_t kAgeTableSize =
38       api_constants::kCagedHeapReservationSize >> kGranularityBits;
39 
entry(uintptr_t offset)40   size_t entry(uintptr_t offset) const {
41     const size_t entry = offset >> kGranularityBits;
42     CPPGC_DCHECK(table_.size() > entry);
43     return entry;
44   }
45 
46   std::array<Age, kAgeTableSize> table_;
47 };
48 
49 static_assert(sizeof(AgeTable) == 1 * api_constants::kMB,
50               "Size of AgeTable is 1MB");
51 
52 #endif  // CPPGC_YOUNG_GENERATION
53 
54 struct CagedHeapLocalData final {
CagedHeapLocalDatafinal55   explicit CagedHeapLocalData(HeapBase* heap_base) : heap_base(heap_base) {}
56 
57   bool is_marking_in_progress = false;
58   HeapBase* heap_base = nullptr;
59 #if defined(CPPGC_YOUNG_GENERATION)
60   AgeTable age_table;
61 #endif
62 };
63 
64 }  // namespace internal
65 }  // namespace cppgc
66 
67 #endif  // INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
68