183
184 template <class GCBarrierType, DecoratorSet decorators>
185 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG_AT, decorators>: public AllStatic {
186 template <typename T>
187 static T access_barrier(oop base, ptrdiff_t offset, T compare_value, T new_value) {
188 return GCBarrierType::atomic_cmpxchg_in_heap_at(base, offset, compare_value, new_value);
189 }
190
191 static oop oop_access_barrier(oop base, ptrdiff_t offset, oop compare_value, oop new_value) {
192 return GCBarrierType::oop_atomic_cmpxchg_in_heap_at(base, offset, compare_value, new_value);
193 }
194 };
195
196 template <class GCBarrierType, DecoratorSet decorators>
197 struct PostRuntimeDispatch<GCBarrierType, BARRIER_CLONE, decorators>: public AllStatic {
198 static void access_barrier(oop src, oop dst, size_t size) {
199 GCBarrierType::clone_in_heap(src, dst, size);
200 }
201 };
202
203 // Resolving accessors with barriers from the barrier set happens in two steps.
204 // 1. Expand paths with runtime-decorators, e.g. is UseCompressedOops on or off.
205 // 2. Expand paths for each BarrierSet available in the system.
206 template <DecoratorSet decorators, typename FunctionPointerT, BarrierType barrier_type>
207 struct BarrierResolver: public AllStatic {
208 template <DecoratorSet ds>
209 static typename EnableIf<
210 HasDecorator<ds, INTERNAL_VALUE_IS_OOP>::value,
211 FunctionPointerT>::type
212 resolve_barrier_gc() {
213 BarrierSet* bs = BarrierSet::barrier_set();
214 assert(bs != nullptr, "GC barriers invoked before BarrierSet is set");
215 switch (bs->kind()) {
216 #define BARRIER_SET_RESOLVE_BARRIER_CLOSURE(bs_name) \
217 case BarrierSet::bs_name: { \
218 return PostRuntimeDispatch<typename BarrierSet::GetType<BarrierSet::bs_name>::type:: \
219 AccessBarrier<ds>, barrier_type, ds>::oop_access_barrier; \
220 } \
221 break;
222 FOR_EACH_BARRIER_SET_DO(BARRIER_SET_RESOLVE_BARRIER_CLOSURE)
330 return function(base, offset, new_value);
331 }
332
333 template <DecoratorSet decorators, typename T>
334 OopCopyResult RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
335 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
336 size_t length) {
337 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier();
338 _arraycopy_func = function;
339 return function(src_obj, src_offset_in_bytes, src_raw,
340 dst_obj, dst_offset_in_bytes, dst_raw,
341 length);
342 }
343
344 template <DecoratorSet decorators, typename T>
345 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) {
346 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier();
347 _clone_func = function;
348 function(src, dst, size);
349 }
350 }
351
352 #endif // SHARE_OOPS_ACCESS_INLINE_HPP
|
183
184 template <class GCBarrierType, DecoratorSet decorators>
185 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG_AT, decorators>: public AllStatic {
186 template <typename T>
187 static T access_barrier(oop base, ptrdiff_t offset, T compare_value, T new_value) {
188 return GCBarrierType::atomic_cmpxchg_in_heap_at(base, offset, compare_value, new_value);
189 }
190
191 static oop oop_access_barrier(oop base, ptrdiff_t offset, oop compare_value, oop new_value) {
192 return GCBarrierType::oop_atomic_cmpxchg_in_heap_at(base, offset, compare_value, new_value);
193 }
194 };
195
196 template <class GCBarrierType, DecoratorSet decorators>
197 struct PostRuntimeDispatch<GCBarrierType, BARRIER_CLONE, decorators>: public AllStatic {
198 static void access_barrier(oop src, oop dst, size_t size) {
199 GCBarrierType::clone_in_heap(src, dst, size);
200 }
201 };
202
203 template <class GCBarrierType, DecoratorSet decorators>
204 struct PostRuntimeDispatch<GCBarrierType, BARRIER_VALUE_COPY, decorators>: public AllStatic {
205 static void access_barrier(const ValuePayload& src, const ValuePayload& dst) {
206 GCBarrierType::value_copy_in_heap(src, dst);
207 }
208 };
209
210 template <class GCBarrierType, DecoratorSet decorators>
211 struct PostRuntimeDispatch<GCBarrierType, BARRIER_VALUE_STORE_NULL, decorators>: public AllStatic {
212 static void access_barrier(const ValuePayload& dst) {
213 GCBarrierType::value_store_null_in_heap(dst);
214 }
215 };
216
217 // Resolving accessors with barriers from the barrier set happens in two steps.
218 // 1. Expand paths with runtime-decorators, e.g. is UseCompressedOops on or off.
219 // 2. Expand paths for each BarrierSet available in the system.
220 template <DecoratorSet decorators, typename FunctionPointerT, BarrierType barrier_type>
221 struct BarrierResolver: public AllStatic {
222 template <DecoratorSet ds>
223 static typename EnableIf<
224 HasDecorator<ds, INTERNAL_VALUE_IS_OOP>::value,
225 FunctionPointerT>::type
226 resolve_barrier_gc() {
227 BarrierSet* bs = BarrierSet::barrier_set();
228 assert(bs != nullptr, "GC barriers invoked before BarrierSet is set");
229 switch (bs->kind()) {
230 #define BARRIER_SET_RESOLVE_BARRIER_CLOSURE(bs_name) \
231 case BarrierSet::bs_name: { \
232 return PostRuntimeDispatch<typename BarrierSet::GetType<BarrierSet::bs_name>::type:: \
233 AccessBarrier<ds>, barrier_type, ds>::oop_access_barrier; \
234 } \
235 break;
236 FOR_EACH_BARRIER_SET_DO(BARRIER_SET_RESOLVE_BARRIER_CLOSURE)
344 return function(base, offset, new_value);
345 }
346
347 template <DecoratorSet decorators, typename T>
348 OopCopyResult RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
349 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
350 size_t length) {
351 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier();
352 _arraycopy_func = function;
353 return function(src_obj, src_offset_in_bytes, src_raw,
354 dst_obj, dst_offset_in_bytes, dst_raw,
355 length);
356 }
357
358 template <DecoratorSet decorators, typename T>
359 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) {
360 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier();
361 _clone_func = function;
362 function(src, dst, size);
363 }
364
365 template <DecoratorSet decorators, typename T>
366 void RuntimeDispatch<decorators, T, BARRIER_VALUE_COPY>::value_copy_init(const ValuePayload& src, const ValuePayload& dst) {
367 func_t function = BarrierResolver<decorators, func_t, BARRIER_VALUE_COPY>::resolve_barrier();
368 _value_copy_func = function;
369 function(src, dst);
370 }
371
372 template <DecoratorSet decorators, typename T>
373 void RuntimeDispatch<decorators, T, BARRIER_VALUE_STORE_NULL>::value_store_null_init(const ValuePayload& dst) {
374 func_t function = BarrierResolver<decorators, func_t, BARRIER_VALUE_STORE_NULL>::resolve_barrier();
375 _value_store_null_func = function;
376 function(dst);
377 }
378 }
379
380 #endif // SHARE_OOPS_ACCESS_INLINE_HPP
|