< prev index next >

src/hotspot/share/gc/z/zBarrierSet.inline.hpp

Print this page




 197       return;
 198     }
 199     if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value &&
 200         (!oopDesc::is_instanceof_or_null(elem, dst_klass))) {
 201       // Check cast failed
 202       throw_array_store_exception(src_obj, dst_obj, Thread::current());
 203       return;
 204     }
 205 
 206     // Cast is safe, since we know it's never a narrowOop
 207     *(oop*)dst = elem;
 208   }
 209 }
 210 
 211 template <DecoratorSet decorators, typename BarrierSetT>
 212 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) {
 213   ZBarrier::load_barrier_on_oop_fields(src);
 214   Raw::clone_in_heap(src, dst, size);
 215 }
 216 

















 217 //
 218 // Not in heap
 219 //
 220 template <DecoratorSet decorators, typename BarrierSetT>
 221 template <typename T>
 222 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
 223   verify_decorators_absent<ON_UNKNOWN_OOP_REF>();
 224 
 225   const oop o = Raw::oop_load_not_in_heap(addr);
 226   return load_barrier_on_oop_field_preloaded(addr, o);
 227 }
 228 
 229 template <DecoratorSet decorators, typename BarrierSetT>
 230 template <typename T>
 231 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
 232   verify_decorators_present<ON_STRONG_OOP_REF>();
 233   verify_decorators_absent<AS_NO_KEEPALIVE>();
 234 
 235   return Raw::oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value);
 236 }


 197       return;
 198     }
 199     if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value &&
 200         (!oopDesc::is_instanceof_or_null(elem, dst_klass))) {
 201       // Check cast failed
 202       throw_array_store_exception(src_obj, dst_obj, Thread::current());
 203       return;
 204     }
 205 
 206     // Cast is safe, since we know it's never a narrowOop
 207     *(oop*)dst = elem;
 208   }
 209 }
 210 
 211 template <DecoratorSet decorators, typename BarrierSetT>
 212 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) {
 213   ZBarrier::load_barrier_on_oop_fields(src);
 214   Raw::clone_in_heap(src, dst, size);
 215 }
 216 
 217 template <DecoratorSet decorators, typename BarrierSetT>
 218 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::value_copy_in_heap(void* src, void* dst, ValueKlass* md) {
 219   if (md->contains_oops()) {
 220     // src/dst aren't oops, need offset to adjust oop map offset
 221     const address src_oop_addr_offset = ((address) src) - md->first_field_offset();
 222 
 223     OopMapBlock* map = md->start_of_nonstatic_oop_maps();
 224     OopMapBlock* const end = map + md->nonstatic_oop_map_count();
 225     while (map != end) {
 226       address soop_address = src_oop_addr_offset + map->offset();
 227       ZBarrier::load_barrier_on_oop_array((oop*) soop_address, map->count());
 228       map++;
 229     }
 230   }
 231   Raw::value_copy_in_heap(src, dst, md);
 232 }
 233 
 234 //
 235 // Not in heap
 236 //
 237 template <DecoratorSet decorators, typename BarrierSetT>
 238 template <typename T>
 239 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
 240   verify_decorators_absent<ON_UNKNOWN_OOP_REF>();
 241 
 242   const oop o = Raw::oop_load_not_in_heap(addr);
 243   return load_barrier_on_oop_field_preloaded(addr, o);
 244 }
 245 
 246 template <DecoratorSet decorators, typename BarrierSetT>
 247 template <typename T>
 248 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
 249   verify_decorators_present<ON_STRONG_OOP_REF>();
 250   verify_decorators_absent<AS_NO_KEEPALIVE>();
 251 
 252   return Raw::oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value);
 253 }
< prev index next >