Commit Diff


commit - 8ee6ad4d96bdb1f56cece8c11e75e5491ccc4020
commit + 5ddc97fc3e63fb0bdf14ec3583afbec765f1a45d
blob - fdf6ceee093bb38dc411619cf20f7fcf834714c5
blob + 511a7f2a672859c2cfc0350af391b8088692edb9
--- src/libventi/log.c
+++ src/libventi/log.c
@@ -2,8 +2,11 @@
 #include <libc.h>
 #include <venti.h>
 
+int ventilogging;
 #define log	not_the_log_library_call
 
+static char Eremoved[] = "[removed]";
+
 enum
 {	/* defaults */
 	LogChunkSize = 8192,
@@ -35,6 +38,9 @@ vtlogopen(char *name, uint size)
 	char *p;
 	VtLog *l, *last;
 
+	if(!ventilogging)
+		return nil;
+
 	h = hash(name)%nelem(vl.hash);
 	qlock(&vl.lk);
 	last = nil;
@@ -65,6 +71,7 @@ vtlogopen(char *name, uint size)
 	p = (char*)(l->chunk+nc);
 	for(i=0; i<nc; i++){
 		l->chunk[i].p = p;
+		l->chunk[i].wp = p;
 		p += LogChunkSize;
 		l->chunk[i].ep = p;
 	}
@@ -74,6 +81,7 @@ vtlogopen(char *name, uint size)
 	/* insert */
 	l->next = vl.hash[h];
 	vl.hash[h] = l;
+	l->ref++;
 	
 	l->ref++;
 	qunlock(&vl.lk);
@@ -87,9 +95,11 @@ vtlogclose(VtLog *l)
 		return;
 
 	qlock(&vl.lk);
-	if(--l->ref == 0)
+	if(--l->ref == 0){
+		/* must not be in hash table */
+		assert(l->name == Eremoved);
 		free(l);
-	else
+	}else
 		assert(l->ref > 0);
 	qunlock(&vl.lk);
 }
@@ -109,6 +119,8 @@ vtlogremove(char *name)
 				last->next = l->next;
 			else
 				vl.hash[h] = l->next;
+			l->name = Eremoved;
+			l->next = nil;
 			qunlock(&vl.lk);
 			vtlogclose(l);
 			return;
@@ -116,16 +128,35 @@ vtlogremove(char *name)
 	qunlock(&vl.lk);
 }
 
+static int
+timefmt(Fmt *fmt)
+{
+	static uvlong t0;
+	uvlong t;
+
+	if(t0 == 0)
+		t0 = nsec();
+	t = nsec()-t0;
+	return fmtprint(fmt, "T+%d.%04d", (uint)(t/1000000000), (uint)(t%1000000000)/100000);
+}
+
 void
 vtlogvprint(VtLog *l, char *fmt, va_list arg)
 {
 	int n;
 	char *p;
 	VtLogChunk *c;
+	static int first = 1;
 
 	if(l == nil)
 		return;
 		
+	if(first){
+		fmtinstall('T', timefmt);
+		first = 0;
+	}
+		
+	
 	qlock(&l->lk);
 	c = l->w;
 	n = c->ep - c->wp;
@@ -160,8 +191,10 @@ vtlog(char *name, char *fmt, ...)
 {
 	VtLog *l;
 	va_list arg;
-	
+
 	l = vtlogopen(name, LogSize);
+	if(l == nil)
+		return;
 	va_start(arg, fmt);
 	vtlogvprint(l, fmt, arg);
 	va_end(arg);
@@ -183,6 +216,5 @@ vtlogdump(int fd, VtLog *l)
 			c = l->chunk;
 		write(fd, c->p, c->wp-c->p);
 	}
-	vtlogclose(l);
 }
 
blob - a39145305f655891da607ad2f121240f9cf08704
blob + 0cd9410a7f0380bbec11d73780bcf553b2f6b2a6
--- src/libventi/rpc.c
+++ src/libventi/rpc.c
@@ -36,7 +36,7 @@ vtrpc(VtConn *z, Packet *p)
 {
 	int i;
 	uchar tag, buf[2], *top;
-	Rwait *r;
+	Rwait *r, *rr;
 
 	/* must malloc because stack could be private */
 	r = vtmallocz(sizeof(Rwait));
@@ -86,16 +86,15 @@ vtrpc(VtConn *z, Packet *p)
 			muxrpc(z, p);
 		}
 		z->muxer = 0;
-		/* if there is anyone else sleeping, wake them to mux */
-		if(z->nsleep){
-			for(i=0; i<256; i++)
-				if(z->wait[i] != nil && ((Rwait*)z->wait[i])->sleeping)
-					break;
-			if(i==256)
-				fprint(2, "libventi: nsleep botch\n");
-			else
-				rwakeup(&((Rwait*)z->wait[i])->r);
-		}	
+		/* if there is anyone else sleeping, wake first unfinished to mux */
+		if(z->nsleep)
+		for(i=0; i<256; i++){
+			rr = z->wait[i];
+			if(rr && rr->sleeping && !rr->done){
+				rwakeup(&rr->r);
+				break;
+			}
+		}
 	}
 
 	p = r->p;
