Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_rtsig_module.c @ 261:bdd631bf1a1c
nginx-0.0.2-2004-02-18-00:11:27 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 17 Feb 2004 21:11:27 +0000 |
parents | 5dacbb4daaf6 |
children | 8c5bdde0d9f0 |
comparison
equal
deleted
inserted
replaced
260:5dacbb4daaf6 | 261:bdd631bf1a1c |
---|---|
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 | 17 |
18 int sigwaitinfo(const sigset_t *set, siginfo_t *info); | |
19 | |
20 int sigtimedwait(const sigset_t *set, siginfo_t *info, | 18 int sigtimedwait(const sigset_t *set, siginfo_t *info, |
21 const struct timespec *timeout); | 19 const struct timespec *timeout); |
22 | 20 |
23 int sigwaitinfo(const sigset_t *set, siginfo_t *info) | |
24 { | |
25 return -1; | |
26 } | |
27 | 21 |
28 int sigtimedwait(const sigset_t *set, siginfo_t *info, | 22 int sigtimedwait(const sigset_t *set, siginfo_t *info, |
29 const struct timespec *timeout) | 23 const struct timespec *timeout) |
30 { | 24 { |
31 return -1; | 25 return -1; |
37 typedef struct { | 31 typedef struct { |
38 int signo; | 32 int signo; |
39 } ngx_rtsig_conf_t; | 33 } ngx_rtsig_conf_t; |
40 | 34 |
41 | 35 |
36 extern ngx_event_module_t ngx_poll_module_ctx; | |
37 | |
42 static int ngx_rtsig_init(ngx_cycle_t *cycle); | 38 static int ngx_rtsig_init(ngx_cycle_t *cycle); |
43 static void ngx_rtsig_done(ngx_cycle_t *cycle); | 39 static void ngx_rtsig_done(ngx_cycle_t *cycle); |
44 static int ngx_rtsig_add_connection(ngx_connection_t *c); | 40 static int ngx_rtsig_add_connection(ngx_connection_t *c); |
45 static int ngx_rtsig_del_connection(ngx_connection_t *c); | 41 static int ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags); |
46 static int ngx_rtsig_process_events(ngx_log_t *log); | 42 static int ngx_rtsig_process_events(ngx_log_t *log); |
43 static int ngx_rtsig_process_overlow(ngx_log_t *log); | |
47 | 44 |
48 static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle); | 45 static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle); |
49 static char *ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf); | 46 static char *ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf); |
50 | 47 |
51 | 48 |
98 | 95 |
99 static int ngx_rtsig_init(ngx_cycle_t *cycle) | 96 static int ngx_rtsig_init(ngx_cycle_t *cycle) |
100 { | 97 { |
101 ngx_rtsig_conf_t *rtscf; | 98 ngx_rtsig_conf_t *rtscf; |
102 | 99 |
100 if (ngx_poll_module_ctx.actions.init(cycle) == NGX_ERROR) { | |
101 return NGX_ERROR; | |
102 } | |
103 | |
103 rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); | 104 rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); |
104 | 105 |
105 sigemptyset(&set); | 106 sigemptyset(&set); |
106 sigaddset(&set, rtscf->signo); | 107 sigaddset(&set, rtscf->signo); |
107 sigaddset(&set, SIGIO); | 108 sigaddset(&set, SIGIO); |
122 } | 123 } |
123 | 124 |
124 | 125 |
125 static void ngx_rtsig_done(ngx_cycle_t *cycle) | 126 static void ngx_rtsig_done(ngx_cycle_t *cycle) |
126 { | 127 { |
128 ngx_poll_module_ctx.actions.done(cycle); | |
127 } | 129 } |
128 | 130 |
129 | 131 |
130 static int ngx_rtsig_add_connection(ngx_connection_t *c) | 132 static int ngx_rtsig_add_connection(ngx_connection_t *c) |
131 { | 133 { |
167 | 169 |
168 return NGX_OK; | 170 return NGX_OK; |
169 } | 171 } |
170 | 172 |
171 | 173 |
172 static int ngx_rtsig_del_connection(ngx_connection_t *c) | 174 static int ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags) |
173 { | 175 { |
176 if (!(flags & NGX_CLOSE_EVENT)) { | |
177 if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK) == -1) { | |
178 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | |
179 "fcntl(O_RDWR|O_NONBLOCK) failed"); | |
180 return NGX_ERROR; | |
181 } | |
182 } | |
183 | |
174 c->read->active = 0; | 184 c->read->active = 0; |
175 c->write->active = 0; | 185 c->write->active = 0; |
176 | 186 |
177 return NGX_OK; | 187 return NGX_OK; |
178 } | 188 } |
186 ngx_msec_t timer; | 196 ngx_msec_t timer; |
187 ngx_err_t err; | 197 ngx_err_t err; |
188 ngx_cycle_t **cycle; | 198 ngx_cycle_t **cycle; |
189 siginfo_t si; | 199 siginfo_t si; |
190 struct timeval tv; | 200 struct timeval tv; |
191 struct timespec ts; | 201 struct timespec ts, *tp; |
192 struct sigaction sa; | 202 struct sigaction sa; |
193 ngx_connection_t *c; | 203 ngx_connection_t *c; |
194 ngx_epoch_msec_t delta; | 204 ngx_epoch_msec_t delta; |
195 ngx_rtsig_conf_t *rtscf; | 205 ngx_rtsig_conf_t *rtscf; |
196 | 206 |
198 ngx_old_elapsed_msec = ngx_elapsed_msec; | 208 ngx_old_elapsed_msec = ngx_elapsed_msec; |
199 | 209 |
200 if (timer) { | 210 if (timer) { |
201 ts.tv_sec = timer / 1000; | 211 ts.tv_sec = timer / 1000; |
202 ts.tv_nsec = (timer % 1000) * 1000000; | 212 ts.tv_nsec = (timer % 1000) * 1000000; |
213 tp = &ts; | |
214 | |
215 } else { | |
216 tp = NULL; | |
203 } | 217 } |
204 | 218 |
205 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "rtsig timer: %d", timer); | 219 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "rtsig timer: %d", timer); |
206 | 220 |
207 if (timer) { | 221 /* Linux sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ |
208 signo = sigtimedwait(&set, &si, &ts); | 222 |
209 } else { | 223 signo = sigtimedwait(&set, &si, tp); |
210 signo = sigwaitinfo(&set, &si); | |
211 } | |
212 | 224 |
213 if (signo == -1) { | 225 if (signo == -1) { |
214 err = ngx_errno; | 226 err = ngx_errno; |
215 } else { | 227 } else { |
216 err = 0; | 228 err = 0; |
220 ngx_time_update(tv.tv_sec); | 232 ngx_time_update(tv.tv_sec); |
221 | 233 |
222 delta = ngx_elapsed_msec; | 234 delta = ngx_elapsed_msec; |
223 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; | 235 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; |
224 | 236 |
225 if (signo == -1) { | 237 if (err) { |
226 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 238 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
227 log, err, | 239 log, err, "sigtimedwait() failed"); |
228 timer ? "sigtimedwait() failed" : "sigwaitinfo() failed"); | |
229 return NGX_ERROR; | 240 return NGX_ERROR; |
230 } | 241 } |
231 | 242 |
232 if (timer) { | 243 if (timer) { |
233 delta = ngx_elapsed_msec - delta; | 244 delta = ngx_elapsed_msec - delta; |
264 | 275 |
265 } else if (signo == SIGIO) { | 276 } else if (signo == SIGIO) { |
266 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 277 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, |
267 "signal queue overflowed: " | 278 "signal queue overflowed: " |
268 "SIGIO, fd:%d, band:%X", si.si_fd, si.si_band); | 279 "SIGIO, fd:%d, band:%X", si.si_fd, si.si_band); |
280 | |
281 /* TODO: flush all the used RT signals */ | |
269 | 282 |
270 ngx_memzero(&sa, sizeof(struct sigaction)); | 283 ngx_memzero(&sa, sizeof(struct sigaction)); |
271 sa.sa_handler = SIG_DFL; | 284 sa.sa_handler = SIG_DFL; |
272 sigemptyset(&sa.sa_mask); | 285 sigemptyset(&sa.sa_mask); |
273 if (sigaction(rtscf->signo, &sa, NULL) == -1) { | 286 if (sigaction(rtscf->signo, &sa, NULL) == -1) { |
274 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 287 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, |
275 "sigaction(%d, SIG_DFL) failed", rtscf->signo); | 288 "sigaction(%d, SIG_DFL) failed", rtscf->signo); |
276 } | 289 } |
277 | 290 |
291 ngx_event_actions = ngx_poll_module_ctx.actions; | |
292 ngx_event_actions.process = ngx_rtsig_process_overflow; | |
293 ngx_event_flags = NGX_OVERFLOW_EVENT | |
294 |NGX_USE_LEVEL_EVENT|NGX_USE_ONESHOT_EVENT; | |
295 | |
296 /* STUB: add events. WHAT to do with fcntl()s ? */ | |
297 | |
298 | |
278 } else { | 299 } else { |
279 ngx_log_error(NGX_LOG_ALERT, log, 0, | 300 ngx_log_error(NGX_LOG_ALERT, log, 0, |
280 timer ? "sigtimedwait() returned unexpected signal: %d": | 301 "sigtimedwait() returned unexpected signal: %d", signo); |
281 "sigwaitinfo() returned unexpected signal: %d", | |
282 signo); | |
283 return NGX_ERROR; | 302 return NGX_ERROR; |
284 } | 303 } |
285 | 304 |
286 if (timer != (ngx_msec_t) -1 && delta) { | 305 if (timer != (ngx_msec_t) -1 && delta) { |
287 ngx_event_expire_timers((ngx_msec_t) delta); | 306 ngx_event_expire_timers((ngx_msec_t) delta); |
289 | 308 |
290 return NGX_OK; | 309 return NGX_OK; |
291 } | 310 } |
292 | 311 |
293 | 312 |
313 static int ngx_rtsig_process_overlow(ngx_log_t *log) | |
314 { | |
315 if (ngx_poll_module_ctx.actions.process(log) == NGX_OK) { | |
316 ngx_event_actions = ngx_rtsig_module_ctx.actions; | |
317 ngx_event_flags = NGX_USE_SIGIO_EVENT; | |
318 } | |
319 | |
320 return NGX_OK; | |
321 } | |
322 | |
323 | |
294 static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle) | 324 static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle) |
295 { | 325 { |
296 ngx_rtsig_conf_t *rtscf; | 326 ngx_rtsig_conf_t *rtscf; |
297 | 327 |
298 ngx_test_null(rtscf, ngx_palloc(cycle->pool, sizeof(ngx_rtsig_conf_t)), | 328 ngx_test_null(rtscf, ngx_palloc(cycle->pool, sizeof(ngx_rtsig_conf_t)), |