51 static ShenandoahBarrierSetAssembler* assembler();
52
53 inline static ShenandoahBarrierSet* barrier_set() {
54 return barrier_set_cast<ShenandoahBarrierSet>(BarrierSet::barrier_set());
55 }
56
57 static ShenandoahSATBMarkQueueSet& satb_mark_queue_set() {
58 return barrier_set()->_satb_mark_queue_set;
59 }
60
61 static bool need_load_reference_barrier(DecoratorSet decorators, BasicType type);
62 static bool use_load_reference_barrier_native(DecoratorSet decorators, BasicType type);
63 static bool need_keep_alive_barrier(DecoratorSet decorators, BasicType type);
64
65 void print_on(outputStream* st) const;
66
67 bool is_a(BarrierSet::Name bsn);
68
69 bool is_aligned(HeapWord* hw);
70
71 template <class T> void
72 write_ref_array_pre_work(T* src, T* dst, size_t count, bool dest_uninitialized);
73
74 inline void arraycopy_pre(oop* src, oop* dst, size_t count);
75 inline void arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count);
76 inline void arraycopy_update(oop* src, size_t count);
77 inline void arraycopy_update(narrowOop* src, size_t count);
78 inline void clone_barrier(oop src);
79 void clone_barrier_runtime(oop src);
80
81 virtual void on_thread_create(Thread* thread);
82 virtual void on_thread_destroy(Thread* thread);
83 virtual void on_thread_attach(Thread* thread);
84 virtual void on_thread_detach(Thread* thread);
85
86 static inline oop resolve_forwarded_not_null(oop p);
87 static inline oop resolve_forwarded_not_null_mutator(oop p);
88 static inline oop resolve_forwarded(oop p);
89
90 template <DecoratorSet decorators, typename T>
91 inline void satb_barrier(T* field);
92 inline void satb_enqueue(oop value);
93 inline void storeval_barrier(oop obj);
94
95 template <DecoratorSet decorators>
96 inline void keep_alive_if_weak(oop value);
97 inline void keep_alive_if_weak(DecoratorSet decorators, oop value);
98
99 inline void enqueue(oop obj);
100
101 oop load_reference_barrier(oop obj);
102 oop load_reference_barrier_not_null(oop obj);
103
104 oop load_reference_barrier_mutator(oop obj, oop* load_addr);
105 oop load_reference_barrier_mutator(oop obj, narrowOop* load_addr);
106
107 template <class T>
108 oop load_reference_barrier_mutator_work(oop obj, T* load_addr);
109
110 oop load_reference_barrier_native(oop obj, oop* load_addr);
111 oop load_reference_barrier_native(oop obj, narrowOop* load_addr);
112
113 private:
114 template <class T>
115 inline void arraycopy_pre_work(T* src, T* dst, size_t count);
116 template <class T, bool HAS_FWD, bool EVAC, bool ENQUEUE>
117 inline void arraycopy_work(T* src, size_t count);
118 template <class T>
119 inline void arraycopy_update_impl(T* src, size_t count);
120
121 oop load_reference_barrier_impl(oop obj);
122
123 template <class T>
124 oop load_reference_barrier_native_impl(oop obj, T* load_addr);
125
126 inline bool skip_bulk_update(HeapWord* dst);
127 public:
128 // Callbacks for runtime accesses.
129 template <DecoratorSet decorators, typename BarrierSetT = ShenandoahBarrierSet>
130 class AccessBarrier: public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
131 typedef BarrierSet::AccessBarrier<decorators, BarrierSetT> Raw;
132
133 public:
134 // Heap oop accesses. These accessors get resolved when
135 // IN_HEAP is set (e.g. when using the HeapAccess API), it is
136 // an oop_* overload, and the barrier strength is AS_NORMAL.
137 template <typename T>
138 static oop oop_load_in_heap(T* addr);
139 static oop oop_load_in_heap_at(oop base, ptrdiff_t offset);
140
141 template <typename T>
142 static void oop_store_in_heap(T* addr, oop value);
143 static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value);
144
145 template <typename T>
146 static oop oop_atomic_cmpxchg_in_heap(T* addr, oop compare_value, oop new_value);
|
51 static ShenandoahBarrierSetAssembler* assembler();
52
53 inline static ShenandoahBarrierSet* barrier_set() {
54 return barrier_set_cast<ShenandoahBarrierSet>(BarrierSet::barrier_set());
55 }
56
57 static ShenandoahSATBMarkQueueSet& satb_mark_queue_set() {
58 return barrier_set()->_satb_mark_queue_set;
59 }
60
61 static bool need_load_reference_barrier(DecoratorSet decorators, BasicType type);
62 static bool use_load_reference_barrier_native(DecoratorSet decorators, BasicType type);
63 static bool need_keep_alive_barrier(DecoratorSet decorators, BasicType type);
64
65 void print_on(outputStream* st) const;
66
67 bool is_a(BarrierSet::Name bsn);
68
69 bool is_aligned(HeapWord* hw);
70
71 template <class T>
72 inline void arraycopy_barrier(T* src, T* dst, size_t count);
73 inline void clone_barrier(oop src);
74 void clone_barrier_runtime(oop src);
75
76 virtual void on_thread_create(Thread* thread);
77 virtual void on_thread_destroy(Thread* thread);
78 virtual void on_thread_attach(Thread* thread);
79 virtual void on_thread_detach(Thread* thread);
80
81 static inline oop resolve_forwarded_not_null(oop p);
82 static inline oop resolve_forwarded_not_null_mutator(oop p);
83 static inline oop resolve_forwarded(oop p);
84
85 template <DecoratorSet decorators, typename T>
86 inline void satb_barrier(T* field);
87 inline void satb_enqueue(oop value);
88 inline void storeval_barrier(oop obj);
89
90 template <DecoratorSet decorators>
91 inline void keep_alive_if_weak(oop value);
92 inline void keep_alive_if_weak(DecoratorSet decorators, oop value);
93
94 inline void enqueue(oop obj);
95
96 oop load_reference_barrier(oop obj);
97 oop load_reference_barrier_not_null(oop obj);
98
99 oop load_reference_barrier_mutator(oop obj, oop* load_addr);
100 oop load_reference_barrier_mutator(oop obj, narrowOop* load_addr);
101
102 template <class T>
103 oop load_reference_barrier_mutator_work(oop obj, T* load_addr);
104
105 oop load_reference_barrier_native(oop obj, oop* load_addr);
106 oop load_reference_barrier_native(oop obj, narrowOop* load_addr);
107
108 private:
109 template <class T>
110 inline void arraycopy_marking(T* src, T* dst, size_t count);
111 template <class T>
112 inline void arraycopy_evacuation(T* src, size_t count);
113 template <class T>
114 inline void arraycopy_update(T* src, size_t count);
115
116 inline void clone_marking(oop src);
117 inline void clone_evacuation(oop src);
118 inline void clone_update(oop src);
119
120 template <class T, bool HAS_FWD, bool EVAC, bool ENQUEUE>
121 inline void arraycopy_work(T* src, size_t count);
122
123 oop load_reference_barrier_impl(oop obj);
124
125 template <class T>
126 oop load_reference_barrier_native_impl(oop obj, T* load_addr);
127
128 inline bool need_bulk_update(HeapWord* dst);
129 public:
130 // Callbacks for runtime accesses.
131 template <DecoratorSet decorators, typename BarrierSetT = ShenandoahBarrierSet>
132 class AccessBarrier: public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
133 typedef BarrierSet::AccessBarrier<decorators, BarrierSetT> Raw;
134
135 public:
136 // Heap oop accesses. These accessors get resolved when
137 // IN_HEAP is set (e.g. when using the HeapAccess API), it is
138 // an oop_* overload, and the barrier strength is AS_NORMAL.
139 template <typename T>
140 static oop oop_load_in_heap(T* addr);
141 static oop oop_load_in_heap_at(oop base, ptrdiff_t offset);
142
143 template <typename T>
144 static void oop_store_in_heap(T* addr, oop value);
145 static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value);
146
147 template <typename T>
148 static oop oop_atomic_cmpxchg_in_heap(T* addr, oop compare_value, oop new_value);
|