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 V8_HEAP_MARKING_BARRIER_H_ 6 #define V8_HEAP_MARKING_BARRIER_H_ 7 8 #include "include/v8-internal.h" 9 #include "src/common/globals.h" 10 #include "src/heap/mark-compact.h" 11 12 namespace v8 { 13 namespace internal { 14 15 class Heap; 16 class IncrementalMarking; 17 class LocalHeap; 18 class PagedSpace; 19 class NewSpace; 20 21 class MarkingBarrier { 22 public: 23 explicit MarkingBarrier(Heap*); 24 explicit MarkingBarrier(LocalHeap*); 25 ~MarkingBarrier(); 26 27 void Activate(bool is_compacting); 28 void Deactivate(); 29 void Publish(); 30 31 static void ActivateAll(Heap* heap, bool is_compacting); 32 static void DeactivateAll(Heap* heap); 33 static void PublishAll(Heap* heap); 34 35 void Write(HeapObject host, HeapObjectSlot, HeapObject value); 36 void Write(Code host, RelocInfo*, HeapObject value); 37 void Write(JSArrayBuffer host, ArrayBufferExtension*); 38 void Write(DescriptorArray, int number_of_own_descriptors); 39 40 // Returns true if the slot needs to be recorded. 41 inline bool MarkValue(HeapObject host, HeapObject value); 42 43 private: 44 using MarkingState = MarkCompactCollector::MarkingState; 45 46 inline bool WhiteToGreyAndPush(HeapObject value); 47 48 void RecordRelocSlot(Code host, RelocInfo* rinfo, HeapObject target); 49 50 void ActivateSpace(PagedSpace*); 51 void ActivateSpace(NewSpace*); 52 53 void DeactivateSpace(PagedSpace*); 54 void DeactivateSpace(NewSpace*); 55 56 Heap* heap_; 57 MarkCompactCollector* collector_; 58 IncrementalMarking* incremental_marking_; 59 MarkingWorklist::Local worklist_; 60 MarkingState marking_state_; 61 std::unordered_map<MemoryChunk*, std::unique_ptr<TypedSlots>, 62 MemoryChunk::Hasher> 63 typed_slots_map_; 64 bool is_compacting_ = false; 65 bool is_activated_ = false; 66 bool is_main_thread_barrier_; 67 }; 68 69 } // namespace internal 70 } // namespace v8 71 72 #endif // V8_HEAP_MARKING_BARRIER_H_ 73