247 void *const _field;
248 public:
249 ScopedFence(void *const field) : _field(field) { prefix(); }
250 ~ScopedFence() { postfix(); }
251 void prefix() { ScopedFenceGeneral<T>::prefix(); }
252 void postfix() { ScopedFenceGeneral<T>::postfix(); }
253 };
254
255 class OrderAccess : AllStatic {
256 public:
257 // barriers
258 static void loadload();
259 static void storestore();
260 static void loadstore();
261 static void storeload();
262
263 static void acquire();
264 static void release();
265 static void fence();
266
267 static jbyte load_acquire(volatile jbyte* p);
268 static jshort load_acquire(volatile jshort* p);
269 static jint load_acquire(volatile jint* p);
270 static jlong load_acquire(volatile jlong* p);
271 static jubyte load_acquire(volatile jubyte* p);
272 static jushort load_acquire(volatile jushort* p);
273 static juint load_acquire(volatile juint* p);
274 static julong load_acquire(volatile julong* p);
275 static jfloat load_acquire(volatile jfloat* p);
276 static jdouble load_acquire(volatile jdouble* p);
277
278 static intptr_t load_ptr_acquire(volatile intptr_t* p);
279 static void* load_ptr_acquire(volatile void* p);
280 static void* load_ptr_acquire(const volatile void* p);
281
282 static void release_store(volatile jbyte* p, jbyte v);
283 static void release_store(volatile jshort* p, jshort v);
284 static void release_store(volatile jint* p, jint v);
285 static void release_store(volatile jlong* p, jlong v);
286 static void release_store(volatile jubyte* p, jubyte v);
301 static void release_store_fence(volatile jushort* p, jushort v);
302 static void release_store_fence(volatile juint* p, juint v);
303 static void release_store_fence(volatile julong* p, julong v);
304 static void release_store_fence(volatile jfloat* p, jfloat v);
305 static void release_store_fence(volatile jdouble* p, jdouble v);
306
307 static void release_store_ptr_fence(volatile intptr_t* p, intptr_t v);
308 static void release_store_ptr_fence(volatile void* p, void* v);
309
310 private:
311 // This is a helper that invokes the StubRoutines::fence_entry()
312 // routine if it exists, It should only be used by platforms that
313 // don't have another way to do the inline assembly.
314 static void StubRoutines_fence();
315
316 // Give platforms a variation point to specialize.
317 template<typename T> static T specialized_load_acquire (volatile T* p );
318 template<typename T> static void specialized_release_store (volatile T* p, T v);
319 template<typename T> static void specialized_release_store_fence(volatile T* p, T v);
320
321 template<typename FieldType, ScopedFenceType FenceType>
322 static void ordered_store(volatile FieldType* p, FieldType v);
323
324 template<typename FieldType, ScopedFenceType FenceType>
325 static FieldType ordered_load(volatile FieldType* p);
326
327 static void store(volatile jbyte* p, jbyte v);
328 static void store(volatile jshort* p, jshort v);
329 static void store(volatile jint* p, jint v);
330 static void store(volatile jlong* p, jlong v);
331 static void store(volatile jdouble* p, jdouble v);
332 static void store(volatile jfloat* p, jfloat v);
333
334 static jbyte load (volatile jbyte* p);
335 static jshort load (volatile jshort* p);
336 static jint load (volatile jint* p);
337 static jlong load (volatile jlong* p);
338 static jdouble load (volatile jdouble* p);
339 static jfloat load (volatile jfloat* p);
340
|
247 void *const _field;
248 public:
249 ScopedFence(void *const field) : _field(field) { prefix(); }
250 ~ScopedFence() { postfix(); }
251 void prefix() { ScopedFenceGeneral<T>::prefix(); }
252 void postfix() { ScopedFenceGeneral<T>::postfix(); }
253 };
254
255 class OrderAccess : AllStatic {
256 public:
257 // barriers
258 static void loadload();
259 static void storestore();
260 static void loadstore();
261 static void storeload();
262
263 static void acquire();
264 static void release();
265 static void fence();
266
267 // flushes all pending memory_accesses even on remote CPUs
268 static void global_fence();
269
270 static jbyte load_acquire(volatile jbyte* p);
271 static jshort load_acquire(volatile jshort* p);
272 static jint load_acquire(volatile jint* p);
273 static jlong load_acquire(volatile jlong* p);
274 static jubyte load_acquire(volatile jubyte* p);
275 static jushort load_acquire(volatile jushort* p);
276 static juint load_acquire(volatile juint* p);
277 static julong load_acquire(volatile julong* p);
278 static jfloat load_acquire(volatile jfloat* p);
279 static jdouble load_acquire(volatile jdouble* p);
280
281 static intptr_t load_ptr_acquire(volatile intptr_t* p);
282 static void* load_ptr_acquire(volatile void* p);
283 static void* load_ptr_acquire(const volatile void* p);
284
285 static void release_store(volatile jbyte* p, jbyte v);
286 static void release_store(volatile jshort* p, jshort v);
287 static void release_store(volatile jint* p, jint v);
288 static void release_store(volatile jlong* p, jlong v);
289 static void release_store(volatile jubyte* p, jubyte v);
304 static void release_store_fence(volatile jushort* p, jushort v);
305 static void release_store_fence(volatile juint* p, juint v);
306 static void release_store_fence(volatile julong* p, julong v);
307 static void release_store_fence(volatile jfloat* p, jfloat v);
308 static void release_store_fence(volatile jdouble* p, jdouble v);
309
310 static void release_store_ptr_fence(volatile intptr_t* p, intptr_t v);
311 static void release_store_ptr_fence(volatile void* p, void* v);
312
313 private:
314 // This is a helper that invokes the StubRoutines::fence_entry()
315 // routine if it exists, It should only be used by platforms that
316 // don't have another way to do the inline assembly.
317 static void StubRoutines_fence();
318
319 // Give platforms a variation point to specialize.
320 template<typename T> static T specialized_load_acquire (volatile T* p );
321 template<typename T> static void specialized_release_store (volatile T* p, T v);
322 template<typename T> static void specialized_release_store_fence(volatile T* p, T v);
323
324 template<bool DummyFlag>
325 static void specialized_global_fence();
326 static void general_global_fence();
327
328 template<typename FieldType, ScopedFenceType FenceType>
329 static void ordered_store(volatile FieldType* p, FieldType v);
330
331 template<typename FieldType, ScopedFenceType FenceType>
332 static FieldType ordered_load(volatile FieldType* p);
333
334 static void store(volatile jbyte* p, jbyte v);
335 static void store(volatile jshort* p, jshort v);
336 static void store(volatile jint* p, jint v);
337 static void store(volatile jlong* p, jlong v);
338 static void store(volatile jdouble* p, jdouble v);
339 static void store(volatile jfloat* p, jfloat v);
340
341 static jbyte load (volatile jbyte* p);
342 static jshort load (volatile jshort* p);
343 static jint load (volatile jint* p);
344 static jlong load (volatile jlong* p);
345 static jdouble load (volatile jdouble* p);
346 static jfloat load (volatile jfloat* p);
347
|