Date: Fri, 14 Oct 2016 09:21:52 +0000 From: <Hartmut.Brandt@dlr.de> To: <scott.k.mitch1@gmail.com>, <freebsd-current@freebsd.org> Cc: <sepherosa@gmail.com>, <kostikbel@gmail.com>, <adrian.chadd@gmail.com> Subject: asio and kqueue (2nd trye) (was: RE: (boost::)asio and kqueue problem) Message-ID: <611243783F62AF48AFB07BC25FA4B1061CE64959@DLREXMBX01.intra.dlr.de>
index | next in thread | raw e-mail
[-- Attachment #1 --]
Hi all,
here is the 2nd try taking into account the comments I received. Since I'm not familiar with the locking in the sockets area I ask somebody with that knowledge to check it before I commit it.
Thanks,
harti
From: Scott Mitchell [mailto:scott.k.mitch1@gmail.com]
Sent: Friday, October 14, 2016 2:16 AM
To: freebsd-current@freebsd.org
Cc: sepherosa@gmail.com; kostikbel@gmail.com; Brandt, Hartmut; adrian.chadd@gmail.com
Subject: (boost::)asio and kqueue problem
I am not using boost but I have also encountered this unexpected behavior when calling listen after kevent. Is their any update on the approach to merge filt_soread and filt_solisten?
FYI - MacOS does not have this unexpected behavior. Read events are not "missed" if the listen is done after the kevent EVFILT_READ change is registered.
Thanks,
-Scott
[-- Attachment #2 --]
Index: uipc_socket.c
===================================================================
--- uipc_socket.c (revision 307091)
+++ uipc_socket.c (working copy)
@@ -159,15 +159,9 @@
static int filt_soread(struct knote *kn, long hint);
static void filt_sowdetach(struct knote *kn);
static int filt_sowrite(struct knote *kn, long hint);
-static int filt_solisten(struct knote *kn, long hint);
static int inline hhook_run_socket(struct socket *so, void *hctx, int32_t h_id);
fo_kqfilter_t soo_kqfilter;
-static struct filterops solisten_filtops = {
- .f_isfd = 1,
- .f_detach = filt_sordetach,
- .f_event = filt_solisten,
-};
static struct filterops soread_filtops = {
.f_isfd = 1,
.f_detach = filt_sordetach,
@@ -3075,10 +3069,7 @@
switch (kn->kn_filter) {
case EVFILT_READ:
- if (so->so_options & SO_ACCEPTCONN)
- kn->kn_fop = &solisten_filtops;
- else
- kn->kn_fop = &soread_filtops;
+ kn->kn_fop = &soread_filtops;
sb = &so->so_rcv;
break;
case EVFILT_WRITE:
@@ -3282,29 +3273,34 @@
static int
filt_soread(struct knote *kn, long hint)
{
- struct socket *so;
+ struct socket *so = kn->kn_fp->f_data;
- so = kn->kn_fp->f_data;
- SOCKBUF_LOCK_ASSERT(&so->so_rcv);
+ if (so->so_options & SO_ACCEPTCONN) {
+ kn->kn_data = so->so_qlen;
+ return (!TAILQ_EMPTY(&so->so_comp));
- kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
- if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
- kn->kn_flags |= EV_EOF;
- kn->kn_fflags = so->so_error;
- return (1);
- } else if (so->so_error) /* temporary udp error */
- return (1);
+ } else {
+ SOCKBUF_LOCK_ASSERT(&so->so_rcv);
- if (kn->kn_sfflags & NOTE_LOWAT) {
- if (kn->kn_data >= kn->kn_sdata)
- return 1;
- } else {
- if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
- return 1;
+ kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
+ kn->kn_flags |= EV_EOF;
+ kn->kn_fflags = so->so_error;
+ return (1);
+ } else if (so->so_error) /* temporary udp error */
+ return (1);
+
+ if (kn->kn_sfflags & NOTE_LOWAT) {
+ if (kn->kn_data >= kn->kn_sdata)
+ return 1;
+ } else {
+ if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
+ return 1;
+ }
+
+ /* This hook returning non-zero indicates an event, not error */
+ return (hhook_run_socket(so, NULL, HHOOK_FILT_SOREAD));
}
-
- /* This hook returning non-zero indicates an event, not error */
- return (hhook_run_socket(so, NULL, HHOOK_FILT_SOREAD));
}
static void
@@ -3346,16 +3342,6 @@
return (kn->kn_data >= so->so_snd.sb_lowat);
}
-/*ARGSUSED*/
-static int
-filt_solisten(struct knote *kn, long hint)
-{
- struct socket *so = kn->kn_fp->f_data;
-
- kn->kn_data = so->so_qlen;
- return (!TAILQ_EMPTY(&so->so_comp));
-}
-
int
socheckuid(struct socket *so, uid_t uid)
{
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?611243783F62AF48AFB07BC25FA4B1061CE64959>
