tremove race between openfdthread and connoutthread msgput, so that openfd'ed fids always get clunked properly. - 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 21e626deb30c4cbd26b224b19ac3c9891b58a654
 (DIR) parent b37396bd1173964d5a3e40cc3e35aad5fef854c5
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue, 28 Dec 2004 22:11:34 +0000
       
       remove race between openfdthread and connoutthread msgput,
       so that openfd'ed fids always get clunked properly.
       
       Diffstat:
         M src/cmd/9pserve.c                   |       9 ++++++++-
       
       1 file changed, 8 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/cmd/9pserve.c b/src/cmd/9pserve.c
       t@@ -29,6 +29,7 @@ struct Fid
                int fid;
                int ref;
                int cfid;
       +        int openfd;
                Fid *next;
        };
        
       t@@ -550,6 +551,7 @@ openfdthread(void *v)
                                m = nil;
                        }
                }
       +/* CLUNK NOT HAPPENING */
                if(verbose) fprint(2, "eof on %d fid %d\n", c->fd, fid->fid);
                close(c->fd);
                closeioproc(io);
       t@@ -557,7 +559,8 @@ openfdthread(void *v)
                        msgput(m);
                        msgput(m);
                }
       -        if(fid->ref == 1){
       +        if(verbose) fprint(2, "eof on %d fid %d ref %d\n", c->fd, fid->fid, fid->ref);
       +        if(--fid->openfd == 0){
                        m = msgnew();
                        m->internal = 1;
                        m->c = c;
       t@@ -589,6 +592,7 @@ xopenfd(Msg *m)
                if(pipe(p) < 0){
                        rerrstr(errs, sizeof errs);
                        err(m, errs);
       +                /* XXX return here? */
                }
                if(verbose) fprint(2, "xopen pipe %d %d...", p[0], p[1]);
        
       t@@ -601,6 +605,7 @@ xopenfd(Msg *m)
                /* a ref for us */
                nc->fdfid = m->fid;
                m->fid->ref++;
       +        nc->fdfid->openfd++;
                nc->fdmode = m->tx.mode;
                nc->fd = p[0];
        
       t@@ -613,6 +618,7 @@ xopenfd(Msg *m)
                        nc->internal = chancreate(sizeof(void*), 0);
                        nc->fdfid = m->fid;
                        m->fid->ref++;
       +                nc->fdfid->openfd++;
                        nc->fdmode = OREAD;
                        nc->fd = dup(p[0], -1);
                        threadcreate(openfdthread, nc, STACK);
       t@@ -841,6 +847,7 @@ fidput(Fid *f)
                assert(f->ref > 0);
                if(--f->ref > 0)
                        return;
       +fprint(2, "free %d from %lux\n", f->fid, getcallerpc(&f));
                f->next = freefid;
                f->cfid = -1;
                freefid = f;