fix extension
[nginx.git] / nginx / src / core / ngx_shmtx.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_SHMTX_H_INCLUDED_
8 #define _NGX_SHMTX_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13
14
15 typedef struct {
16 #if (NGX_HAVE_ATOMIC_OPS)
17     ngx_atomic_t  *lock;
18 #else
19     ngx_fd_t       fd;
20     u_char        *name;
21 #endif
22 } ngx_shmtx_t;
23
24
25 ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name);
26
27
28 #if (NGX_HAVE_ATOMIC_OPS)
29
30 static ngx_inline ngx_uint_t
31 ngx_shmtx_trylock(ngx_shmtx_t *mtx)
32 {
33     return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));
34 }
35
36 #define ngx_shmtx_lock(mtx)   ngx_spinlock((mtx)->lock, ngx_pid, 1024)
37
38 #define ngx_shmtx_unlock(mtx) (void) ngx_atomic_cmp_set((mtx)->lock, ngx_pid, 0)
39
40 #define ngx_shmtx_destory(mtx)
41
42
43 #else
44
45 static ngx_inline ngx_uint_t
46 ngx_shmtx_trylock(ngx_shmtx_t *mtx)
47 {
48     ngx_err_t  err;
49
50     err = ngx_trylock_fd(mtx->fd);
51
52     if (err == 0) {
53         return 1;
54     }
55
56     if (err == NGX_EAGAIN) {
57         return 0;
58     }
59
60     ngx_log_abort(err, ngx_trylock_fd_n " failed");
61
62     return 0;
63 }
64
65
66 static ngx_inline void
67 ngx_shmtx_lock(ngx_shmtx_t *mtx)
68 {
69     ngx_err_t  err;
70
71     err = ngx_lock_fd(mtx->fd);
72
73     if (err == 0) {
74         return;
75     }
76
77     ngx_log_abort(err, ngx_lock_fd_n " failed");
78 }
79
80
81 static ngx_inline void
82 ngx_shmtx_unlock(ngx_shmtx_t *mtx)
83 {
84     ngx_err_t  err;
85
86     err = ngx_unlock_fd(mtx->fd);
87
88     if (err == 0) {
89         return;
90     }
91
92     ngx_log_abort(err, ngx_unlock_fd_n " failed");
93 }
94
95
96 void ngx_shmtx_destory(ngx_shmtx_t *mtx);
97
98 #endif
99
100
101 #endif /* _NGX_SHMTX_H_INCLUDED_ */