Mercurial > hg > nginx
view src/event/modules/ngx_sigio_module.c @ 60:50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 11 Feb 2003 07:14:40 +0000 |
parents | |
children | 6753e8cdaa2c |
line wrap: on
line source
int ngx_sigio_add_event(ngx_event_t *ev, int signal) { ngx_connection_t *c; c = (ngx_connection_t *) ev->data; if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "fcntl(O_RDWR|O_NONBLOCK|O_ASYNC) failed"); return NGX_ERROR; } if (fcntl(c->fd, F_SETSIG, signal) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "fcntl(F_SETSIG) failed"); return NGX_ERROR; } if (fcntl(c->fd, F_SETOWN, pid) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "fcntl(F_SETOWN) failed"); return NGX_ERROR; } #if (HAVE_ONESIGFD) if (fcntl(c->fd, F_SETAUXFL, O_ONESIGFD) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "fcntl(F_SETAUXFL) failed"); return NGX_ERROR; } #endif return NGX_OK; } int ngx_sigio_process_events(ngx_log_t *log) { struct siginfo si; for ( ;; ) { if (timer) { sig = sigtimedwait(&sigio_set, &si, &ts); if (sig == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "sigtimedwait() failed"); continue; } } } else { sig = sigwaitinfo(&set, &si); if (sig == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "sigwaitinfo() failed"); } } if (sig == rtsig) { c = &ngx_connections[si.si_fd]; if (si.si_band & (POLLERR|POLLHUP|POLLNVAL)) { ev = ???; if (ev->active) { ev->ready = 1; if (ev->event_handler(ev) == NGX_ERROR) { ev->close_handler(ev); } } } if (si.si_band & (POLLIN)) { ev = c->read; if (ev->active) { ev->ready = 1; if (ev->event_handler(ev) == NGX_ERROR) { ev->close_handler(ev); } } } if (si.si_band & (POLLOUT)) { ev = c->write; if (ev->active) { ev->ready = 1; if (ev->event_handler(ev) == NGX_ERROR) { ev->close_handler(ev); } } } } else if (sig == SIGIO) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "Signal queue overflowed: " "SIGIO, fd:%d, band:%d", si.si_fd, si.si_band); /* flush queue: method #1 (dphttpd) */ ts.tv_sec = 0; ts.tv_nsec = 0; while (sigtimedwait(&sigio_set, &si, &ts) > 0); /* flush queue: method #2 (dkftpbench) */ signal(m_signum, SIG_IGN); signal(m_signum, SIG_DFL); /* do poll */ } else { } } }