106 assert(!ZAddress::is_weak_good(addr), "Should not be weak good");
107 return ZHeap::heap()->relocate_object(addr);
108 }
109
110 uintptr_t ZBarrier::relocate_or_mark(uintptr_t addr) {
111 return during_relocate() ? relocate(addr) : mark<Strong, Publish>(addr);
112 }
113
114 uintptr_t ZBarrier::relocate_or_remap(uintptr_t addr) {
115 return during_relocate() ? relocate(addr) : remap(addr);
116 }
117
118 //
119 // Load barrier
120 //
121 uintptr_t ZBarrier::load_barrier_on_oop_slow_path(uintptr_t addr) {
122 return relocate_or_mark(addr);
123 }
124
125 void ZBarrier::load_barrier_on_oop_fields(oop o) {
126 assert(ZAddress::is_good(ZOop::to_address(o)), "Should be good");
127 ZLoadBarrierOopClosure cl;
128 o->oop_iterate(&cl);
129 }
130
131 //
132 // Weak load barrier
133 //
134 uintptr_t ZBarrier::weak_load_barrier_on_oop_slow_path(uintptr_t addr) {
135 return ZAddress::is_weak_good(addr) ? ZAddress::good(addr) : relocate_or_remap(addr);
136 }
137
138 uintptr_t ZBarrier::weak_load_barrier_on_weak_oop_slow_path(uintptr_t addr) {
139 const uintptr_t good_addr = weak_load_barrier_on_oop_slow_path(addr);
140 if (ZHeap::heap()->is_object_strongly_live(good_addr)) {
141 return good_addr;
142 }
143
144 // Not strongly live
145 return 0;
146 }
|
106 assert(!ZAddress::is_weak_good(addr), "Should not be weak good");
107 return ZHeap::heap()->relocate_object(addr);
108 }
109
110 uintptr_t ZBarrier::relocate_or_mark(uintptr_t addr) {
111 return during_relocate() ? relocate(addr) : mark<Strong, Publish>(addr);
112 }
113
114 uintptr_t ZBarrier::relocate_or_remap(uintptr_t addr) {
115 return during_relocate() ? relocate(addr) : remap(addr);
116 }
117
118 //
119 // Load barrier
120 //
121 uintptr_t ZBarrier::load_barrier_on_oop_slow_path(uintptr_t addr) {
122 return relocate_or_mark(addr);
123 }
124
125 void ZBarrier::load_barrier_on_oop_fields(oop o) {
126 assert(ZOop::is_good(o), "Should be good");
127 ZLoadBarrierOopClosure cl;
128 o->oop_iterate(&cl);
129 }
130
131 //
132 // Weak load barrier
133 //
134 uintptr_t ZBarrier::weak_load_barrier_on_oop_slow_path(uintptr_t addr) {
135 return ZAddress::is_weak_good(addr) ? ZAddress::good(addr) : relocate_or_remap(addr);
136 }
137
138 uintptr_t ZBarrier::weak_load_barrier_on_weak_oop_slow_path(uintptr_t addr) {
139 const uintptr_t good_addr = weak_load_barrier_on_oop_slow_path(addr);
140 if (ZHeap::heap()->is_object_strongly_live(good_addr)) {
141 return good_addr;
142 }
143
144 // Not strongly live
145 return 0;
146 }
|