shithub: riscv

Download patch

ref: 7f124310099b0ab12463b28f9d39104a8f17bc82
parent: 930be3d3173ce989d71675acedfca1fdf5466751
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Feb 3 20:39:36 EST 2017

aan: use unsigned message counters, reject repeated acks, cleanup debug prints

--- a/sys/src/cmd/aan.c
+++ b/sys/src/cmd/aan.c
@@ -36,7 +36,8 @@
 static Channel	*unacked;
 static Channel	*empty;
 static int	netfd;
-static int	inmsg;
+static ulong	inmsg;
+static ulong	outmsg;
 static char	*devdir;
 static int	debug;
 static int	done;
@@ -58,9 +59,7 @@
 static void		fromclient(void*);
 static int		reconnect(int);
 static void		synchronize(void);
-static void		showmsg(int, char *, Buf *);
 static int		writen(int, uchar *, int);
-static void		dmessage(int, char *, ...);
 static void		timerproc(void *);
 
 static void
@@ -84,13 +83,13 @@
 static void*
 emalloc(int n)
 {
-	ulong pc;
+	uintptr pc;
 	void *v;
 
 	pc = getcallerpc(&n);
 	v = malloc(n);
 	if(v == nil)
-		sysfatal("Cannot allocate memory; pc=%lux", pc);
+		sysfatal("Cannot allocate memory; pc=%#p", pc);
 	setmalloctag(v, pc);
 	return v;
 }
@@ -180,7 +179,7 @@
 		if (netfd < 0 || failed) {
 			// Wait for the netreader to die.
 			while (netfd >= 0) {
-				dmessage(1, "main; waiting for netreader to die\n");
+				if(debug) fprint(2, "main; waiting for netreader to die\n");
 				threadint(reader);
 				sleep(1000);
 			}
@@ -201,7 +200,6 @@
 			PBIT32(hdr.msg, -1);
 
 			if (writen(netfd, (uchar *)&hdr, Hdrsz) < 0) {
-				dmessage(2, "main; writen failed; %r\n");
 				failed = 1;
 				continue;
 			}
@@ -222,19 +220,15 @@
 
 			PBIT32(b->hdr.acked, inmsg);
 
-			if (writen(netfd, (uchar *)&b->hdr, Hdrsz) < 0) {
-				dmessage(2, "main; writen failed; %r\n");
+			if (writen(netfd, (uchar *)&b->hdr, Hdrsz) < 0)
 				failed = 1;
+			else {
+				n = GBIT32(b->hdr.nb);
+				if (writen(netfd, b->buf, n) < 0)
+					failed = 1;
+				if (n == 0)
+					done = 1;
 			}
-
-			n = GBIT32(b->hdr.nb);
-			if (writen(netfd, b->buf, n) < 0) {
-				dmessage(2, "main; writen failed; %r\n");
-				failed = 1;
-			}
-
-			if (n == 0)
-				done = 1;
 			break;
 		}
 	}
