aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-11-25 17:34:35 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-11-25 17:34:35 +0000
commit89d635fa5dd04cb857f00de98f34d7792ec3e1a5 (patch)
tree574640fa05c39b0e32b6b7bc42f21f1638ee9852 /src/os/unix
parentf215028477430eadacbfd24906d6f2ec94894c60 (diff)
downloadnginx-89d635fa5dd04cb857f00de98f34d7792ec3e1a5.tar.gz
nginx-89d635fa5dd04cb857f00de98f34d7792ec3e1a5.zip
GCC 4.1 builtin atomic operations
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_atomic.h37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/os/unix/ngx_atomic.h b/src/os/unix/ngx_atomic.h
index 35761b430..b478cc8d4 100644
--- a/src/os/unix/ngx_atomic.h
+++ b/src/os/unix/ngx_atomic.h
@@ -60,10 +60,40 @@ typedef uint32_t ngx_atomic_uint_t;
typedef volatile ngx_atomic_uint_t ngx_atomic_t;
-#else /* !(NGX_DARWIN) */
+#elif (NGX_HAVE_GCC_ATOMIC)
+/* GCC 4.1 builtin atomic operations */
-#if ( __i386__ || __i386 )
+#define NGX_HAVE_ATOMIC_OPS 1
+
+typedef long ngx_atomic_int_t;
+typedef unsigned long ngx_atomic_uint_t;
+
+#if (NGX_PTR_SIZE == 8)
+#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1)
+#else
+#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1)
+#endif
+
+typedef volatile ngx_atomic_uint_t ngx_atomic_t;
+
+
+#define ngx_atomic_cmp_set(lock, old, set) \
+ __sync_bool_compare_and_swap(lock, old, set)
+
+#define ngx_atomic_fetch_add(value, add) \
+ __sync_fetch_and_add(value, add)
+
+#define ngx_memory_barrier() __sync_synchronize()
+
+#if ( __i386__ || __i386 || __amd64__ || __amd64 )
+#define ngx_cpu_pause() __asm__ ("pause")
+#else
+#define ngx_cpu_pause()
+#endif
+
+
+#elif ( __i386__ || __i386 )
typedef int32_t ngx_atomic_int_t;
typedef uint32_t ngx_atomic_uint_t;
@@ -203,9 +233,6 @@ typedef volatile ngx_atomic_uint_t ngx_atomic_t;
#include "ngx_gcc_atomic_ppc.h"
-
-#endif
-
#endif