diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 16 | ||||
| -rw-r--r-- | src/event/modules/ngx_poll_module.c | 2 | ||||
| -rw-r--r-- | src/event/modules/ngx_sigio_module.c | 117 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 41 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 24 | ||||
| -rw-r--r-- | src/event/ngx_event_accept.c | 2 | ||||
| -rw-r--r-- | src/event/ngx_event_acceptex.c | 4 | ||||
| -rw-r--r-- | src/event/ngx_event_recv.c | 4 |
8 files changed, 164 insertions, 46 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index da8450e62..501b4960e 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -66,13 +66,21 @@ int ngx_kqueue_init(int max_connections, ngx_log_t *log) ngx_event_actions.timer = ngx_event_add_timer; ngx_event_actions.process = ngx_kqueue_process_events; - ngx_event_flags = NGX_HAVE_LEVEL_EVENT - |NGX_HAVE_ONESHOT_EVENT #if (HAVE_AIO_EVENT) - |NGX_HAVE_AIO_EVENT; + + ngx_event_flags = NGX_HAVE_AIO_EVENT; + #else - |NGX_HAVE_CLEAR_EVENT; + + ngx_event_flags = NGX_HAVE_LEVEL_EVENT + |NGX_HAVE_ONESHOT_EVENT +#if (HAVE_CLEAR_EVENT) + |NGX_HAVE_CLEAR_EVENT #endif + |NGX_HAVE_KQUEUE_EVENT; + +#endif + #endif return NGX_OK; diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 939340e46..25319c806 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -214,6 +214,8 @@ int ngx_poll_process_events(ngx_log_t *log) if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { found = 1; + /* need ot add to ready_index[nready++] = c->read or c->write; */ + err = 0; if (event_list[i].revents & POLLNVAL) { err = EBADF; diff --git a/src/event/modules/ngx_sigio_module.c b/src/event/modules/ngx_sigio_module.c new file mode 100644 index 000000000..f597b393d --- /dev/null +++ b/src/event/modules/ngx_sigio_module.c @@ -0,0 +1,117 @@ + + +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 { + } + } +} diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 063385dba..84e5e29da 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -36,33 +36,9 @@ ngx_event_t *ngx_read_events, *ngx_write_events; #if !(USE_KQUEUE) -#if (HAVE_KQUEUE) - -#if 0 -ngx_event_type_e ngx_event_type = NGX_SELECT_EVENT; -#elif 0 -ngx_event_type_e ngx_event_type = NGX_POLL_EVENT; -#else -ngx_event_type_e ngx_event_type = NGX_KQUEUE_EVENT; -#endif - -#elif (HAVE_DEVPOLL) - -#if 0 -ngx_event_type_e ngx_event_type = NGX_SELECT_EVENT; -#elif 0 -ngx_event_type_e ngx_event_type = NGX_POLL_EVENT; -#else -ngx_event_type_e ngx_event_type = NGX_DEVPOLL_EVENT; -#endif - -#else - -ngx_event_type_e ngx_event_type = NGX_SELECT_EVENT; - -#endif +ngx_event_type_e ngx_event_type; -int ngx_event_flags; +int ngx_event_flags; ngx_event_actions_t ngx_event_actions; @@ -97,8 +73,17 @@ void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) /* STUB */ int max_connections = 512; -#if (HAVE_IOCP) - ngx_event_type = NGX_IOCP_EVENT; +#if 0 + ngx_event_type = NGX_POLL_EVENT_N; +#endif +#if 1 + ngx_event_type = NGX_KQUEUE_EVENT_N; +#endif +#if 0 + ngx_event_type = NGX_DEVPOLL_EVENT_N; +#endif +#if 0 + ngx_event_type = NGX_IOCP_EVENT_N; #endif if (ngx_init_events(max_connections, log) == NGX_ERROR) { diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index d81be38fe..450fbe2b4 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -106,20 +106,20 @@ struct ngx_event_s { }; typedef enum { - NGX_SELECT_EVENT = 0, + NGX_SELECT_EVENT_N = 0, #if (HAVE_POLL) - NGX_POLL_EVENT, + NGX_POLL_EVENT_N, #endif #if (HAVE_DEVPOLL) - NGX_DEVPOLL_EVENT, + NGX_DEVPOLL_EVENT_N, #endif #if (HAVE_KQUEUE) - NGX_KQUEUE_EVENT, + NGX_KQUEUE_EVENT_N, #endif #if (HAVE_IOCP) - NGX_IOCP_EVENT, + NGX_IOCP_EVENT_N, #endif - NGX_DUMMY_EVENT /* avoid comma at end of enumerator list */ + NGX_DUMMY_EVENT_N /* avoid comma at end of enumerator list */ } ngx_event_type_e ; typedef struct { @@ -145,15 +145,21 @@ typedef struct { /* Event filter notifies only changes and initial level - kqueue */ #define NGX_HAVE_CLEAR_EVENT 4 +/* Event filter has kqueue features - eof flag, errno, available data, etc */ +#define NGX_HAVE_KQUEUE_EVENT 8 + /* Event filter notifies only changes (edgesi) but not initial level - epoll */ -#define NGX_HAVE_EDGE_EVENT 8 +#define NGX_HAVE_EDGE_EVENT 16 + +/* No need to add or delete event filters - rt signals */ +#define NGX_HAVE_SIGIO_EVENT 32 /* No need to add or delete event filters - overlapped, aio_read, aioread */ -#define NGX_HAVE_AIO_EVENT 16 +#define NGX_HAVE_AIO_EVENT 64 /* Need to add socket or halde only once - i/o completion port. It also requires to set HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT */ -#define NGX_HAVE_IOCP_EVENT 32 +#define NGX_HAVE_IOCP_EVENT 128 /* Event filter is deleted before closing file. Has no meaning for select, poll, epoll. diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index 2d64c0d9b..941f57c4e 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -156,7 +156,7 @@ int ngx_event_accept(ngx_event_t *ev) #elif (HAVE_KQUEUE) - if (ngx_event_type == NGX_KQUEUE_EVENT) { + if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) { ev->available--; } diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c index 83b3c42fc..0654c80fa 100644 --- a/src/event/ngx_event_acceptex.c +++ b/src/event/ngx_event_acceptex.c @@ -29,7 +29,7 @@ int ngx_event_acceptex(ngx_event_t *ev) return NGX_OK; } - GetAcceptExSockaddrs(c->data, 0, + getacceptexsockaddrs(c->data, 0, c->socklen + 16, c->socklen + 16, &c->local_sockaddr, &c->local_socklen, &c->sockaddr, &c->socklen); @@ -130,7 +130,7 @@ int ngx_event_post_acceptex(ngx_listen_t *ls, int n) return NGX_ERROR; } - if (AcceptEx(ls->fd, s, c->data, 0, + if (acceptex(ls->fd, s, c->data, 0, c->socklen + 16, c->socklen + 16, &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) { diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c index 4fa95c3ae..39eb32014 100644 --- a/src/event/ngx_event_recv.c +++ b/src/event/ngx_event_recv.c @@ -36,7 +36,7 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) #elif (HAVE_KQUEUE) - if (ngx_event_type == NGX_KQUEUE_EVENT) { + if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) { if (c->read->eof && c->read->available == 0) { if (c->read->error) { ngx_log_error(NGX_LOG_ERR, c->log, c->read->error, @@ -70,7 +70,7 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) #elif (HAVE_KQUEUE) - if (ngx_event_type == NGX_KQUEUE_EVENT) { + if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) { c->read->available -= n; } |