blob - 642d4de3965ade971e254347da559690becccb73
blob + 1d8477d5624b2c521ff3d432b091916fd284c493
--- src/libventi/send.c
+++ src/libventi/send.c
@@ -10,10 +10,9 @@ static int
 _vtsend(VtConn *z, Packet *p)
 {
 	IOchunk ioc;
-	int n;
+	int n, tot;
 	uchar buf[2];
 
-
 	if(z->state != VtStateConnected) {
 		werrstr("session not connected");
 		return -1;
@@ -32,18 +31,20 @@ _vtsend(VtConn *z, Packet *p)
 	ventisendbytes += n+2;
 	ventisendpackets++;
 
+	tot = 0;
 	for(;;){
 		n = packetfragments(p, &ioc, 1, 0);
 		if(n == 0)
 			break;
 		if(write(z->outfd, ioc.addr, ioc.len) < ioc.len){
-			vtlog(VtServerLog, "%s: sending packet %p: %r", z->addr, p);
+			vtlog(VtServerLog, "<font size=-1>%T %s:</font> sending packet %p: %r<br>\n", z->addr, p);
 			packetfree(p);
 			return 0;
 		}
 		packetconsume(p, nil, ioc.len);
+		tot += ioc.len;
 	}
-	vtlog(VtServerLog, "%s: sent packet %p", z->addr, p);
+	vtlog(VtServerLog, "<font size=-1>%T %s:</font> sent packet %p (%d bytes)<br>\n", z->addr, p, tot);
 	packetfree(p);
 	return 1;
 }
@@ -108,10 +109,10 @@ _vtrecv(VtConn *z)
 	ventirecvbytes += len;
 	ventirecvpackets++;
 	p = packetsplit(p, len);
-	vtlog(VtServerLog, "%s: read packet %p len %d", z->addr, p, len);
+	vtlog(VtServerLog, "<font size=-1>%T %s:</font> read packet %p len %d<br>\n", z->addr, p, len);
 	return p;
 Err:	
-	vtlog(VtServerLog, "%s: error reading packet: %r", z->addr);
+	vtlog(VtServerLog, "<font size=-1>%T %s:</font> error reading packet: %r<br>\n", z->addr);
 	return nil;	
 }
 
blob - ae64b3276a1de5aee4961e7633ea94db74fdb5c4
blob + ddaa97f81732afff7e0fda22aa960ff42d48c26f
--- src/libventi/server.c
+++ src/libventi/server.c
@@ -142,12 +142,12 @@ if(first && chattyventi){
 	while((p = vtrecv(c)) != nil){
 		r = vtmallocz(sizeof(VtReq));
 		if(vtfcallunpack(&r->tx, p) < 0){
-			vtlog(VtServerLog, "%s: recv bad packet %p: %r", c->addr, p);
+			vtlog(VtServerLog, "<font size=-1>%T %s:</font> recv bad packet %p: %r<br>\n", c->addr, p);
 			fprint(2, "bad packet on %s: %r\n", sc->dir);
 			packetfree(p);
 			continue;
 		}
-		vtlog(VtServerLog, "%s: recv packet %p (%F)", c->addr, p, &r->tx);
+		vtlog(VtServerLog, "<font size=-1>%T %s:</font> recv packet %p (%F)<br>\n", c->addr, p, &r->tx);
 		if(chattyventi)
 			fprint(2, "%s <- %F\n", argv0, &r->tx);
 		packetfree(p);
@@ -182,7 +182,7 @@ vtgetreq(VtSrv *srv)
 	VtReq *r;
 	
 	r = _vtqrecv(srv->q);
-	vtlog(VtServerLog, "%s: vtgetreq %F\n", ((VtSconn*)r->sc)->c->addr, &r->tx);
+	vtlog(VtServerLog, "<font size=-1>%T %s:</font> vtgetreq %F<br>\n", ((VtSconn*)r->sc)->c->addr, &r->tx);
 	return r;
 }
 
@@ -200,13 +200,13 @@ vtrespond(VtReq *r)
 	if(chattyventi)
 		fprint(2, "%s -> %F\n", argv0, &r->rx);
 	if((p = vtfcallpack(&r->rx)) == nil){
-		vtlog(VtServerLog, "%s: vtfcallpack %F: %r", sc->c->addr, &r->rx);
+		vtlog(VtServerLog, "%s: vtfcallpack %F: %r<br>\n", sc->c->addr, &r->rx);
 		fprint(2, "fcallpack on %s: %r\n", sc->dir);
 		packetfree(p);
 		vtfcallclear(&r->rx);
 		return;
 	}
-	vtlog(VtServerLog, "%s: send packet %p (%F)", sc->c->addr, p, &r->rx);
+	vtlog(VtServerLog, "<font size=-1>%T %s:</font> send packet %p (%F)<br>\n", sc->c->addr, p, &r->rx);
 	if(vtsend(sc->c, p) < 0)
 		fprint(2, "vtsend %F: %r\n", &r->rx);
 	scdecref(sc);