[Bug 229741] kevent is not properly adding EVFILT_READ and EVFILT_WRITE for unix sockets when used in one call
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Wed Apr 22 01:06:31 UTC 2020
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=229741
Kyle Evans <kevans at freebsd.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kevans at freebsd.org
Resolution|--- |Works As Intended
Status|New |Closed
--- Comment #2 from Kyle Evans <kevans at freebsd.org> ---
The root of the problem here is that EV_RECEIPT on the first event will halt
processing because nevents == 0; this is common amongst {Net,Free,Open}BSD, at
least.
EV_RECEIPT should only be set on the last event you're passing in to get the
semantics you're wanting; if an error happens on any event before that one
you'll get the same EV_ERROR return (if feasible) and will not drain the queue.
If no error happens, you'll hit that one and still not drain the queue because
EV_RECEIPT is set.
Here's the diff I applied to your example:
<<<EOF
--- kq.c.orig 2020-04-21 20:02:08.123750000 -0500
+++ kq.c 2020-04-21 20:02:24.577357000 -0500
@@ -108,7 +108,7 @@
kq = kqueue();
- EV_SET(kev, client, EVFILT_READ, EV_ADD | EV_CLEAR |
EV_RECEIPT, 0, 0, 0);
+ EV_SET(kev, client, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, 0);
EV_SET(kev + 1, client, EVFILT_WRITE, EV_ADD | EV_CLEAR |
EV_RECEIPT, 0, 0, 0);
kevent(kq, kev, 2, NULL, 0, NULL);
@@ -131,7 +131,7 @@
kq = kqueue();
- EV_SET(kev, client, EVFILT_WRITE, EV_ADD | EV_CLEAR |
EV_RECEIPT, 0, 0, 0);
+ EV_SET(kev, client, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, 0);
EV_SET(kev + 1, client, EVFILT_READ, EV_ADD | EV_CLEAR |
EV_RECEIPT, 0, 0, 0);
kevent(kq, kev, 2, NULL, 0, NULL);
EOF
I'm tentatively closing this as "works as intended," but please do feel free to
re-open if you believe a change is necessary here after this explanation.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list