< prev index next >

src/share/vm/runtime/orderAccess.hpp

Print this page
rev 8362 : CMS fence eliding using fancy synchronization when using UseCondCardMark


 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 
< prev index next >