| /* | |
| * Copyright (C) Igor Sysoev | |
| */ | |
| #if (NGX_PTR_SIZE == 4) | |
| #define NGX_CASA ngx_casa | |
| #else | |
| #define NGX_CASA ngx_casxa | |
| #endif | |
| ngx_atomic_uint_t | |
| ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); | |
| ngx_atomic_uint_t | |
| ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); | |
| /* the code in src/os/unix/ngx_sunpro_sparc64.il */ | |
| static ngx_inline ngx_atomic_uint_t | |
| ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, | |
| ngx_atomic_uint_t set) | |
| { | |
| set = NGX_CASA(set, old, lock); | |
| return (set == old); | |
| } | |
| static ngx_inline ngx_atomic_int_t | |
| ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) | |
| { | |
| ngx_atomic_uint_t old, res; | |
| old = *value; | |
| for ( ;; ) { | |
| res = old + add; | |
| res = NGX_CASA(res, old, value); | |
| if (res == old) { | |
| return res; | |
| } | |
| old = res; | |
| } | |
| } | |
| #define ngx_memory_barrier() \ | |
| __asm (".volatile"); \ | |
| __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"); \ | |
| __asm (".nonvolatile") | |
| #define ngx_cpu_pause() |