diff options
Diffstat (limited to 'src/event/modules')
| -rw-r--r-- | src/event/modules/ngx_devpoll_module.c | 5 | ||||
| -rw-r--r-- | src/event/modules/ngx_iocp_module.c | 6 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 53 | ||||
| -rw-r--r-- | src/event/modules/ngx_poll_module.c | 5 | ||||
| -rw-r--r-- | src/event/modules/ngx_select_module.c | 5 |
5 files changed, 54 insertions, 20 deletions
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index e2e7750f1..fbbcf5992 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -236,6 +236,7 @@ int ngx_devpoll_process_events(ngx_log_t *log) if ((int) timer != INFTIM) { gettimeofday(&tv, NULL); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; + ngx_event_expire_timers(delta); } else { if (events == 0) { @@ -305,9 +306,5 @@ int ngx_devpoll_process_events(ngx_log_t *log) } } - if ((int) timer != INFTIM) { - ngx_event_expire_timers(delta); - } - return NGX_OK; } diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c index f474c4c61..a84daa8e5 100644 --- a/src/event/modules/ngx_iocp_module.c +++ b/src/event/modules/ngx_iocp_module.c @@ -110,6 +110,7 @@ int ngx_iocp_process_events(ngx_log_t *log) if (timer != INFINITE) { delta = ngx_msec() - delta; + ngx_event_expire_timers(delta); } if (ovlp) { @@ -118,6 +119,7 @@ int ngx_iocp_process_events(ngx_log_t *log) ngx_log_debug(log, "iocp ev: %08x" _ ev); if (ev == e) { + /* it's not AcceptEx() completion */ ev->ready = 1; ev->available = bytes; } @@ -129,9 +131,5 @@ ngx_log_debug(log, "iocp ev: %08x" _ ev->event_handler); } } - if (timer != INFINITE) { - ngx_event_expire_timers(delta); - } - return NGX_OK; } diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index b49eb62bb..bc2fe217e 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -110,6 +110,13 @@ int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) ev->active = 1; ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; + /* The event addition or change should be always passed to a kernel + because there can be case when event was passed to a kernel then + added again to the change_list and then deleted from the change_list + by ngx_kqueue_del_event() so the first event still remains in a kernel */ + +#if 0 + if (nchanges > 0 && ev->index < nchanges && change_list[ev->index].udata == ev) @@ -118,12 +125,17 @@ int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) ngx_connection_t *c = (ngx_connection_t *) ev->data; ngx_log_debug(ev->log, "kqueue add event: %d: ft:%d" _ c->fd _ event); #endif + + /* if the event is still not passed to a kernel we change it */ + change_list[ev->index].filter = event; change_list[ev->index].flags = flags; return NGX_OK; } +#endif + return ngx_kqueue_set_event(ev, event, EV_ADD | flags); } @@ -142,6 +154,9 @@ int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) ngx_connection_t *c = (ngx_connection_t *) ev->data; ngx_log_debug(ev->log, "kqueue del event: %d: ft:%d" _ c->fd _ event); #endif + + /* if the event is still not passed to a kernel we will not pass it */ + if (ev->index < --nchanges) { e = (ngx_event_t *) change_list[nchanges].udata; change_list[ev->index] = change_list[nchanges]; @@ -151,6 +166,9 @@ int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) return NGX_OK; } + /* when a socket is closed kqueue automatically deletes its filters + so we do not need to delete a event explicity before a socket closing */ + if (flags & NGX_CLOSE_EVENT) { return NGX_OK; } @@ -257,6 +275,11 @@ int ngx_kqueue_process_events(ngx_log_t *log) gettimeofday(&tv, NULL); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; + /* Expired timers must be deleted before the events processing + because the new timers can be added during the processing */ + + ngx_event_expire_timers(delta); + } else { if (events == 0) { ngx_log_error(NGX_LOG_ALERT, log, 0, @@ -295,6 +318,9 @@ int ngx_kqueue_process_events(ngx_log_t *log) ev = (ngx_event_t *) event_list[i].udata; + /* It's a stale event from a socket + that was just closed in this iteration */ + if (!ev->active) { continue; } @@ -303,6 +329,29 @@ int ngx_kqueue_process_events(ngx_log_t *log) case EVFILT_READ: case EVFILT_WRITE: + + if (ev->first) { + if (nchanges > 0 + && ev->index < nchanges + && change_list[ev->index].udata == ev) { + + /* It's a stale event from a socket that was just closed + in this iteration and during processing another socket + was opened with the same number by accept() or socket() + and its event has been added the event to the change_list + but has not been passed to a kernel. Nevertheless + there's small chance that ngx_kqueue_set_event() has + flushed the new event if the change_list was filled up. + In this very rare case we would get EAGAIN while + a reading or a writing */ + + continue; + + } else { + ev->first = 0; + } + } + ev->available = event_list[i].data; if (event_list[i].flags & EV_EOF) { @@ -332,9 +381,5 @@ int ngx_kqueue_process_events(ngx_log_t *log) } } - if (timer) { - ngx_event_expire_timers(delta); - } - return NGX_OK; } diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 25319c806..23bcc3f33 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -175,6 +175,7 @@ int ngx_poll_process_events(ngx_log_t *log) if ((int) timer != INFTIM) { delta = ngx_msec() - delta; + ngx_event_expire_timers(delta); } else { if (ready == 0) { @@ -259,9 +260,5 @@ int ngx_poll_process_events(ngx_log_t *log) ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); } - if ((int) timer != INFTIM) { - ngx_event_expire_timers(delta); - } - return NGX_OK; } diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 50d030c74..e7abfaa6c 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -243,6 +243,7 @@ int ngx_select_process_events(ngx_log_t *log) if (timer) { delta = ngx_msec() - delta; + ngx_event_expire_timers(delta); } else { if (ready == 0) { @@ -312,9 +313,5 @@ int ngx_select_process_events(ngx_log_t *log) ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events"); } - if (timer) { - ngx_event_expire_timers(delta); - } - return NGX_OK; } |
