upstream nginx-0.7.31
[nginx.git] / nginx / src / os / unix / ngx_sunpro_atomic_sparc64.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #if (NGX_PTR_SIZE == 4)
8 #define NGX_CASA  ngx_casa
9 #else
10 #define NGX_CASA  ngx_casxa
11 #endif
12
13
14 ngx_atomic_uint_t
15 ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);
16
17 ngx_atomic_uint_t
18 ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);
19
20 /* the code in src/os/unix/ngx_sunpro_sparc64.il */
21
22
23 static ngx_inline ngx_atomic_uint_t
24 ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
25     ngx_atomic_uint_t set)
26 {
27     set = NGX_CASA(set, old, lock);
28
29     return (set == old);
30 }
31
32
33 static ngx_inline ngx_atomic_int_t
34 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
35 {
36     ngx_atomic_uint_t  old, res;
37
38     old = *value;
39
40     for ( ;; ) {
41
42         res = old + add;
43
44         res = NGX_CASA(res, old, value);
45
46         if (res == old) {
47             return res;
48         }
49
50         old = res;
51     }
52 }
53
54
55 #define ngx_memory_barrier()                                                  \
56         __asm (".volatile");                                                  \
57         __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad");   \
58         __asm (".nonvolatile")
59
60 #define ngx_cpu_pause()