< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp

Print this page
rev 53791 : 8203232: Shenandoah: Resolve oops in SATB filter

*** 47,76 **** SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(JavaThread* const t) const { return ShenandoahThreadLocalData::satb_mark_queue(t); } ! static inline bool discard_entry(const void* entry, ShenandoahHeap* heap) { ! return !heap->requires_marking(entry); ! } ! class ShenandoahSATBMarkQueueFilterFn { ! ShenandoahHeap* _heap; public: ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} // Return true if entry should be filtered out (removed), false if // it should be retained. bool operator()(const void* entry) const { ! return discard_entry(entry, _heap); } }; void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) { assert(_heap != NULL, "SATB queue set not initialized"); ! apply_filter(ShenandoahSATBMarkQueueFilterFn(_heap), queue); } bool ShenandoahSATBMarkQueue::should_enqueue_buffer() { bool should_enqueue = SATBMarkQueue::should_enqueue_buffer(); size_t cap = capacity(); --- 47,77 ---- SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(JavaThread* const t) const { return ShenandoahThreadLocalData::satb_mark_queue(t); } ! template <bool RESOLVE> class ShenandoahSATBMarkQueueFilterFn { ! ShenandoahHeap* const _heap; public: ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} // Return true if entry should be filtered out (removed), false if // it should be retained. bool operator()(const void* entry) const { ! return !_heap->requires_marking<RESOLVE>(entry); } }; void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) { assert(_heap != NULL, "SATB queue set not initialized"); ! if (_heap->has_forwarded_objects()) { ! apply_filter(ShenandoahSATBMarkQueueFilterFn<true>(_heap), queue); ! } else { ! apply_filter(ShenandoahSATBMarkQueueFilterFn<false>(_heap), queue); ! } } bool ShenandoahSATBMarkQueue::should_enqueue_buffer() { bool should_enqueue = SATBMarkQueue::should_enqueue_buffer(); size_t cap = capacity();
< prev index next >