add -W to specify window size.
various other little fixes.
diff --git a/src/libventi/server.c b/src/libventi/server.c
index 7ecaf7c..837cbf4 100644
--- a/src/libventi/server.c
+++ b/src/libventi/server.c
@@ -13,6 +13,8 @@
struct VtSconn
{
int ctl;
+ int ref;
+ QLock lk;
char dir[NETPATHLEN];
VtSrv *srv;
VtConn *c;
@@ -29,6 +31,27 @@
static void listenproc(void*);
static void connproc(void*);
+static void
+scincref(VtSconn *sc)
+{
+ qlock(&sc->lk);
+ sc->ref++;
+ qunlock(&sc->lk);
+}
+
+static void
+scdecref(VtSconn *sc)
+{
+ qlock(&sc->lk);
+ if(--sc->ref > 0){
+ qunlock(&sc->lk);
+ return;
+ }
+ if(sc->c)
+ vtfreeconn(sc->c);
+ vtfree(sc);
+}
+
VtSrv*
vtlisten(char *addr)
{
@@ -55,14 +78,13 @@
srv = v;
for(;;){
-fprint(2, "listen for venti\n");
ctl = listen(srv->adir, dir);
if(ctl < 0){
srv->dead = 1;
break;
}
-fprint(2, "got one\n");
sc = vtmallocz(sizeof(VtSconn));
+ sc->ref = 1;
sc->ctl = ctl;
sc->srv = srv;
strcpy(sc->dir, dir);
@@ -82,8 +104,8 @@
int fd;
r = nil;
- c = nil;
sc = v;
+ sc->c = nil;
fprint(2, "new call %s on %d\n", sc->dir, sc->ctl);
fd = accept(sc->ctl, sc->dir);
close(sc->ctl);
@@ -122,7 +144,9 @@
break;
r->rx.tag = r->tx.tag;
r->sc = sc;
+ scincref(sc);
if(_vtqsend(sc->srv->q, r) < 0){
+ scdecref(sc);
fprint(2, "hungup queue\n");
break;
}
@@ -136,10 +160,8 @@
vtfcallclear(&r->tx);
vtfree(r);
}
- if(c)
- vtfreeconn(c);
fprint(2, "freed %s\n", sc->dir);
- vtfree(sc);
+ scdecref(sc);
return;
}
@@ -167,6 +189,7 @@
return;
}
vtsend(sc->c, p);
+ scdecref(sc);
vtfcallclear(&r->tx);
vtfcallclear(&r->rx);
vtfree(r);