|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _NGX_ATOMIC_H_INCLUDED_ | 
 | #define _NGX_ATOMIC_H_INCLUDED_ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | #define NGX_HAVE_ATOMIC_OPS   1 | 
 |  | 
 | typedef int32_t                     ngx_atomic_int_t; | 
 | typedef uint32_t                    ngx_atomic_uint_t; | 
 | typedef volatile ngx_atomic_uint_t  ngx_atomic_t; | 
 | #define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1) | 
 |  | 
 |  | 
 | #if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) || ( _MSC_VER >= 1300 ) | 
 |  | 
 | /* the new SDK headers */ | 
 |  | 
 | #define ngx_atomic_cmp_set(lock, old, set)                                    \ | 
 |      ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \ | 
 |                           == old) | 
 |  | 
 | #else | 
 |  | 
 | /* the old MS VC6.0SP2 SDK headers */ | 
 |  | 
 | #define ngx_atomic_cmp_set(lock, old, set)                                    \ | 
 |      (InterlockedCompareExchange((void **) lock, (void *) set, (void *) old)  \ | 
 |       == (void *) old) | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #define ngx_atomic_fetch_add(p, add) InterlockedExchangeAdd((long *) p, add) | 
 |  | 
 |  | 
 | #define ngx_memory_barrier() | 
 |  | 
 |  | 
 | #if defined( __BORLANDC__ ) || ( __WATCOMC__ < 1230 ) | 
 |  | 
 | /* | 
 |  * Borland C++ 5.5 (tasm32) and Open Watcom C prior to 1.3 | 
 |  * do not understand the "pause" instruction | 
 |  */ | 
 |  | 
 | #define ngx_cpu_pause() | 
 | #else | 
 | #define ngx_cpu_pause()       __asm { pause } | 
 | #endif | 
 |  | 
 |  | 
 | void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin); | 
 |  | 
 | #define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1)) | 
 | #define ngx_unlock(lock)    *(lock) = 0 | 
 |  | 
 |  | 
 | #endif /* _NGX_ATOMIC_H_INCLUDED_ */ |