75 HeapWord* addr = (HeapWord*) obj; 76 return (! allocated_after_next_mark_start(addr)) && _next_mark_bit_map->parMark(addr); 77 } 78 79 inline bool ShenandoahHeap::is_marked_next(oop obj) const { 80 HeapWord* addr = (HeapWord*) obj; 81 return allocated_after_next_mark_start(addr) || _next_mark_bit_map->isMarked(addr); 82 } 83 84 inline bool ShenandoahHeap::is_marked_complete(oop obj) const { 85 HeapWord* addr = (HeapWord*) obj; 86 return allocated_after_complete_mark_start(addr) || _complete_mark_bit_map->isMarked(addr); 87 } 88 89 inline bool ShenandoahHeap::need_update_refs() const { 90 return _need_update_refs; 91 } 92 93 inline size_t ShenandoahHeap::heap_region_index_containing(const void* addr) const { 94 uintptr_t region_start = ((uintptr_t) addr); 95 uintptr_t index = (region_start - (uintptr_t) _first_region_bottom) >> ShenandoahHeapRegion::region_size_shift(); 96 #ifdef ASSERT 97 if (!(index < _num_regions)) { 98 tty->print_cr("heap region does not contain address, first_region_bottom: "PTR_FORMAT \ 99 ", real bottom of first region: "PTR_FORMAT", num_regions: "SIZE_FORMAT", region_size: "SIZE_FORMAT, 100 p2i(_first_region_bottom), 101 p2i(_ordered_regions->get(0)->bottom()), 102 _num_regions, 103 ShenandoahHeapRegion::region_size_bytes()); 104 } 105 #endif 106 assert(index < _num_regions, "heap region index must be in range"); 107 return index; 108 } 109 110 inline ShenandoahHeapRegion* ShenandoahHeap::heap_region_containing(const void* addr) const { 111 size_t index = heap_region_index_containing(addr); 112 ShenandoahHeapRegion* result = _ordered_regions->get(index); 113 #ifdef ASSERT 114 if (!(addr >= result->bottom() && addr < result->end())) { 115 tty->print_cr("heap region does not contain address, first_region_bottom: "PTR_FORMAT \ 116 ", real bottom of first region: "PTR_FORMAT", num_regions: "SIZE_FORMAT, 117 p2i(_first_region_bottom), 118 p2i(_ordered_regions->get(0)->bottom()), 119 _num_regions); 120 } 121 #endif 122 assert(addr >= result->bottom() && addr < result->end(), "address must be in found region"); 123 return result; 124 } 125 126 template <class T> 127 inline oop ShenandoahHeap::update_oop_ref_not_null(T* p, oop obj) { 128 if (in_collection_set(obj)) { 129 oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj); 130 assert(! oopDesc::unsafe_equals(forw, obj) || is_full_gc_in_progress() || cancelled_concgc(), "expect forwarded object"); 131 obj = forw; 132 oopDesc::encode_store_heap_oop(p, obj); 133 } 134 #ifdef ASSERT 135 else { 136 assert(oopDesc::unsafe_equals(obj, ShenandoahBarrierSet::resolve_oop_static_not_null(obj)), "expect not forwarded"); 137 } | 75 HeapWord* addr = (HeapWord*) obj; 76 return (! allocated_after_next_mark_start(addr)) && _next_mark_bit_map->parMark(addr); 77 } 78 79 inline bool ShenandoahHeap::is_marked_next(oop obj) const { 80 HeapWord* addr = (HeapWord*) obj; 81 return allocated_after_next_mark_start(addr) || _next_mark_bit_map->isMarked(addr); 82 } 83 84 inline bool ShenandoahHeap::is_marked_complete(oop obj) const { 85 HeapWord* addr = (HeapWord*) obj; 86 return allocated_after_complete_mark_start(addr) || _complete_mark_bit_map->isMarked(addr); 87 } 88 89 inline bool ShenandoahHeap::need_update_refs() const { 90 return _need_update_refs; 91 } 92 93 inline size_t ShenandoahHeap::heap_region_index_containing(const void* addr) const { 94 uintptr_t region_start = ((uintptr_t) addr); 95 uintptr_t index = (region_start - (uintptr_t) base()) >> ShenandoahHeapRegion::region_size_shift(); 96 #ifdef ASSERT 97 if (!(index < _num_regions)) { 98 tty->print_cr("heap region does not contain address, heap base: "PTR_FORMAT \ 99 ", real bottom of first region: "PTR_FORMAT", num_regions: "SIZE_FORMAT", region_size: "SIZE_FORMAT, 100 p2i(base()), 101 p2i(_ordered_regions->get(0)->bottom()), 102 _num_regions, 103 ShenandoahHeapRegion::region_size_bytes()); 104 } 105 #endif 106 assert(index < _num_regions, "heap region index must be in range"); 107 return index; 108 } 109 110 inline ShenandoahHeapRegion* ShenandoahHeap::heap_region_containing(const void* addr) const { 111 size_t index = heap_region_index_containing(addr); 112 ShenandoahHeapRegion* result = _ordered_regions->get(index); 113 #ifdef ASSERT 114 if (!(addr >= result->bottom() && addr < result->end())) { 115 tty->print_cr("heap region does not contain address, heap base: "PTR_FORMAT \ 116 ", real bottom of first region: "PTR_FORMAT", num_regions: "SIZE_FORMAT, 117 p2i(base()), 118 p2i(_ordered_regions->get(0)->bottom()), 119 _num_regions); 120 } 121 #endif 122 assert(addr >= result->bottom() && addr < result->end(), "address must be in found region"); 123 return result; 124 } 125 126 template <class T> 127 inline oop ShenandoahHeap::update_oop_ref_not_null(T* p, oop obj) { 128 if (in_collection_set(obj)) { 129 oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj); 130 assert(! oopDesc::unsafe_equals(forw, obj) || is_full_gc_in_progress() || cancelled_concgc(), "expect forwarded object"); 131 obj = forw; 132 oopDesc::encode_store_heap_oop(p, obj); 133 } 134 #ifdef ASSERT 135 else { 136 assert(oopDesc::unsafe_equals(obj, ShenandoahBarrierSet::resolve_oop_static_not_null(obj)), "expect not forwarded"); 137 } |