|  | 
 | /* | 
 |  * 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() |