commit - 8ee6ad4d96bdb1f56cece8c11e75e5491ccc4020
commit + 5ddc97fc3e63fb0bdf14ec3583afbec765f1a45d
blob - fdf6ceee093bb38dc411619cf20f7fcf834714c5
blob + 511a7f2a672859c2cfc0350af391b8088692edb9
--- src/libventi/log.c
+++ src/libventi/log.c
#include <libc.h>
#include <venti.h>
+int ventilogging;
#define log not_the_log_library_call
+static char Eremoved[] = "[removed]";
+
enum
{ /* defaults */
LogChunkSize = 8192,
char *p;
VtLog *l, *last;
+ if(!ventilogging)
+ return nil;
+
h = hash(name)%nelem(vl.hash);
qlock(&vl.lk);
last = nil;
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;
}
/* insert */
l->next = vl.hash[h];
vl.hash[h] = l;
+ l->ref++;
l->ref++;
qunlock(&vl.lk);
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);
}
last->next = l->next;
else
vl.hash[h] = l->next;
+ l->name = Eremoved;
+ l->next = nil;
qunlock(&vl.lk);
vtlogclose(l);
return;
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;
{
VtLog *l;
va_list arg;
-
+
l = vtlogopen(name, LogSize);
+ if(l == nil)
+ return;
va_start(arg, fmt);
vtlogvprint(l, fmt, arg);
va_end(arg);
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
{
int i;
uchar tag, buf[2], *top;
- Rwait *r;
+ Rwait *r, *rr;
/* must malloc because stack could be private */
r = vtmallocz(sizeof(Rwait));
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
_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;
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;
}
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
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);
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;
}
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);