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