diff options
Diffstat (limited to 'src/atomic_counter.hpp')
-rw-r--r-- | src/atomic_counter.hpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp index 4a77928..5e05300 100644 --- a/src/atomic_counter.hpp +++ b/src/atomic_counter.hpp @@ -31,8 +31,10 @@ #define ZMQ_ATOMIC_COUNTER_SPARC #elif defined ZMQ_HAVE_WINDOWS #define ZMQ_ATOMIC_COUNTER_WINDOWS -#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD) -#define ZMQ_ATOMIC_COUNTER_SYSTEM +#elif defined sun +#define ZMQ_ATOMIC_COUNTER_SUN +#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) +#define ZMQ_ATOMIC_COUNTER_GNU #else #define ZMQ_ATOMIC_COUNTER_MUTEX #endif @@ -41,7 +43,7 @@ #include "mutex.hpp" #elif defined ZMQ_ATOMIC_COUNTER_WINDOWS #include "windows.hpp" -#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM +#elif defined ZMQ_ATOMIC_COUNTER_SUN #include <atomic.h> #endif @@ -79,25 +81,27 @@ namespace zmq #if defined ZMQ_ATOMIC_COUNTER_WINDOWS old_value = InterlockedExchangeAdd ((LONG*) &value, increment_); -#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM +#elif defined ZMQ_ATOMIC_COUNTER_GNU + old_value = __sync_fetch_and_add (&value, increment_); +#elif defined ZMQ_ATOMIC_COUNTER_SUN integer_t new_value = atomic_add_32_nv (&value, increment_); old_value = new_value - increment_; #elif defined ZMQ_ATOMIC_COUNTER_X86 __asm__ volatile ( - "lock; xadd %0, %1 \n\t" + "lock; xadd %0, %1 \n\t" : "=r" (old_value), "=m" (value) : "0" (increment_), "m" (value) : "cc", "memory"); #elif defined ZMQ_ATOMIC_COUNTER_SPARC integer_t tmp; __asm__ volatile ( - "ld [%4], %0 \n\t" - "1: \n\t" - "add %0, %3, %1 \n\t" - "cas [%4], %0, %1 \n\t" - "cmp %0, %1 \n\t" - "bne,a,pn %%icc, 1b \n\t" - "mov %1, %0 \n\t" + "ld [%4], %0 \n\t" + "1: \n\t" + "add %0, %3, %1 \n\t" + "cas [%4], %0, %1 \n\t" + "cmp %0, %1 \n\t" + "bne,a,pn %%icc, 1b \n\t" + "mov %1, %0 \n\t" : "=&r" (old_value), "=&r" (tmp), "=m" (value) : "r" (increment_), "r" (&value) : "cc", "memory"); @@ -119,7 +123,11 @@ namespace zmq LONG delta = - ((LONG) decrement); integer_t old = InterlockedExchangeAdd ((LONG*) &value, delta); return old - decrement != 0; -#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM +#elif defined ZMQ_ATOMIC_COUNTER_GNU + int32_t delta = - ((int32_t) decrement); + integer_t nv = __sync_fetch_and_add (&value, delta); + return nv != 0; +#elif defined ZMQ_ATOMIC_COUNTER_SUN int32_t delta = - ((int32_t) decrement); integer_t nv = atomic_add_32_nv (&value, delta); return nv != 0; @@ -180,8 +188,11 @@ namespace zmq #if defined ZMQ_ATOMIC_COUNTER_WINDOWS #undef ZMQ_ATOMIC_COUNTER_WINDOWS #endif -#if defined ZMQ_ATOMIC_COUNTER_SYSTEM -#undef ZMQ_ATOMIC_COUNTER_SYSTEM +#if defined ZMQ_ATOMIC_COUNTER_GNU +#undef ZMQ_ATOMIC_COUNTER_GNU +#endif +#if defined ZMQ_ATOMIC_COUNTER_SUN +#undef ZMQ_ATOMIC_COUNTER_SUN #endif #if defined ZMQ_ATOMIC_COUNTER_X86 #undef ZMQ_ATOMIC_COUNTER_X86 @@ -194,3 +205,4 @@ namespace zmq #endif #endif + |