aboutsummaryrefslogtreecommitdiff
path: root/src/event/modules/ngx_kqueue_module.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-05-12 15:52:24 +0000
committerIgor Sysoev <igor@sysoev.ru>2003-05-12 15:52:24 +0000
commit6b863e353d54420c323d67f86aad0b90ba04e316 (patch)
tree51d13ab529d2605be3995333d71344c917c5c4f4 /src/event/modules/ngx_kqueue_module.c
parent4fe262b6821a461b3dbb3d6bfd05a8f713157524 (diff)
downloadnginx-6b863e353d54420c323d67f86aad0b90ba04e316.tar.gz
nginx-6b863e353d54420c323d67f86aad0b90ba04e316.zip
nginx-0.0.1-2003-05-12-19:52:24 import
Diffstat (limited to 'src/event/modules/ngx_kqueue_module.c')
-rw-r--r--src/event/modules/ngx_kqueue_module.c42
1 files changed, 12 insertions, 30 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 4fe9e6b53..0c2ce35bf 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -141,7 +141,7 @@ int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags)
if (nchanges > 0
&& ev->index < nchanges
- && change_list[ev->index].udata == ev)
+ && (void *) ((uintptr_t) change_list[ev->index].udata & ~1) == ev)
{
#if (NGX_DEBUG_EVENT)
ngx_connection_t *c = (ngx_connection_t *) ev->data;
@@ -159,8 +159,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 */
+ /* when the file descriptor is closed a kqueue automatically deletes
+ its filters so we do not need to delete explicity the event
+ before the closing the file descriptor */
if (flags & NGX_CLOSE_EVENT) {
return NGX_OK;
@@ -200,7 +201,7 @@ int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
change_list[nchanges].ident = c->fd;
change_list[nchanges].filter = filter;
change_list[nchanges].flags = flags;
- change_list[nchanges].udata = ev;
+ change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance);
#if (HAVE_LOWAT_EVENT)
@@ -230,7 +231,7 @@ int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
int ngx_kqueue_process_events(ngx_log_t *log)
{
- int events, i;
+ int events, instance, i;
ngx_msec_t timer, delta;
ngx_event_t *ev;
struct timeval tv;
@@ -310,12 +311,15 @@ int ngx_kqueue_process_events(ngx_log_t *log)
}
ev = (ngx_event_t *) event_list[i].udata;
+ instance = (uintptr_t) ev & 1;
+ ev = (void *) ((uintptr_t) ev & ~1);
- /* It's a stale event from a socket
+ /* It's a stale event from a file descriptor
that was just closed in this iteration */
- if (!ev->active) {
- continue;
+ if (ev->active == 0 || ev->instance != instance) {
+ ngx_log_debug(log, "stale kevent");
+ continue;
}
switch (event_list[i].filter) {
@@ -323,28 +327,6 @@ 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) {