Skip site navigation (1)Skip section navigation (2)
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>