tfixed - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 880ab2f10a2d4922d314ff8d016ea078f3c7f019
 (DIR) parent 201e19d672a2dab81e213237569022607aced2e1
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed, 15 Feb 2006 23:06:27 +0000
       
       fixed
       
       Diffstat:
         M src/cmd/acme/mail/dat.h             |       6 ++++++
         M src/cmd/acme/mail/mail.c            |       1 +
         M src/cmd/acme/mail/mesg.c            |       4 ++--
         M src/cmd/acme/mail/win.c             |      25 +++++++++++++++++++++++--
       
       4 files changed, 32 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/acme/mail/dat.h b/src/cmd/acme/mail/dat.h
       t@@ -25,6 +25,10 @@ struct Event
        
        struct Window
        {
       +        /* coordinate wineventproc and window thread */
       +        QLock        lk;
       +        int                ref;
       +
                /* file descriptors */
                CFid*                ctl;
                CFid*                event;
       t@@ -112,6 +116,8 @@ extern        int                winsetaddr(Window*, char*, int);
        extern        char*        winreadbody(Window*, int*);
        extern        void                windormant(Window*);
        extern        void                winsetdump(Window*, char*, char*);
       +extern        void                winincref(Window*);
       +extern        void                windecref(Window*);
        
        extern        void                readmbox(Message*, char*, char*);
        extern        void                rewritembox(Window*, Message*);
 (DIR) diff --git a/src/cmd/acme/mail/mail.c b/src/cmd/acme/mail/mail.c
       t@@ -470,6 +470,7 @@ mainctl(void *v)
                char *s, *t, *buf;
        
                w = v;
       +        winincref(w);
                proccreate(wineventproc, w, STACK);
        
                for(;;){
 (DIR) diff --git a/src/cmd/acme/mail/mesg.c b/src/cmd/acme/mail/mesg.c
       t@@ -720,8 +720,7 @@ mesgcommand(Message *m, char *cmd)
                }
                if(strcmp(args[0], "Del") == 0){
                        if(windel(m->w, 0)){
       -                        chanfree(m->w->cevent);
       -                        free(m->w);
       +                        windecref(m->w);
                                m->w = nil;
                                if(m->isreply)
                                        delreply(m);
       t@@ -886,6 +885,7 @@ mesgctl(void *v)
                m = v;
                w = m->w;
                threadsetname("mesgctl");
       +        winincref(w);
                proccreate(wineventproc, w, STACK);
                for(;;){
                        e = recvp(w->cevent);
 (DIR) diff --git a/src/cmd/acme/mail/win.c b/src/cmd/acme/mail/win.c
       t@@ -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)
       t@@ -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;
       t@@ -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;
        }