< prev index next >

src/hotspot/share/oops/access.inline.hpp

Print this page
rev 50331 : 8198285: More consistent Access API for arraycopy


 106   template <class GCBarrierType, DecoratorSet decorators>
 107   struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG, decorators>: public AllStatic {
 108     template <typename T>
 109     static T access_barrier(T new_value, void* addr, T compare_value) {
 110       return GCBarrierType::atomic_cmpxchg_in_heap(new_value, reinterpret_cast<T*>(addr), compare_value);
 111     }
 112 
 113     static oop oop_access_barrier(oop new_value, void* addr, oop compare_value) {
 114       typedef typename HeapOopType<decorators>::type OopType;
 115       if (HasDecorator<decorators, IN_HEAP>::value) {
 116         return GCBarrierType::oop_atomic_cmpxchg_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value);
 117       } else {
 118         return GCBarrierType::oop_atomic_cmpxchg_not_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value);
 119       }
 120     }
 121   };
 122 
 123   template <class GCBarrierType, DecoratorSet decorators>
 124   struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic {
 125     template <typename T>
 126     static bool access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
 127       GCBarrierType::arraycopy_in_heap(src_obj, dst_obj, src, dst, length);
 128       return true;
 129     }
 130 
 131     template <typename T>
 132     static bool oop_access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
 133       typedef typename HeapOopType<decorators>::type OopType;
 134       return GCBarrierType::oop_arraycopy_in_heap(src_obj, dst_obj,
 135                                                   reinterpret_cast<OopType*>(src),
 136                                                   reinterpret_cast<OopType*>(dst), length);
 137     }
 138   };
 139 
 140   template <class GCBarrierType, DecoratorSet decorators>
 141   struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic {
 142     template <typename T>
 143     static void access_barrier(oop base, ptrdiff_t offset, T value) {
 144       GCBarrierType::store_in_heap_at(base, offset, value);
 145     }
 146 
 147     static void oop_access_barrier(oop base, ptrdiff_t offset, oop value) {
 148       GCBarrierType::oop_store_in_heap_at(base, offset, value);
 149     }
 150   };
 151 
 152   template <class GCBarrierType, DecoratorSet decorators>
 153   struct PostRuntimeDispatch<GCBarrierType, BARRIER_LOAD_AT, decorators>: public AllStatic {
 154     template <typename T>
 155     static T access_barrier(oop base, ptrdiff_t offset) {
 156       return GCBarrierType::template load_in_heap_at<T>(base, offset);


 320     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_CMPXCHG_AT>::resolve_barrier();
 321     _atomic_cmpxchg_at_func = function;
 322     return function(new_value, base, offset, compare_value);
 323   }
 324 
 325   template <DecoratorSet decorators, typename T>
 326   T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::atomic_xchg_init(T new_value, void* addr) {
 327     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG>::resolve_barrier();
 328     _atomic_xchg_func = function;
 329     return function(new_value, addr);
 330   }
 331 
 332   template <DecoratorSet decorators, typename T>
 333   T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::atomic_xchg_at_init(T new_value, oop base, ptrdiff_t offset) {
 334     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG_AT>::resolve_barrier();
 335     _atomic_xchg_at_func = function;
 336     return function(new_value, base, offset);
 337   }
 338 
 339   template <DecoratorSet decorators, typename T>
 340   bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, arrayOop dst_obj, T *src, T* dst, size_t length) {
 341     func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier();
 342     _arraycopy_func = function;
 343     return function(src_obj, dst_obj, src, dst, length);
 344   }
 345 
 346   template <DecoratorSet decorators, typename T>
 347   void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) {
 348     func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier();
 349     _clone_func = function;
 350     function(src, dst, size);
 351   }
 352 
 353   template <DecoratorSet decorators, typename T>
 354   oop RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::resolve_init(oop obj) {
 355     func_t function = BarrierResolver<decorators, func_t, BARRIER_RESOLVE>::resolve_barrier();
 356     _resolve_func = function;
 357     return function(obj);
 358   }
 359 
 360   template <DecoratorSet decorators, typename T>
 361   bool RuntimeDispatch<decorators, T, BARRIER_EQUALS>::equals_init(oop o1, oop o2) {
 362     func_t function = BarrierResolver<decorators, func_t, BARRIER_EQUALS>::resolve_barrier();
 363     _equals_func = function;


 106   template <class GCBarrierType, DecoratorSet decorators>
 107   struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG, decorators>: public AllStatic {
 108     template <typename T>
 109     static T access_barrier(T new_value, void* addr, T compare_value) {
 110       return GCBarrierType::atomic_cmpxchg_in_heap(new_value, reinterpret_cast<T*>(addr), compare_value);
 111     }
 112 
 113     static oop oop_access_barrier(oop new_value, void* addr, oop compare_value) {
 114       typedef typename HeapOopType<decorators>::type OopType;
 115       if (HasDecorator<decorators, IN_HEAP>::value) {
 116         return GCBarrierType::oop_atomic_cmpxchg_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value);
 117       } else {
 118         return GCBarrierType::oop_atomic_cmpxchg_not_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value);
 119       }
 120     }
 121   };
 122 
 123   template <class GCBarrierType, DecoratorSet decorators>
 124   struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic {
 125     template <typename T>
 126     static bool access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) {
 127       GCBarrierType::arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
 128       return true;
 129     }
 130 
 131     template <typename T>
 132     static bool oop_access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) {
 133       typedef typename HeapOopType<decorators>::type OopType;
 134       return GCBarrierType::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, reinterpret_cast<const OopType*>(src_raw),
 135                                                   dst_obj, dst_offset_in_bytes, reinterpret_cast<OopType*>(dst_raw), length);

 136     }
 137   };
 138 
 139   template <class GCBarrierType, DecoratorSet decorators>
 140   struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic {
 141     template <typename T>
 142     static void access_barrier(oop base, ptrdiff_t offset, T value) {
 143       GCBarrierType::store_in_heap_at(base, offset, value);
 144     }
 145 
 146     static void oop_access_barrier(oop base, ptrdiff_t offset, oop value) {
 147       GCBarrierType::oop_store_in_heap_at(base, offset, value);
 148     }
 149   };
 150 
 151   template <class GCBarrierType, DecoratorSet decorators>
 152   struct PostRuntimeDispatch<GCBarrierType, BARRIER_LOAD_AT, decorators>: public AllStatic {
 153     template <typename T>
 154     static T access_barrier(oop base, ptrdiff_t offset) {
 155       return GCBarrierType::template load_in_heap_at<T>(base, offset);


 319     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_CMPXCHG_AT>::resolve_barrier();
 320     _atomic_cmpxchg_at_func = function;
 321     return function(new_value, base, offset, compare_value);
 322   }
 323 
 324   template <DecoratorSet decorators, typename T>
 325   T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::atomic_xchg_init(T new_value, void* addr) {
 326     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG>::resolve_barrier();
 327     _atomic_xchg_func = function;
 328     return function(new_value, addr);
 329   }
 330 
 331   template <DecoratorSet decorators, typename T>
 332   T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::atomic_xchg_at_init(T new_value, oop base, ptrdiff_t offset) {
 333     func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG_AT>::resolve_barrier();
 334     _atomic_xchg_at_func = function;
 335     return function(new_value, base, offset);
 336   }
 337 
 338   template <DecoratorSet decorators, typename T>
 339   bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) {
 340     func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier();
 341     _arraycopy_func = function;
 342     return function(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
 343   }
 344 
 345   template <DecoratorSet decorators, typename T>
 346   void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) {
 347     func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier();
 348     _clone_func = function;
 349     function(src, dst, size);
 350   }
 351 
 352   template <DecoratorSet decorators, typename T>
 353   oop RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::resolve_init(oop obj) {
 354     func_t function = BarrierResolver<decorators, func_t, BARRIER_RESOLVE>::resolve_barrier();
 355     _resolve_func = function;
 356     return function(obj);
 357   }
 358 
 359   template <DecoratorSet decorators, typename T>
 360   bool RuntimeDispatch<decorators, T, BARRIER_EQUALS>::equals_init(oop o1, oop o2) {
 361     func_t function = BarrierResolver<decorators, func_t, BARRIER_EQUALS>::resolve_barrier();
 362     _equals_func = function;
< prev index next >