diff options
Diffstat (limited to 'src/cmd/acme/mail/win.c')
-rw-r--r-- | src/cmd/acme/mail/win.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/cmd/acme/mail/win.c b/src/cmd/acme/mail/win.c index e407b0c3..8a3e60a9 100644 --- a/src/cmd/acme/mail/win.c +++ b/src/cmd/acme/mail/win.c @@ -24,10 +24,32 @@ newwindow(void) w->body = nil; w->data = nil; w->cevent = chancreate(sizeof(Event*), 0); + w->ref = 1; return w; } void +winincref(Window *w) +{ + qlock(&w->lk); + ++w->ref; + qunlock(&w->lk); +} + +void +windecref(Window *w) +{ + qlock(&w->lk); + if(--w->ref > 0){ + qunlock(&w->lk); + return; + } + fsclose(w->event); + chanfree(w->cevent); + free(w); +} + +void winsetdump(Window *w, char *dir, char *cmd) { if(dir != nil) @@ -125,6 +147,7 @@ wingetec(Window *w) w->nbuf = fsread(w->event, w->buf, sizeof w->buf); if(w->nbuf <= 0){ /* probably because window has exited, and only called by wineventproc, so just shut down */ + windecref(w); threadexits(nil); } w->bufp = w->buf; @@ -255,8 +278,6 @@ windel(Window *w, int sure) windormant(w); fsclose(w->ctl); w->ctl = nil; - fsclose(w->event); - w->event = nil; return 1; } |