diff options
author | Johnny Willemsen <jwillemsen@remedy.nl> | 2010-04-16 13:04:47 +0000 |
---|---|---|
committer | Johnny Willemsen <jwillemsen@remedy.nl> | 2010-04-16 13:04:47 +0000 |
commit | f8ebf1f424b3654e3baf772ba510c469d3cf3d7d (patch) | |
tree | fab7235c5c24bdea2b7ef535d1139fdfa72be67e /ACE/ace | |
parent | 12368c4335134140ecc8a4157501eed07780a3e7 (diff) | |
download | ATCD-f8ebf1f424b3654e3baf772ba510c469d3cf3d7d.tar.gz |
Fri Apr 16 13:02:04 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl>
* ace/Atomic_Op.h:
* ace/Atomic_Op.inl:
* ace/Atomic_Op.cpp:
* ace/config-sunos5.10.h:
Added support for the Solaris 10 Atomic support, thanks
to Aleksandar Vukajlovic <aleksandar dot vukajlovic at finsoft dot rs>
for providing the patches
Diffstat (limited to 'ACE/ace')
-rw-r--r-- | ACE/ace/Atomic_Op.cpp | 32 | ||||
-rw-r--r-- | ACE/ace/Atomic_Op.h | 2 | ||||
-rw-r--r-- | ACE/ace/Atomic_Op.inl | 28 | ||||
-rw-r--r-- | ACE/ace/config-sunos5.10.h | 2 |
4 files changed, 48 insertions, 16 deletions
diff --git a/ACE/ace/Atomic_Op.cpp b/ACE/ace/Atomic_Op.cpp index 9076b9f67ed..45b339f003e 100644 --- a/ACE/ace/Atomic_Op.cpp +++ b/ACE/ace/Atomic_Op.cpp @@ -34,8 +34,8 @@ single_cpu_increment (volatile long *value) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "xadd %0, (%1)" : "+r"(tmp) : "r"(addr) ); return tmp + 1; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_add_long ( reinterpret_cast<volatile unsigned long*> (value), 1); #elif defined(__GNUC__) && defined(PPC) @@ -58,8 +58,8 @@ single_cpu_decrement (volatile long *value) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "xadd %0, (%1)" : "+r"(tmp) : "r"(addr) ); return tmp - 1; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_add_long ( reinterpret_cast<volatile unsigned long*> (value), -1); #elif defined(__GNUC__) && defined(PPC) @@ -81,8 +81,8 @@ single_cpu_exchange (volatile long *value, long rhs) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "xchg %0, (%1)" : "+r"(rhs) : "r"(addr) ); return rhs; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_swap_long ( reinterpret_cast<volatile unsigned long*> (value), rhs); #elif defined(__GNUC__) && defined(PPC) @@ -104,8 +104,8 @@ single_cpu_exchange_add (volatile long *value, long rhs) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "xadd %0, (%1)" : "+r"(rhs) : "r"(addr) ); return rhs; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_swap_add_long ( reinterpret_cast<volatile unsigned long*> (value), rhs); #elif defined(__GNUC__) && defined(PPC) @@ -147,8 +147,8 @@ multi_cpu_increment (volatile long *value) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "lock ; xadd %0, (%1)" : "+r"(tmp) : "r"(addr) ); return tmp + 1; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_add_long ( reinterpret_cast<volatile unsigned long*> (value), 1); #else /* ACE_HAS_INTEL_ASSEMBLY*/ @@ -165,8 +165,8 @@ multi_cpu_decrement (volatile long *value) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "lock ; xadd %0, (%1)" : "+r"(tmp) : "r"(addr) ); return tmp - 1; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_add_long ( reinterpret_cast<volatile unsigned long*> (value), -1); #else /* ACE_HAS_INTEL_ASSEMBLY*/ @@ -183,8 +183,8 @@ multi_cpu_exchange (volatile long *value, long rhs) // The XCHG instruction automatically follows LOCK semantics asm( "xchg %0, (%1)" : "+r"(rhs) : "r"(addr) ); return rhs; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_swap_long ( reinterpret_cast<volatile unsigned long*> (value), rhs); #else /* ACE_HAS_INTEL_ASSEMBLY*/ @@ -201,8 +201,8 @@ multi_cpu_exchange_add (volatile long *value, long rhs) unsigned long addr = reinterpret_cast<unsigned long> (value); asm( "lock ; xadd %0, (%1)" : "+r"(rhs) : "r"(addr) ); return rhs; -#elif defined (sun) || \ - (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64))) +#elif !defined (ACE_HAS_SOLARIS_ATOMIC_LIB) && (defined (sun) || \ + (defined (__SUNPRO_CC) && (defined (__i386) || defined (__x86_64)))) return ace_atomic_swap_add_long ( reinterpret_cast<volatile unsigned long*> (value), rhs); #elif defined (WIN32) && !defined (ACE_HAS_INTERLOCKED_EXCHANGEADD) diff --git a/ACE/ace/Atomic_Op.h b/ACE/ace/Atomic_Op.h index 986b5329c23..ea872ec5a8a 100644 --- a/ACE/ace/Atomic_Op.h +++ b/ACE/ace/Atomic_Op.h @@ -45,6 +45,8 @@ # define ACE_HAS_BUILTIN_ATOMIC_OP # elif defined (ACE_HAS_VXATOMICLIB) # define ACE_HAS_BUILTIN_ATOMIC_OP +# elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) +# define ACE_HAS_BUILTIN_ATOMIC_OP # endif /* WIN32 */ #endif /* ACE_HAS_THREADS */ diff --git a/ACE/ace/Atomic_Op.inl b/ACE/ace/Atomic_Op.inl index fe1119947ca..e2f3e8a1cf7 100644 --- a/ACE/ace/Atomic_Op.inl +++ b/ACE/ace/Atomic_Op.inl @@ -11,6 +11,10 @@ # include <vxAtomicLib.h> #endif +#if defined (ACE_HAS_SOLARIS_ATOMIC_LIB) +# include <atomic.h> +#endif + ACE_BEGIN_VERSIONED_NAMESPACE_DECL #if defined (ACE_HAS_BUILTIN_ATOMIC_OP) @@ -43,6 +47,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator++ (void) return ::InterlockedIncrement (const_cast<long *> (&this->value_)); #elif defined (ACE_HAS_VXATOMICLIB) return ::vxAtomicInc (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_))) + 1; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_inc_ulong_nv (reinterpret_cast<volatile unsigned long*>(&this->value_)); #else /* WIN32 */ return (*increment_fn_) (&this->value_); #endif /* WIN32 */ @@ -63,6 +69,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator-- (void) return ::InterlockedDecrement (const_cast<long *> (&this->value_)); #elif defined (ACE_HAS_VXATOMICLIB) return ::vxAtomicDec (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_))) - 1; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_dec_ulong_nv (reinterpret_cast<volatile unsigned long*>(&this->value_)); #else /* WIN32 */ return (*decrement_fn_) (&this->value_); #endif /* WIN32 */ @@ -85,6 +93,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator+= (long rhs) rhs) + rhs; #elif defined (ACE_HAS_VXATOMICLIB) return ::vxAtomicAdd (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_)), rhs) + rhs; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_add_long_nv (reinterpret_cast<volatile unsigned long*>(&this->value_), rhs); #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return (*exchange_add_fn_) (&this->value_, rhs) + rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ @@ -101,6 +111,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator-= (long rhs) -rhs) - rhs; #elif defined (ACE_HAS_VXATOMICLIB) return ::vxAtomicSub (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_)), rhs) - rhs; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_add_long_nv (reinterpret_cast<volatile unsigned long*>(&this->value_), -rhs); #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return (*exchange_add_fn_) (&this->value_, -rhs) - rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ @@ -151,6 +163,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator= (long rhs) ::InterlockedExchange (const_cast<long *> (&this->value_), rhs); #elif defined (ACE_HAS_VXATOMICLIB) ::vxAtomicSet (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_)), rhs); +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + ::atomic_swap_ulong (reinterpret_cast<volatile unsigned long*>(&this->value_), rhs); #else /* WIN32 */ (*exchange_fn_) (&this->value_, rhs); #endif /* WIN32 */ @@ -167,6 +181,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, long>::operator= ( ::InterlockedExchange (const_cast<long *> (&this->value_), rhs.value_); #elif defined (ACE_HAS_VXATOMICLIB) ::vxAtomicSet (reinterpret_cast <atomic_t*>(const_cast<long *> (&this->value_)), rhs.value_); +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + ::atomic_swap_ulong (reinterpret_cast<volatile unsigned long*>(&this->value_), rhs.value_); #else /* WIN32 */ (*exchange_fn_) (&this->value_, rhs.value_); #endif /* WIN32 */ @@ -214,6 +230,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator++ (void) return static_cast<unsigned long> (::InterlockedIncrement (const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_)))); #elif defined (ACE_HAS_VXATOMICLIB) return static_cast<unsigned long> (::vxAtomicInc (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_))))) + 1; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_inc_ulong_nv (&this->value_); #else /* WIN32 */ return static_cast<unsigned long> ((*increment_fn_) (reinterpret_cast<volatile long *> (&this->value_))); #endif /* WIN32 */ @@ -234,6 +252,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator-- (void) return static_cast<unsigned long> (::InterlockedDecrement (const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_)))); #elif defined (ACE_HAS_VXATOMICLIB) return static_cast<unsigned long> (::vxAtomicDec (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_))))) - 1; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_dec_ulong_nv (&this->value_); #else /* WIN32 */ return static_cast<unsigned long> ((*decrement_fn_) (reinterpret_cast<volatile long *> (&this->value_))); #endif /* WIN32 */ @@ -256,6 +276,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator+= (unsigned long rhs) rhs)) + rhs; #elif defined (ACE_HAS_VXATOMICLIB) return static_cast<unsigned long> (::vxAtomicAdd (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_))), rhs)) + rhs; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_add_long_nv (&this->value_, rhs); #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return static_cast<unsigned long> ((*exchange_add_fn_) (reinterpret_cast<volatile long *> (&this->value_), rhs)) + rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ @@ -272,6 +294,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator-= (unsigned long rhs) -static_cast<long>(rhs))) - rhs; #elif defined (ACE_HAS_VXATOMICLIB) return static_cast<unsigned long> (::vxAtomicSub (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long *>(&this->value_))), rhs)) - rhs; +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + return ::atomic_add_long_nv (&this->value_, -rhs); #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ long l_rhs = static_cast<long> (rhs); return static_cast<unsigned long> ((*exchange_add_fn_) (reinterpret_cast<volatile long *> (&this->value_), -l_rhs)) - rhs; @@ -323,6 +347,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator= (unsigned long rhs) ::InterlockedExchange (const_cast<long *> (reinterpret_cast<volatile long*> (&this->value_)), rhs); #elif defined (ACE_HAS_VXATOMICLIB) ::vxAtomicSet (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long*> (&this->value_))), rhs); +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + ::atomic_swap_ulong (&this->value_, rhs); #else /* WIN32 */ (*exchange_fn_) (reinterpret_cast<volatile long *> (&this->value_), rhs); #endif /* WIN32 */ @@ -339,6 +365,8 @@ ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>::operator= ( ::InterlockedExchange (const_cast<long *> (reinterpret_cast<volatile long*> (&this->value_)), rhs.value_); #elif defined (ACE_HAS_VXATOMICLIB) ::vxAtomicSet (reinterpret_cast <atomic_t*>(const_cast<long *> (reinterpret_cast<volatile long*> (&this->value_))), rhs.value_); +#elif defined (ACE_HAS_SOLARIS_ATOMIC_LIB) + ::atomic_swap_ulong (&this->value_, rhs.value_); #else /* WIN32 */ (*exchange_fn_) (reinterpret_cast<volatile long *> (&this->value_), rhs.value_); #endif /* WIN32 */ diff --git a/ACE/ace/config-sunos5.10.h b/ACE/ace/config-sunos5.10.h index ca5b979495b..6bec278ac36 100644 --- a/ACE/ace/config-sunos5.10.h +++ b/ACE/ace/config-sunos5.10.h @@ -61,4 +61,6 @@ # define ACE_HAS_VOID_PTR_SCTP_GETPADDRS #endif +#define ACE_HAS_SOLARIS_ATOMIC_LIB + #endif /* ACE_CONFIG_H */ |