ref: b672403c6d9ad0029782a71c2b9e4bbb8fe7fbf1
parent: 235cc0747d3909c4d3eac307fa58664896eb5951
parent: 9ebbfae28b3be0ffcc2122024441cac2f0025c09
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon May 26 18:49:07 EDT 2014
merge
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -1270,28 +1270,14 @@
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);
@@ -1298,11 +1284,20 @@
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);
}
--- a/sys/src/9/port/sysfile.c
+++ b/sys/src/9/port/sysfile.c
@@ -292,28 +292,20 @@
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);
}