From 5512be01765f3d0607bf6c48d7fe00b80f9d83fa Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Fri, 11 Jul 2008 15:15:04 +0000 Subject: [PATCH] fix a bug where deleting signals with kqueue would delete subsequent adds svn:r899 --- ChangeLog | 1 + kqueue.c | 7 +++++-- test/regress.c | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4fa55b3c..f3e66962 100644 --- a/ChangeLog +++ b/ChangeLog @@ -116,6 +116,7 @@ Changes in current version: o Reject negative Content-Length headers; anonymous bug report o Detect CLOCK_MONOTONIC at runtime for evdns; anonymous bug report o Various HTTP correctness fixes from Scott Lamb + o Fix a bug where deleting signals with the kqueue backend would cause subsequent adds to fail Changes in 1.4.0: o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr. diff --git a/kqueue.c b/kqueue.c index 862aa2bc..6627171e 100644 --- a/kqueue.c +++ b/kqueue.c @@ -364,14 +364,17 @@ kq_del(void *arg, struct event *ev) if (ev->ev_events & EV_SIGNAL) { int nsignal = EVENT_SIGNAL(ev); + struct timespec timeout = { 0, 0 }; memset(&kev, 0, sizeof(kev)); kev.ident = nsignal; kev.filter = EVFILT_SIGNAL; kev.flags = EV_DELETE; - if (kq_insert(kqop, &kev) == -1) - return (-1); + /* Because we insert signal events immediately, we need to + * delete them immediately, too */ + if (kevent(kqop->kq, &kev, 1, NULL, 0, &timeout) == -1) + return (-1); if (_evsignal_restore_handler(ev->ev_base, nsignal) == -1) return (-1); diff --git a/test/regress.c b/test/regress.c index 6c13deb8..b19402da 100644 --- a/test/regress.c +++ b/test/regress.c @@ -560,6 +560,9 @@ test_simplesignal(void) setup_test("Simple signal: "); signal_set(&ev, SIGALRM, signal_cb, &ev); signal_add(&ev, NULL); + /* find bugs in which operations are re-ordered */ + signal_del(&ev); + signal_add(&ev, NULL); memset(&itv, 0, sizeof(itv)); itv.it_value.tv_sec = 1; -- 2.50.1