@@ -246,7 +240,6 @@
 static void
 fromclient(void*)
 {
-	static int outmsg;
 	int n;
 	Buf *b;
 
@@ -255,16 +248,10 @@
 	do {
 		b = recvp(empty);
 		n = read(0, b->buf, Bufsize);
-		if (n <= 0) {
-			if (n < 0)
-				dmessage(2, "fromclient; Cannot read 9P message; %r\n");
-			else
-				dmessage(2, "fromclient; Client terminated\n");
+		if (n < 0)
 			n = 0;
-		}
 		PBIT32(b->hdr.nb, n);
 		PBIT32(b->hdr.msg, outmsg);
-		showmsg(1, "fromclient", b);
 		sendp(unsent, b);
 		outmsg++;
 	} while(n > 0);
@@ -274,8 +261,8 @@
 fromnet(void*)
 {
 	extern void _threadnote(void *, char *);
-	static int lastacked;
-	int n, m, len, acked;
+	ulong m, acked, lastacked = 0;
+	int n, len;
 	Buf *b;
 
 	notify(_threadnote);
@@ -287,7 +274,7 @@
 		while (netfd < 0) {
 			if(done)
 				return;
-			dmessage(1, "fromnet; waiting for connection... (inmsg %d)\n", inmsg);
+			if(debug) fprint(2, "fromnet; waiting for connection... (inmsg %lud)\n", inmsg);
 			sleep(1000);
 		}
 
@@ -294,10 +281,12 @@
 		// Read the header.
 		len = readn(netfd, (uchar *)&b->hdr, Hdrsz);
 		if (len <= 0) {
-			if (len < 0)
-				dmessage(1, "fromnet; (hdr) network failure; %r\n");
-			else
-				dmessage(1, "fromnet; (hdr) network closed\n");
+			if (debug) {
+				if (len < 0)
+					fprint(2, "fromnet; (hdr) network failure; %r\n");
+				else
+					fprint(2, "fromnet; (hdr) network closed\n");
+			}
 			close(netfd);
 			netfd = -1;
 			continue;
@@ -306,16 +295,13 @@
 		n = GBIT32(b->hdr.nb);
 		m = GBIT32(b->hdr.msg);
 		acked = GBIT32(b->hdr.acked);
-		dmessage(2, "fromnet: Got message, size %d, nb %d, msg %d, acked %d, lastacked %d\n",
-			len, n, m, acked, lastacked);
-
 		if (n == 0) {
-			if (m < 0)
+			if (m == (ulong)-1)
 				continue;
-			dmessage(1, "fromnet; network closed\n");
+			if(debug) fprint(2, "fromnet; network closed\n");
 			break;
 		} else if (n < 0 || n > Bufsize) {
-			dmessage(1, "fromnet; message too big %d > %d\n", n, Bufsize);
+			if(debug) fprint(2, "fromnet; message too big %d > %d\n", n, Bufsize);
 			break;
 		}
 
@@ -322,28 +308,29 @@
 		len = readn(netfd, b->buf, n);
 		if (len <= 0 || len != n) {
 			if (len == 0)
-				dmessage(1, "fromnet; network closed\n");
+				if(debug) fprint(2, "fromnet; network closed\n");
 			else
-				dmessage(1, "fromnet; network failure; %r\n");
+				if(debug) fprint(2, "fromnet; network failure; %r\n");
 			close(netfd);
 			netfd = -1;
 			continue;
 		}
 
-		if (m < inmsg) {
-			dmessage(1, "fromnet; skipping message %d, currently at %d\n", m, inmsg);
+		if (m != inmsg) {
+			if(debug) fprint(2, "fromnet; skipping message %lud, currently at %lud\n", m, inmsg);
 			continue;
 		}			
 		inmsg++;
 
 		// Process the acked list.
-		while(lastacked != acked) {
+		while((long)(acked - lastacked) > 0) {
 			Buf *rb;
 
-			rb = recvp(unacked);
+			if((rb = recvp(unacked)) == nil)
+				break;
 			m = GBIT32(rb->hdr.msg);
 			if (m != lastacked) {
-				dmessage(1, "fromnet; rb %p, msg %d, lastacked %d\n", rb, m, lastacked);
+				if(debug) fprint(2, "fromnet; rb %p, msg %lud, lastacked %lud\n", rb, m, lastacked);
 				sysfatal("fromnet; bug");
 			}
 			PBIT32(rb->hdr.msg, -1);
@@ -351,8 +338,6 @@
 			lastacked++;
 		} 
 
-		showmsg(1, "fromnet", b);
-
 		if (writen(1, b->buf, len) < 0) 
 			sysfatal("fromnet; cannot write to client; %r");
 	}
@@ -375,10 +360,10 @@
 			err[0] = '\0';
 			errstr(err, sizeof err);
 			if (strstr(err, "connection refused")) {
-				dmessage(1, "reconnect; server died...\n");
+				if(debug) fprint(2, "reconnect; server died...\n");
 				threadexitsall("server died...");
 			}
-			dmessage(1, "reconnect: dialed %s; %s\n", dialstring, err);
+			if(debug) fprint(2, "reconnect: dialed %s; %s\n", dialstring, err);
 			sleep(1000);
 		}
 		alarm(0);
@@ -427,22 +412,6 @@
 	unacked = tmp;
 }
 
-static void
-showmsg(int level, char *s, Buf *b)
-{
-	int n;
-
-	if (b == nil) {
-		dmessage(level, "%s; b == nil\n", s);
-		return;
-	}
-	n = GBIT32(b->hdr.nb);
-	dmessage(level, "%s;  (len %d) %X %X %X %X %X %X %X %X %X (%p)\n", s, n, 
-		  	b->buf[0], b->buf[1], b->buf[2],
-		  	b->buf[3], b->buf[4], b->buf[5],
-		  	b->buf[6], b->buf[7], b->buf[8], b);
-}
-
 static int
 writen(int fd, uchar *buf, int nb)
 {
@@ -455,10 +424,9 @@
 			return -1;
 
 		if ((n = write(fd, buf, nb)) < 0) {
-			dmessage(1, "writen; Write failed; %r\n");
+			if(debug) fprint(2, "writen; Write failed; %r\n");
 			return -1;
 		}
-		dmessage(2, "writen: wrote %d bytes\n", n);
 
 		buf += n;
 		nb -= n;
@@ -477,17 +445,4 @@
 		sleep((Synctime / MS(1)) >> 1);
 		sendp(timer, "timer");
 	}
-}
-
-static void
-dmessage(int level, char *fmt, ...)
-{
-	va_list arg; 
-
-	if (level > debug) 
-		return;
-
-	va_start(arg, fmt);
-	vfprint(2, fmt, arg);
-	va_end(arg);
 }
--