remove race between openfdthread and connoutthread msgput,

so that openfd'ed fids always get clunked properly.
This commit is contained in:
rsc 2004-12-28 22:11:34 +00:00
parent b37396bd11
commit 21e626deb3

View file

@ -29,6 +29,7 @@ struct Fid
int fid; int fid;
int ref; int ref;
int cfid; int cfid;
int openfd;
Fid *next; Fid *next;
}; };
@ -550,6 +551,7 @@ openfdthread(void *v)
m = nil; m = nil;
} }
} }
/* CLUNK NOT HAPPENING */
if(verbose) fprint(2, "eof on %d fid %d\n", c->fd, fid->fid); if(verbose) fprint(2, "eof on %d fid %d\n", c->fd, fid->fid);
close(c->fd); close(c->fd);
closeioproc(io); closeioproc(io);
@ -557,7 +559,8 @@ openfdthread(void *v)
msgput(m); msgput(m);
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 = msgnew();
m->internal = 1; m->internal = 1;
m->c = c; m->c = c;
@ -589,6 +592,7 @@ xopenfd(Msg *m)
if(pipe(p) < 0){ if(pipe(p) < 0){
rerrstr(errs, sizeof errs); rerrstr(errs, sizeof errs);
err(m, errs); err(m, errs);
/* XXX return here? */
} }
if(verbose) fprint(2, "xopen pipe %d %d...", p[0], p[1]); if(verbose) fprint(2, "xopen pipe %d %d...", p[0], p[1]);
@ -601,6 +605,7 @@ xopenfd(Msg *m)
/* a ref for us */ /* a ref for us */
nc->fdfid = m->fid; nc->fdfid = m->fid;
m->fid->ref++; m->fid->ref++;
nc->fdfid->openfd++;
nc->fdmode = m->tx.mode; nc->fdmode = m->tx.mode;
nc->fd = p[0]; nc->fd = p[0];
@ -613,6 +618,7 @@ xopenfd(Msg *m)
nc->internal = chancreate(sizeof(void*), 0); nc->internal = chancreate(sizeof(void*), 0);
nc->fdfid = m->fid; nc->fdfid = m->fid;
m->fid->ref++; m->fid->ref++;
nc->fdfid->openfd++;
nc->fdmode = OREAD; nc->fdmode = OREAD;
nc->fd = dup(p[0], -1); nc->fd = dup(p[0], -1);
threadcreate(openfdthread, nc, STACK); threadcreate(openfdthread, nc, STACK);
@ -841,6 +847,7 @@ fidput(Fid *f)
assert(f->ref > 0); assert(f->ref > 0);
if(--f->ref > 0) if(--f->ref > 0)
return; return;
fprint(2, "free %d from %lux\n", f->fid, getcallerpc(&f));
f->next = freefid; f->next = freefid;
f->cfid = -1; f->cfid = -1;
freefid = f; freefid = f;