13 #if (NGX_TEST_BUILD_RTSIG)
18 #define si_fd __pad[0]
23 #define si_fd _reason.__spare__.__spare2__[0]
26 #define si_fd __spare__[0]
32 #define KERN_RTSIGNR 30
33 #define KERN_RTSIGMAX 31
35 int sigtimedwait(
const sigset_t *
set, siginfo_t *info,
36 const struct timespec *timeout);
38 int sigtimedwait(
const sigset_t *
set, siginfo_t *info,
39 const struct timespec *timeout)
69 static void *ngx_rtsig_create_conf(
ngx_cycle_t *cycle);
70 static char *ngx_rtsig_init_conf(
ngx_cycle_t *cycle,
void *conf);
71 static char *ngx_check_ngx_overflow_threshold_bounds(
ngx_conf_t *cf,
72 void *post,
void *data);
77 static struct pollfd *overflow_list;
83 ngx_check_ngx_overflow_threshold_bounds, 2, 10
115 &ngx_overflow_threshold_bounds },
123 ngx_rtsig_create_conf,
131 ngx_rtsig_add_connection,
132 ngx_rtsig_del_connection,
134 ngx_rtsig_process_events,
165 sigaddset(&
set, (
int) rtscf->
signo);
166 sigaddset(&
set, (
int) rtscf->
signo + 1);
167 sigaddset(&
set, SIGIO);
168 sigaddset(&
set, SIGALRM);
170 if (sigprocmask(SIG_BLOCK, &
set, NULL) == -1) {
172 "sigprocmask() failed");
182 if (overflow_list == NULL) {
203 overflow_list = NULL;
216 "rtsig enable connection: fd:%d", c->
fd);
218 if (fcntl(c->
fd, F_SETOWN,
ngx_pid) == -1) {
220 "fcntl(F_SETOWN) failed");
233 "rtsig add connection: fd:%d signo:%ui", c->
fd, signo);
235 if (fcntl(c->
fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) {
237 "fcntl(O_RDWR|O_NONBLOCK|O_ASYNC) failed");
241 if (fcntl(c->
fd, F_SETSIG, (
int) signo) == -1) {
243 "fcntl(F_SETSIG) failed");
247 if (fcntl(c->
fd, F_SETOWN,
ngx_pid) == -1) {
249 "fcntl(F_SETOWN) failed");
253 #if (NGX_HAVE_ONESIGFD)
254 if (fcntl(c->
fd, F_SETAUXFL, O_ONESIGFD) == -1) {
256 "fcntl(F_SETAUXFL) failed");
272 "rtsig del connection: fd:%d", c->
fd);
277 "rtsig disable connection: fd:%d", c->
fd);
290 if (fcntl(c->
fd, F_SETFL, O_RDWR|O_NONBLOCK) == -1) {
292 "fcntl(O_RDWR|O_NONBLOCK) failed");
311 struct timespec ts, *tp;
320 ts.tv_sec = timer / 1000;
321 ts.tv_nsec = (timer % 1000) * 1000000;
326 "rtsig timer: %M", timer);
330 signo = sigtimedwait(&
set, &si, tp);
336 "rtsig signo:%d", signo);
351 "sigtimedwait() returned EAGAIN without timeout");
356 cycle->
log, err,
"sigtimedwait() failed");
361 "rtsig signo:%d fd:%d band:%04Xd",
362 signo, si.si_fd, si.si_band);
364 if (flags & NGX_UPDATE_TIME) {
370 if (signo == (
int) rtscf->
signo || signo == (
int) rtscf->
signo + 1) {
372 if (overflow && (
ngx_uint_t) si.si_fd > overflow_current) {
385 instance = signo - (int) rtscf->
signo;
397 "rtsig: stale event %p", c);
402 if ((si.si_band & (POLLIN|POLLHUP|POLLERR)) && rev->
active) {
419 if ((si.si_band & (POLLOUT|POLLHUP|POLLERR)) && wev->
active) {
423 if (flags & NGX_POST_EVENTS) {
433 }
else if (signo == SIGALRM) {
439 }
else if (signo == SIGIO) {
442 "rt signal queue overflowed");
447 sa.sa_handler = SIG_DFL;
448 sigemptyset(&sa.sa_mask);
450 if (sigaction(rtscf->
signo, &sa, NULL) == -1) {
452 "sigaction(%d, SIG_DFL) failed", rtscf->
signo);
455 if (sigaction(rtscf->
signo + 1, &sa, NULL) == -1) {
457 "sigaction(%d, SIG_DFL) failed", rtscf->
signo + 1);
461 overflow_current = 0;
469 "sigtimedwait() returned unexpected signal: %d", signo);
479 int name[2], rtsig_max, rtsig_nr, events, ready;
488 "rtsig process overflow");
497 while (n < rtscf->overflow_events) {
503 c = cycle->
files[overflow_current++];
505 if (c == NULL || c->
fd == -1) {
523 overflow_list[n].fd = c->
fd;
524 overflow_list[n].events = events;
525 overflow_list[n].revents = 0;
534 ready = poll(overflow_list, n, 0);
537 "rtsig overflow poll:%d", ready);
543 "poll() failed while the overflow recover");
559 for (i = 0; i < n; i++) {
560 c = cycle->
files[overflow_list[
i].fd];
571 && (overflow_list[i].revents
572 & (POLLIN|POLLERR|POLLHUP|POLLNVAL)))
583 if (flags & NGX_POST_EVENTS) {
599 && (overflow_list[i].revents
600 & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)))
604 if (flags & NGX_POST_THREAD_EVENTS) {
611 if (flags & NGX_POST_EVENTS) {
635 name[1] = KERN_RTSIGMAX;
636 len =
sizeof(rtsig_max);
638 if (sysctl(name, 2, &rtsig_max, &len, NULL, 0) == -1) {
640 "sysctl(KERN_RTSIGMAX) failed");
645 name[1] = KERN_RTSIGNR;
646 len =
sizeof(rtsig_nr);
648 if (sysctl(name, 2, &rtsig_nr, &len, NULL, 0) == -1) {
650 "sysctl(KERN_RTSIGNR) failed");
662 "rtsig queue state: %d/%d",
663 rtsig_nr, rtsig_max);
664 while (ngx_rtsig_process_events(cycle, 0, flags) ==
NGX_OK)
677 while (ngx_rtsig_process_events(cycle, 0, flags) ==
NGX_OK) {
686 if (flags & NGX_UPDATE_TIME) {
691 "rt signal queue overflow recovered");
720 ngx_rtsig_init_conf(
ngx_cycle_t *cycle,
void *conf)
736 ngx_check_ngx_overflow_threshold_bounds(
ngx_conf_t *cf,
void *post,
void *data)
743 "\"rtsig_overflow_threshold\" is not supported "
744 "since Linux 2.6.6-mm2, ignored");