Mercurial > hg > nginx
diff src/core/ngx_atomic.h @ 266:5238e93961a1
nginx-0.0.2-2004-02-23-23:57:12 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 23 Feb 2004 20:57:12 +0000 |
parents | f536f91e8e99 |
children | 83205e0b5522 |
line wrap: on
line diff
--- a/src/core/ngx_atomic.h +++ b/src/core/ngx_atomic.h @@ -6,9 +6,78 @@ #include <ngx_core.h> +#ifdef __i386__ + +typedef uint32_t ngx_atomic_t; + +#if (NGX_SMP) +#define NGX_SMP_LOCK "lock" +#else +#define NGX_SMP_LOCK +#endif + + +static ngx_inline uint32_t ngx_atomic_inc(ngx_atomic_t *value) +{ + uint32_t old; + + __asm__ __volatile (" + + movl $1, %0 + " NGX_SMP_LOCK + " xaddl %0, %1 + + ": "=a" (old) : "m" (*value)); + + return old; +} + + +static ngx_inline uint32_t ngx_atomic_dec(ngx_atomic_t *value) +{ + uint32_t old; + + __asm__ __volatile (" + + movl $-1, %0 + " NGX_SMP_LOCK + " xaddl %0, %1 + + ": "=a" (old) : "m" (*value)); + + return old; +} + + +static ngx_inline uint32_t ngx_atomic_cmp_set(ngx_atomic_t *lock, + ngx_atomic_t old, + ngx_atomic_t set) +{ + uint32_t res; + + __asm__ __volatile (" + + " NGX_SMP_LOCK + " cmpxchgl %3, %1 + setzb %%al + movzbl %%al, %0 + + ": "=a" (res) : "m" (*lock), "a" (old), "q" (set)); + + return res; +} + +#else + +typedef uint32_t ngx_atomic_t; + /* STUB */ #define ngx_atomic_inc(x) x++; #define ngx_atomic_dec(x) x--; +#define ngx_atomic_cmp_set(lock, old, set) 1; +/**/ + +#endif #endif /* _NGX_ATOMIC_H_INCLUDED_ */