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);
}
--
⑨