merge
This commit is contained in:
commit
b672403c6d
2 changed files with 22 additions and 35 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue