asio and kqueue (2nd trye) (was: RE: (boost::)asio and kqueue problem)

Konstantin Belousov kostikbel at gmail.com
Fri Oct 14 12:04:02 UTC 2016


On Fri, Oct 14, 2016 at 09:21:52AM +0000, Hartmut.Brandt at dlr.de wrote:
> 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.

I have only style notes, the factual code changes in the patch look good
to me.

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;
Style is against mixing declaration and initialization.  Please keep the
next removed line instead.
 
-	so = kn->kn_fp->f_data;
This one.

-	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 {
You do not need else {} block, 'then' branch ends with return(). If you
remove else, you do not need additional indent for the old filt_soread()
function' body.

+		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;
return (1);
since you change the line anyway.

+		} else {
+			if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
+				return 1;
Same.

+		}
+
+		/* 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)
 {


More information about the freebsd-current mailing list