annotate src/core/ngx_shmtx.c @ 644:ad25218fd14b NGINX_1_0_12

nginx 1.0.12 *) Feature: the "TLSv1.1" and "TLSv1.2" parameters of the "ssl_protocols" directive. *) Feature: the "if" SSI command supports captures in regular expressions. *) Bugfix: the "if" SSI command did not work inside the "block" command. *) Bugfix: in AIO error handling on FreeBSD. *) Bugfix: in the OpenSSL library initialization. *) Bugfix: the "worker_cpu_affinity" directive might not work. *) Bugfix: the "limit_conn_log_level" and "limit_req_log_level" directives might not work. *) Bugfix: the "read_ahead" directive might not work combined with "try_files" and "open_file_cache". *) Bugfix: the "proxy_cache_use_stale" directive with "error" parameter did not return answer from cache if there were no live upstreams. *) Bugfix: a segmentation fault might occur in a worker process if small time was used in the "inactive" parameter of the "proxy_cache_path" directive. *) Bugfix: responses from cache might hang. *) Bugfix: in error handling while connecting to a backend. Thanks to Piotr Sikora. *) Bugfix: in the "epoll" event method. Thanks to Yichun Zhang. *) Bugfix: the $sent_http_cache_control variable might contain a wrong value if the "expires" directive was used. Thanks to Yichun Zhang. *) Bugfix: the "limit_rate" directive did not allow to use full throughput, even if limit value was very high. *) Bugfix: the "sendfile_max_chunk" directive did not work, if the "limit_rate" directive was used. *) Bugfix: nginx could not be built on Solaris; the bug had appeared in 1.0.11. *) Bugfix: in the ngx_http_scgi_module. *) Bugfix: in the ngx_http_mp4_module.
author Igor Sysoev <http://sysoev.ru>
date Mon, 06 Feb 2012 00:00:00 +0400
parents d4da38525468
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
644
ad25218fd14b nginx 1.0.12
Igor Sysoev <http://sysoev.ru>
parents: 624
diff changeset
4 * Copyright (C) Nginx, Inc.
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5 */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12 #if (NGX_HAVE_ATOMIC_OPS)
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_int_t
258
6ae1357b7b7c nginx 0.4.14
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
16 ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name)
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 mtx->lock = addr;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19
624
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
20 if (mtx->spin == (ngx_uint_t) -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
21 return NGX_OK;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
22 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
23
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
24 mtx->spin = 2048;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
25
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
26 #if (NGX_HAVE_POSIX_SEM)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
27
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
28 if (sem_init(&mtx->sem, 1, 0) == -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
29 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
30 "sem_init() failed");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
31 } else {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
32 mtx->semaphore = 1;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
33 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
34
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
35 #endif
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
36
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 return NGX_OK;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
624
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
40
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
41 void
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
42 ngx_shmtx_destory(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
43 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
44 #if (NGX_HAVE_POSIX_SEM)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
45
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
46 if (mtx->semaphore) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
47 if (sem_destroy(&mtx->sem) == -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
48 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
49 "sem_destroy() failed");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
50 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
51 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
52
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
53 #endif
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
54 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
55
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
56
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
57 ngx_uint_t
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
58 ngx_shmtx_trylock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
59 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
60 ngx_atomic_uint_t val;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
61
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
62 val = *mtx->lock;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
63
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
64 return ((val & 0x80000000) == 0
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
65 && ngx_atomic_cmp_set(mtx->lock, val, val | 0x80000000));
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
66 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
67
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
68
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
69 void
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
70 ngx_shmtx_lock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
71 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
72 ngx_uint_t i, n;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
73 ngx_atomic_uint_t val;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
74
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
75 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx lock");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
76
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
77 for ( ;; ) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
78
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
79 val = *mtx->lock;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
80
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
81 if ((val & 0x80000000) == 0
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
82 && ngx_atomic_cmp_set(mtx->lock, val, val | 0x80000000))
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
83 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
84 return;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
85 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
86
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
87 if (ngx_ncpu > 1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
88
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
89 for (n = 1; n < mtx->spin; n <<= 1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
90
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
91 for (i = 0; i < n; i++) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
92 ngx_cpu_pause();
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
93 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
94
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
95 val = *mtx->lock;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
96
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
97 if ((val & 0x80000000) == 0
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
98 && ngx_atomic_cmp_set(mtx->lock, val, val | 0x80000000))
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
99 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
100 return;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
101 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
102 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
103 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
104
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
105 #if (NGX_HAVE_POSIX_SEM)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
106
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
107 if (mtx->semaphore) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
108 val = *mtx->lock;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
109
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
110 if ((val & 0x80000000)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
111 && ngx_atomic_cmp_set(mtx->lock, val, val + 1))
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
112 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
113 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
114 "shmtx wait %XA", val);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
115
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
116 while (sem_wait(&mtx->sem) == -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
117 ngx_err_t err;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
118
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
119 err = ngx_errno;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
120
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
121 if (err != NGX_EINTR) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
122 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
123 "sem_wait() failed while waiting on shmtx");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
124 break;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
125 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
126 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
127
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
128 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
129 "shmtx awoke");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
130 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
131
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
132 continue;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
133 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
134
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
135 #endif
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
136
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
137 ngx_sched_yield();
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
138 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
139 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
140
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
141
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
142 void
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
143 ngx_shmtx_unlock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
144 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
145 ngx_atomic_uint_t val, old, wait;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
146
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
147 if (mtx->spin != (ngx_uint_t) -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
148 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx unlock");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
149 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
150
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
151 for ( ;; ) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
152
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
153 old = *mtx->lock;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
154 wait = old & 0x7fffffff;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
155 val = wait ? wait - 1 : 0;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
156
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
157 if (ngx_atomic_cmp_set(mtx->lock, old, val)) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
158 break;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
159 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
160 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
161
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
162 #if (NGX_HAVE_POSIX_SEM)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
163
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
164 if (wait == 0 || !mtx->semaphore) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
165 return;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
166 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
167
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
168 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
169 "shmtx wake %XA", old);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
170
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
171 if (sem_post(&mtx->sem) == -1) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
172 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
173 "sem_post() failed while wake shmtx");
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
174 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
175
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
176 #endif
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
177 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
178
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
179
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 #else
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 ngx_int_t
258
6ae1357b7b7c nginx 0.4.14
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
184 ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name)
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 if (mtx->name) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 if (ngx_strcmp(name, mtx->name) == 0) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 mtx->name = name;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 return NGX_OK;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 ngx_shmtx_destory(mtx);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195
284
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
196 mtx->fd = ngx_open_file(name, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
197 NGX_FILE_DEFAULT_ACCESS);
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 if (mtx->fd == NGX_INVALID_FILE) {
258
6ae1357b7b7c nginx 0.4.14
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
200 ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno,
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 ngx_open_file_n " \"%s\" failed", name);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 return NGX_ERROR;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 if (ngx_delete_file(name) == NGX_FILE_ERROR) {
258
6ae1357b7b7c nginx 0.4.14
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
206 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 ngx_delete_file_n " \"%s\" failed", name);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 mtx->name = name;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 return NGX_OK;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 void
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 ngx_shmtx_destory(ngx_shmtx_t *mtx)
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 if (ngx_close_file(mtx->fd) == NGX_FILE_ERROR) {
258
6ae1357b7b7c nginx 0.4.14
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
220 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 ngx_close_file_n " \"%s\" failed", mtx->name);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225
624
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
226 ngx_uint_t
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
227 ngx_shmtx_trylock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
228 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
229 ngx_err_t err;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
230
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
231 err = ngx_trylock_fd(mtx->fd);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
232
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
233 if (err == 0) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
234 return 1;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
235 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
236
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
237 if (err == NGX_EAGAIN) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
238 return 0;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
239 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
240
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
241 #if __osf__ /* Tru64 UNIX */
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
242
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
243 if (err == NGX_EACCESS) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
244 return 0;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
245 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
246
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 #endif
624
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
248
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
249 ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
250
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
251 return 0;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
252 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
253
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
254
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
255 void
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
256 ngx_shmtx_lock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
257 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
258 ngx_err_t err;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
259
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
260 err = ngx_lock_fd(mtx->fd);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
261
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
262 if (err == 0) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
263 return;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
264 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
265
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
266 ngx_log_abort(err, ngx_lock_fd_n " %s failed", mtx->name);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
267 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
268
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
269
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
270 void
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
271 ngx_shmtx_unlock(ngx_shmtx_t *mtx)
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
272 {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
273 ngx_err_t err;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
274
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
275 err = ngx_unlock_fd(mtx->fd);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
276
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
277 if (err == 0) {
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
278 return;
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
279 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
280
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
281 ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name);
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
282 }
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
283
d4da38525468 nginx 1.0.2
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
284 #endif