This commit is contained in:
cinap_lenrek 2014-05-26 22:49:07 +02:00
commit b672403c6d
2 changed files with 22 additions and 35 deletions

View file

@ -1270,39 +1270,34 @@ procstopwait(Proc *p, int ctl)
error(Eprocdied);
}
static void
procctlcloseone(Proc *p, Fgrp *f, int fd)
{
Chan *c;
c = f->fd[fd];
if(c == nil)
return;
f->fd[fd] = nil;
unlock(f);
qunlock(&p->debug);
cclose(c);
qlock(&p->debug);
lock(f);
}
void
procctlclosefiles(Proc *p, int all, int fd)
{
int i;
Fgrp *f;
Chan *c;
if(fd < 0)
error(Ebadfd);
f = p->fgrp;
if(f == nil)
error(Eprocdied);
lock(f);
f->ref++;
if(all)
for(i = 0; i < f->maxfd; i++)
procctlcloseone(p, f, i);
else
procctlcloseone(p, f, fd);
while(fd <= f->maxfd){
c = f->fd[fd];
if(c != nil){
f->fd[fd] = nil;
unlock(f);
qunlock(&p->debug);
cclose(c);
qlock(&p->debug);
lock(f);
}
if(!all)
break;
fd++;
}
unlock(f);
closefgrp(f);
}

View file

@ -292,28 +292,20 @@ sysopen(va_list list)
void
fdclose(int fd, int flag)
{
int i;
Chan *c;
Fgrp *f = up->fgrp;
lock(f);
c = f->fd[fd];
if(c == 0){
/* can happen for users with shared fd tables */
if(c == nil || (flag != 0 && (c->flag&flag) == 0)){
unlock(f);
return;
}
if(flag){
if(c==0 || !(c->flag&flag)){
unlock(f);
return;
}
f->fd[fd] = nil;
if(fd == f->maxfd){
while(fd > 0 && f->fd[fd] == nil)
f->maxfd = --fd;
}
f->fd[fd] = 0;
if(fd == f->maxfd)
for(i=fd; --i>=0 && f->fd[i]==0; )
f->maxfd = i;
unlock(f);
cclose(c);
}