summaryrefslogtreecommitdiff
path: root/src/atomic_ptr.hpp
diff options
context:
space:
mode:
authorSteven McCoy <steven.mccoy@miru.hk>2010-04-29 11:36:13 +0200
committerMartin Sustrik <sustrik@250bpm.com>2010-04-29 11:36:13 +0200
commit7cb076e56a18cb76c49f17bd34bc73c11e01b705 (patch)
tree12d8b0dd06ba6ec5f475c46f97cba18c997ad164 /src/atomic_ptr.hpp
parentad6fa9d0d4f1cf29ce63998d7efe337b1a784ef6 (diff)
Defer NetBSD atomic ops to GCC builtins. Revert Sun atomic ops #define.
Diffstat (limited to 'src/atomic_ptr.hpp')
-rw-r--r--src/atomic_ptr.hpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/atomic_ptr.hpp b/src/atomic_ptr.hpp
index 9f2e759..5530736 100644
--- a/src/atomic_ptr.hpp
+++ b/src/atomic_ptr.hpp
@@ -17,7 +17,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#ifndef __ZMQ_ATOMIC_PTR_HPP_INCLUDED__
#define __ZMQ_ATOMIC_PTR_HPP_INCLUDED__
@@ -31,8 +30,10 @@
#define ZMQ_ATOMIC_PTR_SPARC
#elif defined ZMQ_HAVE_WINDOWS
#define ZMQ_ATOMIC_PTR_WINDOWS
-#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
-#define ZMQ_ATOMIC_PTR_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_PTR_MUTEX
#endif
@@ -41,7 +42,7 @@
#include "mutex.hpp"
#elif defined ZMQ_ATOMIC_PTR_WINDOWS
#include "windows.hpp"
-#elif defined ZMQ_ATOMIC_PTR_SYSTEM
+#elif defined ZMQ_ATOMIC_PTR_SUN
#include <atomic.h>
#endif
@@ -79,7 +80,9 @@ namespace zmq
{
#if defined ZMQ_ATOMIC_PTR_WINDOWS
return (T*) InterlockedExchangePointer ((PVOID*) &ptr, val_);
-#elif defined ZMQ_ATOMIC_PTR_SYSTEM
+#elif defined ZMQ_ATOMIC_PTR_GNU
+ return (T*) __sync_lock_test_and_set (&ptr, val_);
+#elif defined ZMQ_ATOMIC_PTR_SUN
return (T*) atomic_swap_ptr (&ptr, val_);
#elif defined ZMQ_ATOMIC_PTR_X86
T *old;
@@ -125,7 +128,9 @@ namespace zmq
#if defined ZMQ_ATOMIC_PTR_WINDOWS
return (T*) InterlockedCompareExchangePointer (
(volatile PVOID*) &ptr, val_, cmp_);
-#elif defined ZMQ_ATOMIC_PTR_SYSTEM
+#elif defined ZMQ_ATOMIC_PTR_GNU
+ return (T*) __sync_val_compare_and_swap (&ptr, cmp_, val_);
+#elif defined ZMQ_ATOMIC_PTR_SUN
return (T*) atomic_cas_ptr (&ptr, cmp_, val_);
#elif defined ZMQ_ATOMIC_PTR_X86
T *old;
@@ -173,8 +178,11 @@ namespace zmq
#if defined ZMQ_ATOMIC_PTR_WINDOWS
#undef ZMQ_ATOMIC_PTR_WINDOWS
#endif
-#if defined ZMQ_ATOMIC_PTR_SYSTEM
-#undef ZMQ_ATOMIC_PTR_SYSTEM
+#if defined ZMQ_ATOMIC_PTR_GNU
+#undef ZMQ_ATOMIC_PTR_GNU
+#endif
+#if defined ZMQ_ATOMIC_PTR_SUN
+#undef ZMQ_ATOMIC_PTR_SUN
#endif
#if defined ZMQ_ATOMIC_PTR_X86
#undef ZMQ_ATOMIC_PTR_X86
@@ -187,3 +195,4 @@ namespace zmq
#endif
#endif
+