< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
Print this page
rev 57097 : 8234768: Shenandoah: Streamline enqueueing runtime barriers
*** 99,138 ****
bool is_traversal_mode = ShenandoahHeap::heap()->is_traversal_mode();
bool on_weak_ref = (decorators & (ON_WEAK_OOP_REF | ON_PHANTOM_OOP_REF)) != 0;
return (on_weak_ref || unknown) && (keep_alive || is_traversal_mode);
}
- template <class T>
- inline void ShenandoahBarrierSet::inline_write_ref_field_pre(T* field, oop new_val) {
- shenandoah_assert_not_in_cset_loc_except(field, _heap->cancelled_gc());
- if (_heap->is_concurrent_mark_in_progress()) {
- T heap_oop = RawAccess<>::oop_load(field);
- if (!CompressedOops::is_null(heap_oop)) {
- enqueue(CompressedOops::decode(heap_oop));
- }
- }
- }
-
- // These are the more general virtual versions.
- void ShenandoahBarrierSet::write_ref_field_pre_work(oop* field, oop new_val) {
- inline_write_ref_field_pre(field, new_val);
- }
-
- void ShenandoahBarrierSet::write_ref_field_pre_work(narrowOop* field, oop new_val) {
- inline_write_ref_field_pre(field, new_val);
- }
-
- void ShenandoahBarrierSet::write_ref_field_pre_work(void* field, oop new_val) {
- guarantee(false, "Not needed");
- }
-
- void ShenandoahBarrierSet::write_ref_field_work(void* v, oop o, bool release) {
- shenandoah_assert_not_in_cset_loc_except(v, _heap->cancelled_gc());
- shenandoah_assert_not_forwarded_except (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress());
- shenandoah_assert_not_in_cset_except (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress());
- }
-
oop ShenandoahBarrierSet::load_reference_barrier_not_null(oop obj) {
if (ShenandoahLoadRefBarrier && _heap->has_forwarded_objects()) {
return load_reference_barrier_impl(obj);
} else {
return obj;
--- 99,108 ----
*** 232,265 ****
} else {
return obj;
}
}
- void ShenandoahBarrierSet::storeval_barrier(oop obj) {
- if (ShenandoahStoreValEnqueueBarrier && !CompressedOops::is_null(obj) && _heap->is_concurrent_traversal_in_progress()) {
- enqueue(obj);
- }
- }
-
- void ShenandoahBarrierSet::keep_alive_barrier(oop obj) {
- if (ShenandoahKeepAliveBarrier && _heap->is_concurrent_mark_in_progress()) {
- enqueue(obj);
- }
- }
-
- void ShenandoahBarrierSet::enqueue(oop obj) {
- shenandoah_assert_not_forwarded_if(NULL, obj, _heap->is_concurrent_traversal_in_progress());
- assert(_satb_mark_queue_set.is_active(), "only get here when SATB active");
-
- // Filter marked objects before hitting the SATB queues. The same predicate would
- // be used by SATBMQ::filter to eliminate already marked objects downstream, but
- // filtering here helps to avoid wasteful SATB queueing work to begin with.
- if (!_heap->requires_marking<false>(obj)) return;
-
- ShenandoahThreadLocalData::satb_mark_queue(Thread::current()).enqueue_known_active(obj);
- }
-
void ShenandoahBarrierSet::on_thread_create(Thread* thread) {
// Create thread local data
ShenandoahThreadLocalData::create(thread);
}
--- 202,211 ----
< prev index next >