summaryrefslogtreecommitdiff
path: root/kqueue.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-05-30 16:56:34 +0000
committerNick Mathewson <nickm@torproject.org>2008-05-30 16:56:34 +0000
commit39400e68b6202dc40545b5ac26468fc3f7a11184 (patch)
tree6b018eb67519d1a7284c5c4103728354b8953ef6 /kqueue.c
parent9ca7a3a3d6be5741095b3ba2c7e1c979f66628cb (diff)
downloadlibevent-39400e68b6202dc40545b5ac26468fc3f7a11184.tar.gz
Patch from Valery Kholodkov: support for edge-triggered events with epoll and kqueue. Changed from original patch: made test into a regression test, with explicit success/failure for edge-triggered and non-edge-triggered cases. Closes SF request 1968284.
svn:r840
Diffstat (limited to 'kqueue.c')
-rw-r--r--kqueue.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/kqueue.c b/kqueue.c
index b213be02..38278938 100644
--- a/kqueue.c
+++ b/kqueue.c
@@ -272,7 +272,7 @@ kq_dispatch(struct event_base *base, void *arg, struct timeval *tv)
if (!(ev->ev_events & EV_PERSIST))
ev->ev_flags &= ~EVLIST_X_KQINKERNEL;
- event_active(ev, which,
+ event_active(ev, which | (ev->ev_events & EV_ET),
ev->ev_events & EV_SIGNAL ? events[i].data : 1);
}
@@ -322,6 +322,8 @@ kq_add(void *arg, struct event *ev)
kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT;
+ if (ev->ev_events & EV_ET)
+ kev.flags |= EV_CLEAR;
kev.udata = PTR_TO_UDATA(ev);
if (kq_insert(kqop, &kev) == -1)
@@ -337,6 +339,8 @@ kq_add(void *arg, struct event *ev)
kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT;
+ if (ev->ev_events & EV_ET)
+ kev.flags |= EV_CLEAR;
kev.udata = PTR_TO_UDATA(ev);
if (kq_insert(kqop, &kev) == -1)