From 139e862e32d76d0fd04f754eaf532c1608faebe7 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Sat, 17 Dec 2005 20:15:25 +0000 Subject: [PATCH] do not remove kq inkernel flag before event_del gets to it; bug reported by Tassilo von Parseval; also add a test for this behavior. svn:r190 --- README | 1 + kqueue.c | 4 +--- test/regress.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/README b/README index b978fe98..b8f69cde 100644 --- a/README +++ b/README @@ -24,5 +24,6 @@ fixing bugs: Mike Davis William Ahern Alexander von Gernler + Artur Grabowski If I have forgotten your name, please contact me. diff --git a/kqueue.c b/kqueue.c index 3bc6c2db..d760440c 100644 --- a/kqueue.c +++ b/kqueue.c @@ -266,10 +266,8 @@ kq_dispatch(struct event_base *base, void *arg, struct timeval *tv) if (!which) continue; - if (!(ev->ev_events & EV_PERSIST)) { - ev->ev_flags &= ~EVLIST_X_KQINKERNEL; + if (!(ev->ev_events & EV_PERSIST)) event_del(ev); - } event_active(ev, which, ev->ev_events & EV_SIGNAL ? events[i].data : 1); diff --git a/test/regress.c b/test/regress.c index d8e71ded..5217617c 100644 --- a/test/regress.c +++ b/test/regress.c @@ -656,6 +656,49 @@ test_multiple_events_for_same_fd(void) int decode_int(u_int32_t *pnumber, struct evbuffer *evbuf); +void +read_once_cb(int fd, short event, void *arg) +{ + char buf[256]; + int len; + + len = read(fd, buf, sizeof(buf)); + + if (called) { + test_ok = 0; + } else if (len) { + /* Assumes global pair[0] can be used for writing */ + write(pair[0], TEST1, strlen(TEST1)+1); + test_ok = 1; + } + + called++; +} + +void +test_want_only_once(void) +{ + struct event ev; + struct timeval tv; + + /* Very simple read test */ + setup_test("Want read only once: "); + + write(pair[0], TEST1, strlen(TEST1)+1); + + /* Setup the loop termination */ + timerclear(&tv); + tv.tv_sec = 1; + event_loopexit(&tv); + + event_set(&ev, pair[1], EV_READ, read_once_cb, &ev); + if (event_add(&ev, NULL) == -1) + exit(1); + event_dispatch(); + + cleanup_test(); +} + #define TEST_MAX_INT 6 void @@ -855,6 +898,8 @@ main (int argc, char **argv) test_multiple_events_for_same_fd(); + test_want_only_once(); + evtag_test(); rpc_test();