5#ifndef V8_SANDBOX_COMPACTIBLE_EXTERNAL_ENTITY_TABLE_H_
6#define V8_SANDBOX_COMPACTIBLE_EXTERNAL_ENTITY_TABLE_H_
12#ifdef V8_COMPRESS_POINTERS
22enum class ExternalEntityTableCompactionOutcome {
83template <
typename Entry,
size_t size>
85 :
public ExternalEntityTable<Entry, size> {
86 using Base = ExternalEntityTable<Entry, size>;
89 static constexpr bool kSupportsCompaction =
true;
91 struct CompactionResult {
92 uint32_t start_of_evacuation_area;
96 CompactibleExternalEntityTable() =
default;
97 CompactibleExternalEntityTable(
const CompactibleExternalEntityTable&) =
99 CompactibleExternalEntityTable& operator=(
100 const CompactibleExternalEntityTable&) =
delete;
104 struct Space :
public Base::Space {
106 Space() : start_of_evacuation_area_(kNotCompactingMarker) {}
110 void StartCompactingIfNeeded();
113 friend class CompactibleExternalEntityTable<Entry, size>;
114 friend class ExternalPointerTable;
115 friend class CppHeapPointerTable;
118 inline bool IsCompacting();
119 inline void StartCompacting(uint32_t start_of_evacuation_area);
120 inline void StopCompacting();
121 inline void AbortCompacting(uint32_t start_of_evacuation_area);
122 inline bool CompactingWasAborted();
124 inline bool FieldWasInvalidated(Address field_address)
const;
125 inline void ClearInvalidatedFields();
126 inline void AddInvalidatedField(Address field_address);
132 static constexpr uint32_t kNotCompactingMarker =
133 std::numeric_limits<uint32_t>::max();
141 static constexpr uint32_t kCompactionAbortedMarker = 0xf0000000;
154 std::atomic<uint32_t> start_of_evacuation_area_;
160 std::vector<Address> invalidated_fields_;
163 base::Mutex invalidated_fields_mutex_;
169 inline uint32_t AllocateEntry(Space* space);
171 CompactionResult FinishCompaction(Space* space, Histogram* counter);
173 inline void MaybeCreateEvacuationEntry(Space* space, uint32_t index,
174 Address handle_location);
#define V8_EXPORT_PRIVATE