68 }
69
70 inline WorkGang* ShenandoahHeap::get_safepoint_workers() {
71 return _safepoint_workers;
72 }
73
74 inline size_t ShenandoahHeap::heap_region_index_containing(const void* addr) const {
75 uintptr_t region_start = ((uintptr_t) addr);
76 uintptr_t index = (region_start - (uintptr_t) base()) >> ShenandoahHeapRegion::region_size_bytes_shift();
77 assert(index < num_regions(), "Region index is in bounds: " PTR_FORMAT, p2i(addr));
78 return index;
79 }
80
81 inline ShenandoahHeapRegion* const ShenandoahHeap::heap_region_containing(const void* addr) const {
82 size_t index = heap_region_index_containing(addr);
83 ShenandoahHeapRegion* const result = get_region(index);
84 assert(addr >= result->bottom() && addr < result->end(), "Heap region contains the address: " PTR_FORMAT, p2i(addr));
85 return result;
86 }
87
88 template <class T>
89 inline oop ShenandoahHeap::update_with_forwarded_not_null(T* p, oop obj) {
90 if (in_collection_set(obj)) {
91 shenandoah_assert_forwarded_except(p, obj, is_full_gc_in_progress() || cancelled_gc() || is_degenerated_gc_in_progress());
92 obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
93 RawAccess<IS_NOT_NULL>::oop_store(p, obj);
94 }
95 #ifdef ASSERT
96 else {
97 shenandoah_assert_not_forwarded(p, obj);
98 }
99 #endif
100 return obj;
101 }
102
103 template <class T>
104 inline oop ShenandoahHeap::maybe_update_with_forwarded(T* p) {
105 T o = RawAccess<>::oop_load(p);
106 if (!CompressedOops::is_null(o)) {
107 oop obj = CompressedOops::decode_not_null(o);
|
68 }
69
70 inline WorkGang* ShenandoahHeap::get_safepoint_workers() {
71 return _safepoint_workers;
72 }
73
74 inline size_t ShenandoahHeap::heap_region_index_containing(const void* addr) const {
75 uintptr_t region_start = ((uintptr_t) addr);
76 uintptr_t index = (region_start - (uintptr_t) base()) >> ShenandoahHeapRegion::region_size_bytes_shift();
77 assert(index < num_regions(), "Region index is in bounds: " PTR_FORMAT, p2i(addr));
78 return index;
79 }
80
81 inline ShenandoahHeapRegion* const ShenandoahHeap::heap_region_containing(const void* addr) const {
82 size_t index = heap_region_index_containing(addr);
83 ShenandoahHeapRegion* const result = get_region(index);
84 assert(addr >= result->bottom() && addr < result->end(), "Heap region contains the address: " PTR_FORMAT, p2i(addr));
85 return result;
86 }
87
88 inline void ShenandoahHeap::enter_evacuation(Thread* t) {
89 _oom_evac_handler.enter_evacuation(t);
90 }
91
92 inline void ShenandoahHeap::leave_evacuation(Thread* t) {
93 _oom_evac_handler.leave_evacuation(t);
94 }
95
96 template <class T>
97 inline oop ShenandoahHeap::update_with_forwarded_not_null(T* p, oop obj) {
98 if (in_collection_set(obj)) {
99 shenandoah_assert_forwarded_except(p, obj, is_full_gc_in_progress() || cancelled_gc() || is_degenerated_gc_in_progress());
100 obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
101 RawAccess<IS_NOT_NULL>::oop_store(p, obj);
102 }
103 #ifdef ASSERT
104 else {
105 shenandoah_assert_not_forwarded(p, obj);
106 }
107 #endif
108 return obj;
109 }
110
111 template <class T>
112 inline oop ShenandoahHeap::maybe_update_with_forwarded(T* p) {
113 T o = RawAccess<>::oop_load(p);
114 if (!CompressedOops::is_null(o)) {
115 oop obj = CompressedOops::decode_not_null(o);
|