Mercurial > hg > nginx
comparison src/event/modules/ngx_rtsig_module.c @ 344:e366ba5db8f8
nginx-0.0.3-2004-06-01-10:04:46 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 01 Jun 2004 06:04:46 +0000 |
parents | fb4dfb2ac0fc |
children | 55e496a8ece3 |
comparison
equal
deleted
inserted
replaced
343:6bdf858bff8c | 344:e366ba5db8f8 |
---|---|
12 #if (TEST_BUILD_RTSIG) | 12 #if (TEST_BUILD_RTSIG) |
13 | 13 |
14 #define F_SETSIG 10 | 14 #define F_SETSIG 10 |
15 #define SIGRTMIN 33 | 15 #define SIGRTMIN 33 |
16 #define si_fd __spare__[0] | 16 #define si_fd __spare__[0] |
17 | |
18 int sigtimedwait(const sigset_t *set, siginfo_t *info, | |
19 const struct timespec *timeout); | |
20 | |
21 | 17 |
22 int sigtimedwait(const sigset_t *set, siginfo_t *info, | 18 int sigtimedwait(const sigset_t *set, siginfo_t *info, |
23 const struct timespec *timeout) | 19 const struct timespec *timeout) |
24 { | 20 { |
25 return -1; | 21 return -1; |
103 | 99 |
104 rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); | 100 rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); |
105 | 101 |
106 sigemptyset(&set); | 102 sigemptyset(&set); |
107 sigaddset(&set, rtscf->signo); | 103 sigaddset(&set, rtscf->signo); |
104 sigaddset(&set, rtscf->signo + 1); | |
108 sigaddset(&set, SIGIO); | 105 sigaddset(&set, SIGIO); |
109 | 106 |
110 if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { | 107 if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { |
111 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, | 108 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, |
112 "sigprocmask() failed"); | 109 "sigprocmask() failed"); |
131 } | 128 } |
132 | 129 |
133 | 130 |
134 static int ngx_rtsig_add_connection(ngx_connection_t *c) | 131 static int ngx_rtsig_add_connection(ngx_connection_t *c) |
135 { | 132 { |
133 int signo; | |
136 ngx_rtsig_conf_t *rtscf; | 134 ngx_rtsig_conf_t *rtscf; |
137 | 135 |
138 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); | 136 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); |
139 | 137 |
138 signo = rtscf->signo + c->read->instance; | |
139 | |
140 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, | 140 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
141 "rtsig add connection: fd:%d signo:%d", c->fd, rtscf->signo); | 141 "rtsig add connection: fd:%d signo:%d", c->fd, signo); |
142 | 142 |
143 if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) { | 143 if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) { |
144 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 144 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
145 "fcntl(O_RDWR|O_NONBLOCK|O_ASYNC) failed"); | 145 "fcntl(O_RDWR|O_NONBLOCK|O_ASYNC) failed"); |
146 return NGX_ERROR; | 146 return NGX_ERROR; |
147 } | 147 } |
148 | 148 |
149 if (fcntl(c->fd, F_SETSIG, rtscf->signo) == -1) { | 149 if (fcntl(c->fd, F_SETSIG, signo) == -1) { |
150 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 150 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
151 "fcntl(F_SETSIG) failed"); | 151 "fcntl(F_SETSIG) failed"); |
152 return NGX_ERROR; | 152 return NGX_ERROR; |
153 } | 153 } |
154 | 154 |
155 if (fcntl(c->fd, F_SETOWN, ngx_getpid()) == -1) { | 155 if (fcntl(c->fd, F_SETOWN, ngx_pid) == -1) { |
156 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 156 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
157 "fcntl(F_SETOWN) failed"); | 157 "fcntl(F_SETOWN) failed"); |
158 return NGX_ERROR; | 158 return NGX_ERROR; |
159 } | 159 } |
160 | 160 |
173 } | 173 } |
174 | 174 |
175 | 175 |
176 static int ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags) | 176 static int ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags) |
177 { | 177 { |
178 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, | |
179 "rtsig del connection: fd:%d", c->fd); | |
180 | |
178 if (!(flags & NGX_CLOSE_EVENT)) { | 181 if (!(flags & NGX_CLOSE_EVENT)) { |
179 if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK) == -1) { | 182 if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK) == -1) { |
180 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 183 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
181 "fcntl(O_RDWR|O_NONBLOCK) failed"); | 184 "fcntl(O_RDWR|O_NONBLOCK) failed"); |
182 return NGX_ERROR; | 185 return NGX_ERROR; |
271 | 274 |
272 delta = ngx_elapsed_msec; | 275 delta = ngx_elapsed_msec; |
273 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; | 276 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; |
274 | 277 |
275 if (err) { | 278 if (err) { |
279 ngx_accept_mutex_unlock(); | |
276 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 280 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
277 cycle->log, err, "sigtimedwait() failed"); | 281 cycle->log, err, "sigtimedwait() failed"); |
278 ngx_accept_mutex_unlock(); | |
279 return NGX_ERROR; | 282 return NGX_ERROR; |
280 } | 283 } |
281 | 284 |
282 if (timer != NGX_TIMER_INFINITE) { | 285 if (timer != NGX_TIMER_INFINITE) { |
283 delta = ngx_elapsed_msec - delta; | 286 delta = ngx_elapsed_msec - delta; |
285 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 288 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
286 "rtsig timer: %d, delta: %d", timer, (int) delta); | 289 "rtsig timer: %d, delta: %d", timer, (int) delta); |
287 } | 290 } |
288 | 291 |
289 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 292 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
290 "signo:%d fd:%d band:%X", signo, si.si_fd, si.si_band); | 293 "rtsig signo:%d fd:%d band:%X", signo, si.si_fd, si.si_band); |
291 | 294 |
292 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); | 295 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); |
293 | 296 |
294 if (signo == rtscf->signo) { | 297 if (signo == rtscf->signo || signo == rtscf->signo + 1) { |
295 | 298 |
296 /* TODO: old_cycles */ | 299 /* TODO: old_cycles */ |
297 | 300 |
298 c = &ngx_cycle->connections[si.si_fd]; | 301 c = &ngx_cycle->connections[si.si_fd]; |
299 | 302 |
300 /* TODO: stale signals */ | 303 instance = signo - rtscf->signo; |
304 | |
305 if (si.si_band & POLLIN) { | |
306 c->read->returned_instance = instance; | |
307 } | |
308 | |
309 if (si.si_band & POLLOUT) { | |
310 c->write->returned_instance = instance; | |
311 } | |
312 | |
313 if (c->read->instance != instance) { | |
314 | |
315 /* | |
316 * the stale event from a file descriptor | |
317 * that was just closed in this iteration | |
318 */ | |
319 | |
320 ngx_accept_mutex_unlock(); | |
321 | |
322 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
323 "rtsig: stale event " PTR_FMT, c); | |
324 | |
325 return NGX_OK; | |
326 } | |
301 | 327 |
302 if (si.si_band & (POLLIN|POLLHUP|POLLERR)) { | 328 if (si.si_band & (POLLIN|POLLHUP|POLLERR)) { |
303 if (c->read->active) { | 329 if (c->read->active) { |
304 c->read->ready = 1; | 330 c->read->ready = 1; |
305 | 331 |
306 if (!ngx_threaded && !ngx_accept_mutex_held) { | 332 if (!ngx_threaded && !ngx_accept_mutex_held) { |
307 c->read->event_handler(c->read); | 333 c->read->event_handler(c->read); |
308 | 334 |
309 } else if (c->read->accept) { | 335 } else if (c->read->accept) { |
310 if (ngx_accept_disabled > 0) { | 336 if (ngx_accept_disabled <= 0) { |
311 c->read->event_handler(c->read); | 337 c->read->event_handler(c->read); |
312 } | 338 } |
313 | 339 |
314 } else { | 340 } else { |
315 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 341 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { |
369 | 395 |
370 /* STUB: add events. WHAT to do with fcntl()s ? */ | 396 /* STUB: add events. WHAT to do with fcntl()s ? */ |
371 | 397 |
372 | 398 |
373 } else { | 399 } else { |
400 ngx_accept_mutex_unlock(); | |
401 | |
374 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | 402 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
375 "sigtimedwait() returned unexpected signal: %d", signo); | 403 "sigtimedwait() returned unexpected signal: %d", signo); |
376 ngx_accept_mutex_unlock(); | 404 |
377 return NGX_ERROR; | 405 return NGX_ERROR; |
378 } | 406 } |
379 | 407 |
380 ngx_accept_mutex_unlock(); | 408 ngx_accept_mutex_unlock(); |
381 | 409 |