< prev index next >

src/hotspot/share/oops/access.hpp

Print this page




 114     const DecoratorSet oop_decorators = AS_DECORATOR_MASK | IN_DECORATOR_MASK |
 115                                         (ON_DECORATOR_MASK ^ ON_UNKNOWN_OOP_REF) | // no unknown oop refs outside of the heap
 116                                         IS_ARRAY | IS_NOT_NULL | IS_DEST_UNINITIALIZED;
 117     verify_decorators<expected_mo_decorators | oop_decorators>();
 118   }
 119 
 120   template <DecoratorSet expected_mo_decorators>
 121   static void verify_heap_oop_decorators() {
 122     const DecoratorSet heap_oop_decorators = AS_DECORATOR_MASK | ON_DECORATOR_MASK |
 123                                              IN_HEAP | IS_ARRAY | IS_NOT_NULL;
 124     verify_decorators<expected_mo_decorators | heap_oop_decorators>();
 125   }
 126 
 127   static const DecoratorSet load_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_ACQUIRE | MO_SEQ_CST;
 128   static const DecoratorSet store_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_RELEASE | MO_SEQ_CST;
 129   static const DecoratorSet atomic_xchg_mo_decorators = MO_SEQ_CST;
 130   static const DecoratorSet atomic_cmpxchg_mo_decorators = MO_RELAXED | MO_SEQ_CST;
 131 
 132 protected:
 133   template <typename T>
 134   static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw,
 135                                    arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
 136                                    size_t length) {
 137     verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP |
 138                       AS_DECORATOR_MASK | IS_ARRAY | IS_DEST_UNINITIALIZED>();
 139     return AccessInternal::arraycopy<decorators | INTERNAL_VALUE_IS_OOP>(src_obj, src_offset_in_bytes, src_raw,
 140                                                                          dst_obj, dst_offset_in_bytes, dst_raw,
 141                                                                          length);
 142   }
 143 
 144   template <typename T>
 145   static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw,
 146                                arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
 147                                size_t length) {
 148     verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP |
 149                       AS_DECORATOR_MASK | IS_ARRAY>();
 150     AccessInternal::arraycopy<decorators>(src_obj, src_offset_in_bytes, src_raw,
 151                                           dst_obj, dst_offset_in_bytes, dst_raw,
 152                                           length);
 153   }
 154 
 155 public:
 156   // Primitive heap accesses
 157   static inline AccessInternal::LoadAtProxy<decorators> load_at(oop base, ptrdiff_t offset) {
 158     verify_primitive_decorators<load_mo_decorators>();
 159     return AccessInternal::LoadAtProxy<decorators>(base, offset);


 312   }
 313 
 314   template <typename T>
 315   static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes,
 316                                          T* dst,
 317                                          size_t length) {
 318     AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const T*>(NULL),
 319                        NULL, 0, dst,
 320                        length);
 321   }
 322 
 323   template <typename T>
 324   static inline void arraycopy_from_native(const T* src,
 325                                            arrayOop dst_obj, size_t dst_offset_in_bytes,
 326                                            size_t length) {
 327     AccessT::arraycopy(NULL, 0, src,
 328                        dst_obj, dst_offset_in_bytes, reinterpret_cast<T*>(NULL),
 329                        length);
 330   }
 331 
 332   static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes,
 333                                    arrayOop dst_obj, size_t dst_offset_in_bytes,
 334                                    size_t length) {
 335     return AccessT::oop_arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const HeapWord*>(NULL),
 336                                   dst_obj, dst_offset_in_bytes, reinterpret_cast<HeapWord*>(NULL),
 337                                   length);
 338   }
 339 
 340   template <typename T>
 341   static inline bool oop_arraycopy_raw(T* src, T* dst, size_t length) {
 342     return AccessT::oop_arraycopy(NULL, 0, src,
 343                                   NULL, 0, dst,
 344                                   length);
 345   }
 346 
 347 };
 348 
 349 template <DecoratorSet decorators>
 350 template <DecoratorSet expected_decorators>
 351 void Access<decorators>::verify_decorators() {
 352   STATIC_ASSERT((~expected_decorators & decorators) == 0); // unexpected decorator used
 353   const DecoratorSet barrier_strength_decorators = decorators & AS_DECORATOR_MASK;
 354   STATIC_ASSERT(barrier_strength_decorators == 0 || ( // make sure barrier strength decorators are disjoint if set
 355     (barrier_strength_decorators ^ AS_NO_KEEPALIVE) == 0 ||
 356     (barrier_strength_decorators ^ AS_RAW) == 0 ||
 357     (barrier_strength_decorators ^ AS_NORMAL) == 0
 358   ));
 359   const DecoratorSet ref_strength_decorators = decorators & ON_DECORATOR_MASK;
 360   STATIC_ASSERT(ref_strength_decorators == 0 || ( // make sure ref strength decorators are disjoint if set
 361     (ref_strength_decorators ^ ON_STRONG_OOP_REF) == 0 ||
 362     (ref_strength_decorators ^ ON_WEAK_OOP_REF) == 0 ||


 114     const DecoratorSet oop_decorators = AS_DECORATOR_MASK | IN_DECORATOR_MASK |
 115                                         (ON_DECORATOR_MASK ^ ON_UNKNOWN_OOP_REF) | // no unknown oop refs outside of the heap
 116                                         IS_ARRAY | IS_NOT_NULL | IS_DEST_UNINITIALIZED;
 117     verify_decorators<expected_mo_decorators | oop_decorators>();
 118   }
 119 
 120   template <DecoratorSet expected_mo_decorators>
 121   static void verify_heap_oop_decorators() {
 122     const DecoratorSet heap_oop_decorators = AS_DECORATOR_MASK | ON_DECORATOR_MASK |
 123                                              IN_HEAP | IS_ARRAY | IS_NOT_NULL;
 124     verify_decorators<expected_mo_decorators | heap_oop_decorators>();
 125   }
 126 
 127   static const DecoratorSet load_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_ACQUIRE | MO_SEQ_CST;
 128   static const DecoratorSet store_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_RELEASE | MO_SEQ_CST;
 129   static const DecoratorSet atomic_xchg_mo_decorators = MO_SEQ_CST;
 130   static const DecoratorSet atomic_cmpxchg_mo_decorators = MO_RELAXED | MO_SEQ_CST;
 131 
 132 protected:
 133   template <typename T>
 134   static inline void oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw,
 135                                    arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
 136                                    size_t length) {
 137     verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP |
 138                       AS_DECORATOR_MASK | IS_ARRAY | IS_DEST_UNINITIALIZED>();
 139     AccessInternal::arraycopy<decorators | INTERNAL_VALUE_IS_OOP>(src_obj, src_offset_in_bytes, src_raw,
 140                                                                   dst_obj, dst_offset_in_bytes, dst_raw,
 141                                                                   length);
 142   }
 143 
 144   template <typename T>
 145   static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw,
 146                                arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
 147                                size_t length) {
 148     verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP |
 149                       AS_DECORATOR_MASK | IS_ARRAY>();
 150     AccessInternal::arraycopy<decorators>(src_obj, src_offset_in_bytes, src_raw,
 151                                           dst_obj, dst_offset_in_bytes, dst_raw,
 152                                           length);
 153   }
 154 
 155 public:
 156   // Primitive heap accesses
 157   static inline AccessInternal::LoadAtProxy<decorators> load_at(oop base, ptrdiff_t offset) {
 158     verify_primitive_decorators<load_mo_decorators>();
 159     return AccessInternal::LoadAtProxy<decorators>(base, offset);


 312   }
 313 
 314   template <typename T>
 315   static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes,
 316                                          T* dst,
 317                                          size_t length) {
 318     AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const T*>(NULL),
 319                        NULL, 0, dst,
 320                        length);
 321   }
 322 
 323   template <typename T>
 324   static inline void arraycopy_from_native(const T* src,
 325                                            arrayOop dst_obj, size_t dst_offset_in_bytes,
 326                                            size_t length) {
 327     AccessT::arraycopy(NULL, 0, src,
 328                        dst_obj, dst_offset_in_bytes, reinterpret_cast<T*>(NULL),
 329                        length);
 330   }
 331 
 332   static inline void oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes,
 333                                    arrayOop dst_obj, size_t dst_offset_in_bytes,
 334                                    size_t length) {
 335     AccessT::oop_arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const HeapWord*>(NULL),
 336                            dst_obj, dst_offset_in_bytes, reinterpret_cast<HeapWord*>(NULL),
 337                            length);
 338   }
 339 
 340   template <typename T>
 341   static inline void oop_arraycopy_raw(T* src, T* dst, size_t length) {
 342     AccessT::oop_arraycopy(NULL, 0, src,
 343                            NULL, 0, dst,
 344                            length);
 345   }
 346 
 347 };
 348 
 349 template <DecoratorSet decorators>
 350 template <DecoratorSet expected_decorators>
 351 void Access<decorators>::verify_decorators() {
 352   STATIC_ASSERT((~expected_decorators & decorators) == 0); // unexpected decorator used
 353   const DecoratorSet barrier_strength_decorators = decorators & AS_DECORATOR_MASK;
 354   STATIC_ASSERT(barrier_strength_decorators == 0 || ( // make sure barrier strength decorators are disjoint if set
 355     (barrier_strength_decorators ^ AS_NO_KEEPALIVE) == 0 ||
 356     (barrier_strength_decorators ^ AS_RAW) == 0 ||
 357     (barrier_strength_decorators ^ AS_NORMAL) == 0
 358   ));
 359   const DecoratorSet ref_strength_decorators = decorators & ON_DECORATOR_MASK;
 360   STATIC_ASSERT(ref_strength_decorators == 0 || ( // make sure ref strength decorators are disjoint if set
 361     (ref_strength_decorators ^ ON_STRONG_OOP_REF) == 0 ||
 362     (ref_strength_decorators ^ ON_WEAK_OOP_REF) == 0 ||
< prev index next >