]> granicus.if.org Git - libevent/commitdiff
do not remove kq inkernel flag before event_del gets to it; bug reported by
authorNiels Provos <provos@gmail.com>
Sat, 17 Dec 2005 20:15:25 +0000 (20:15 +0000)
committerNiels Provos <provos@gmail.com>
Sat, 17 Dec 2005 20:15:25 +0000 (20:15 +0000)
Tassilo von Parseval; also add a test for this behavior.

svn:r190

README
kqueue.c
test/regress.c

diff --git a/README b/README
index b978fe98ebf568f3fe324ac53d28a4d0d24c1319..b8f69cdee419993c7bee34784f2f385747118c2b 100644 (file)
--- 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.
index 3bc6c2db501c3f36bc3d2c4c85cf52b1fbf40042..d760440c3c46427e01aca1427bfe0174cd717ebb 100644 (file)
--- 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);
index d8e71deda22ee2ead1662014f457e7e2ae283fd0..5217617cf3b8ffe13275fb5986a5699528965408 100644 (file)
@@ -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();