< prev index next >

src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.hpp

Print this page
rev 13452 : imported patch Atomic_cmpxchg
rev 13453 : imported patch Atomic_add
rev 13454 : [mq]: Atomic_add_v2


  61 
  62 extern "C" jint     _Atomic_swap32(jint     exchange_value, volatile jint*     dest);
  63 extern "C" intptr_t _Atomic_swap64(intptr_t exchange_value, volatile intptr_t* dest);
  64 
  65 // Implement ADD using a CAS loop.
  66 template<size_t byte_size>
  67 struct Atomic::PlatformAdd VALUE_OBJ_CLASS_SPEC {
  68   template<typename I, typename D>
  69   inline D operator()(I add_value, D volatile* dest) const {
  70     D old_value = *dest;
  71     while (true) {
  72       D new_value = old_value + add_value;
  73       D result = cmpxchg(new_value, dest, old_value);
  74       if (result == old_value) break;
  75       old_value = result;
  76     }
  77     return old_value + add_value;
  78   }
  79 };
  80 



  81 inline jint     Atomic::xchg    (jint     exchange_value, volatile jint*     dest) {
  82   return _Atomic_swap32(exchange_value, dest);
  83 }
  84 
  85 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
  86   return _Atomic_swap64(exchange_value, dest);
  87 }
  88 
  89 inline void*    Atomic::xchg_ptr(void*    exchange_value, volatile void*     dest) {
  90   return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
  91 }
  92 
  93 // No direct support for cmpxchg of bytes; emulate using int.
  94 template<>
  95 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
  96 
  97 template<>
  98 template<typename T>
  99 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
 100                                                 T volatile* dest,




  61 
  62 extern "C" jint     _Atomic_swap32(jint     exchange_value, volatile jint*     dest);
  63 extern "C" intptr_t _Atomic_swap64(intptr_t exchange_value, volatile intptr_t* dest);
  64 
  65 // Implement ADD using a CAS loop.
  66 template<size_t byte_size>
  67 struct Atomic::PlatformAdd VALUE_OBJ_CLASS_SPEC {
  68   template<typename I, typename D>
  69   inline D operator()(I add_value, D volatile* dest) const {
  70     D old_value = *dest;
  71     while (true) {
  72       D new_value = old_value + add_value;
  73       D result = cmpxchg(new_value, dest, old_value);
  74       if (result == old_value) break;
  75       old_value = result;
  76     }
  77     return old_value + add_value;
  78   }
  79 };
  80 
  81 template<>
  82 struct Atomic::PlatformAdd<2>: Atomic::AddShortUsingInt {};
  83 
  84 inline jint     Atomic::xchg    (jint     exchange_value, volatile jint*     dest) {
  85   return _Atomic_swap32(exchange_value, dest);
  86 }
  87 
  88 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
  89   return _Atomic_swap64(exchange_value, dest);
  90 }
  91 
  92 inline void*    Atomic::xchg_ptr(void*    exchange_value, volatile void*     dest) {
  93   return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
  94 }
  95 
  96 // No direct support for cmpxchg of bytes; emulate using int.
  97 template<>
  98 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
  99 
 100 template<>
 101 template<typename T>
 102 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
 103                                                 T volatile* dest,


< prev index next >