summaryrefslogtreecommitdiff
path: root/src/atomic_counter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/atomic_counter.hpp')
-rw-r--r--src/atomic_counter.hpp42
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
+