Module Name:    src
Committed By:   christos
Date:           Tue Feb 12 02:38:56 UTC 2019

Modified Files:
        src/external/mpl/bind/dist/lib/isc/unix: socket.c

Log Message:
Instead of queuing to a separate task, handle the fdwatch events inline.
Fixes locking. We could simplify the code a lot more now.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/external/mpl/bind/dist/lib/isc/unix/socket.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/mpl/bind/dist/lib/isc/unix/socket.c
diff -u src/external/mpl/bind/dist/lib/isc/unix/socket.c:1.5 src/external/mpl/bind/dist/lib/isc/unix/socket.c:1.6
--- src/external/mpl/bind/dist/lib/isc/unix/socket.c:1.5	Sat Jan 26 20:51:00 2019
+++ src/external/mpl/bind/dist/lib/isc/unix/socket.c	Mon Feb 11 21:38:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: socket.c,v 1.5 2019/01/27 01:51:00 christos Exp $	*/
+/*	$NetBSD: socket.c,v 1.6 2019/02/12 02:38:55 christos Exp $	*/
 
 /*
  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
@@ -2866,24 +2866,20 @@ dispatch_recv(isc__socket_t *sock) {
 		internal_recv(sock);
 		return;
 	}
-#if 0
+
+	LOCK(&sock->lock);
 	INSIST(!sock->pending_recv);
-#else
-	// XXX: locking
-	if (sock->pending_recv)
-		return;
-#endif
 
 	sender = sock->fdwatchtask;
 	sock->pending_recv = 1;
 	iev = &sock->readable_ev;
 
-	sock->references++;
+	isc_refcount_increment(&sock->references);
 	iev->ev_sender = sock;
 	iev->ev_action = internal_fdwatch_read;
 	iev->ev_arg = sock;
-
-	isc_task_send(sender, (isc_event_t **)&iev);
+	UNLOCK(&sock->lock);
+	internal_fdwatch_read(sender, iev);
 }
 
 static void
@@ -2896,18 +2892,21 @@ dispatch_send(isc__socket_t *sock) {
 		return;
 	}
 
+	LOCK(&sock->lock);
+
 	INSIST(!sock->pending_send);
 
 	sender = sock->fdwatchtask;
 	sock->pending_send = 1;
 	iev = &sock->writable_ev;
 
-	sock->references++;
+	isc_refcount_increment(&sock->references);
 	iev->ev_sender = sock;
 	iev->ev_action = internal_fdwatch_write;
 	iev->ev_arg = sock;
 
-	isc_task_send(sender, (isc_event_t **)&iev);
+	UNLOCK(&sock->lock);
+	internal_fdwatch_write(sender, iev);
 }
 
 /*
@@ -3374,9 +3373,7 @@ internal_fdwatch_write(isc_task_t *me, i
 
 	sock->pending_send = 0;
 
-	INSIST(sock->references > 0);
-	sock->references--;  /* the internal event is done with this socket */
-	if (sock->references == 0) {
+	if (isc_refcount_decrement(&sock->references) == 0) {
 		UNLOCK(&sock->lock);
 		destroy(&sock);
 		return;
@@ -3408,16 +3405,14 @@ internal_fdwatch_read(isc_task_t *me, is
 		   "internal_fdwatch_read: task %p got event %p", me, ev);
 
 	INSIST(sock->pending_recv == 1);
-	sock->pending_recv = 0;
 
 	UNLOCK(&sock->lock);
 	more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock,
 				      sock->fdwatcharg, ISC_SOCKFDWATCH_READ);
 	LOCK(&sock->lock);
 
-	INSIST(sock->references > 0);
-	sock->references--;  /* the internal event is done with this socket */
-	if (sock->references == 0) {
+	sock->pending_recv = 0;
+	if (isc_refcount_decrement(&sock->references) == 0) {
 		UNLOCK(&sock->lock);
 		destroy(&sock);
 		return;

Reply via email to