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