fix kqueue problem

svn:r50
This commit is contained in:
Niels Provos 2003-03-08 16:33:18 +00:00
parent 33b1c6c474
commit 0036d79ab6
3 changed files with 18 additions and 29 deletions

View File

@ -1,5 +1,6 @@
AUTOMAKE_OPTIONS = foreign no-dependencies AUTOMAKE_OPTIONS = foreign no-dependencies
CFLAGS += -Wall -g -O2
SUBDIRS = . sample test SUBDIRS = . sample test
EXTRA_DIST = acconfig.h evsignal.h \ EXTRA_DIST = acconfig.h evsignal.h \

View File

@ -21,7 +21,7 @@ AC_CHECK_LIB(socket, socket)
dnl Checks for header files. dnl Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS(poll.h signal.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h) AC_CHECK_HEADERS(inttypes.h stdint.h poll.h signal.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h)
if test "x$ac_cv_header_sys_queue_h" = "xyes"; then if test "x$ac_cv_header_sys_queue_h" = "xyes"; then
AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h) AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h)
AC_EGREP_CPP(yes, AC_EGREP_CPP(yes,

View File

@ -48,6 +48,9 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <err.h> #include <err.h>
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#ifdef USE_LOG #ifdef USE_LOG
#include "log.h" #include "log.h"
@ -56,6 +59,12 @@
#define log_error warn #define log_error warn
#endif #endif
#ifdef HAVE_INTTYPES_H
#define INTPTR(x) (intptr_t)x
#else
#define INTPTR(x) x
#endif
#include "event.h" #include "event.h"
extern struct event_list timequeue; extern struct event_list timequeue;
@ -234,39 +243,18 @@ kq_dispatch(void *arg, struct timeval *tv)
which |= EV_WRITE; which |= EV_WRITE;
} else if (events[i].filter == EVFILT_SIGNAL) { } else if (events[i].filter == EVFILT_SIGNAL) {
which |= EV_SIGNAL; which |= EV_SIGNAL;
} else }
events[i].filter = 0;
if (!which) if (!which)
continue; continue;
if (!(ev->ev_events & EV_PERSIST))
event_del(ev);
event_active(ev, which, event_active(ev, which,
ev->ev_events & EV_SIGNAL ? events[i].data : 1); ev->ev_events & EV_SIGNAL ? events[i].data : 1);
} }
for (i = 0; i < res; i++) {
/* XXX */
int ncalls, evres;
if (events[i].flags & EV_ERROR || events[i].filter == NULL)
continue;
ev = (struct event *)events[i].udata;
if (ev->ev_events & EV_PERSIST)
continue;
ncalls = 0;
if (ev->ev_flags & EVLIST_ACTIVE) {
ncalls = ev->ev_ncalls;
evres = ev->ev_res;
}
ev->ev_flags &= ~EVLIST_X_KQINKERNEL;
event_del(ev);
if (ncalls)
event_active(ev, evres, ncalls);
}
return (0); return (0);
} }
@ -286,7 +274,7 @@ kq_add(void *arg, struct event *ev)
kev.flags = EV_ADD; kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST)) if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT; kev.flags |= EV_ONESHOT;
kev.udata = ev; kev.udata = INTPTR(ev);
if (kq_insert(kqop, &kev) == -1) if (kq_insert(kqop, &kev) == -1)
return (-1); return (-1);
@ -305,7 +293,7 @@ kq_add(void *arg, struct event *ev)
kev.flags = EV_ADD; kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST)) if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT; kev.flags |= EV_ONESHOT;
kev.udata = ev; kev.udata = INTPTR(ev);
if (kq_insert(kqop, &kev) == -1) if (kq_insert(kqop, &kev) == -1)
return (-1); return (-1);
@ -320,7 +308,7 @@ kq_add(void *arg, struct event *ev)
kev.flags = EV_ADD; kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST)) if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT; kev.flags |= EV_ONESHOT;
kev.udata = ev; kev.udata = INTPTR(ev);
if (kq_insert(kqop, &kev) == -1) if (kq_insert(kqop, &kev) == -1)
return (-1); return (-1);