diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-11-25 17:34:35 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-11-25 17:34:35 +0000 |
commit | 89d635fa5dd04cb857f00de98f34d7792ec3e1a5 (patch) | |
tree | 574640fa05c39b0e32b6b7bc42f21f1638ee9852 /src/os/unix | |
parent | f215028477430eadacbfd24906d6f2ec94894c60 (diff) | |
download | nginx-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.h | 37 |
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 |