diff options
author | rsc <devnull@localhost> | 2004-12-27 19:11:33 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-12-27 19:11:33 +0000 |
commit | 8cbd854a8ab2c4f8c738c5bea5263217cb892a77 (patch) | |
tree | 0908a1e1cd3388a83308af104ae131fe663ef72b /src/libthread/exec.c | |
parent | 03417610742c4a67bb0345a8fa0fb4e13dee07f7 (diff) | |
download | plan9port-8cbd854a8ab2c4f8c738c5bea5263217cb892a77.tar.gz plan9port-8cbd854a8ab2c4f8c738c5bea5263217cb892a77.tar.bz2 plan9port-8cbd854a8ab2c4f8c738c5bea5263217cb892a77.zip |
better exec handling
Diffstat (limited to 'src/libthread/exec.c')
-rw-r--r-- | src/libthread/exec.c | 62 |
1 files changed, 25 insertions, 37 deletions
diff --git a/src/libthread/exec.c b/src/libthread/exec.c index dfdb71b6..6a7ca1db 100644 --- a/src/libthread/exec.c +++ b/src/libthread/exec.c @@ -6,41 +6,42 @@ static Lock thewaitlock; static Channel *thewaitchan; -Channel *_dowaitchan; -Channel *_threadexecchan; -Proc *_threadexecproc; -QLock _threadexeclock; static void -execthread(void *v) -{ - Execjob *e; - - USED(v); - while((e = recvp(_threadexecchan)) != nil){ -print("%d doexec pid %d\n", time(0), getpid()); - sendul(e->c, _threadspawn(e->fd, e->cmd, e->argv)); - } -} - -static void -waitproc(void *v) +execproc(void *v) { + int pid; Channel *c; + Execjob *e; Waitmsg *w; - _threadsetsysproc(); - _threadexecproc = proc(); - threadcreate(execthread, nil, 65536); - for(;;){ - while((w = wait()) == nil) - if(errno == ECHILD) - recvul(_dowaitchan); + e = v; + pid = _threadspawn(e->fd, e->cmd, e->argv); + sendul(e->c, pid); + if(pid > 0){ + w = waitfor(pid); if((c = thewaitchan) != nil) sendp(c, w); else free(w); } + threadexits(nil); +} + +int +_runthreadspawn(int *fd, char *cmd, char **argv) +{ + int pid; + Execjob e; + + e.fd = fd; + e.cmd = cmd; + e.argv = argv; + e.c = chancreate(sizeof(void*), 0); + proccreate(execproc, &e, 65536); + pid = recvul(e.c); + chanfree(e.c); + return pid; } Channel* @@ -104,28 +105,15 @@ _threadspawn(int fd[3], char *cmd, char *argv[]) close(fd[1]); if(fd[2] != fd[1] && fd[2] != fd[0]) close(fd[2]); - channbsendul(_dowaitchan, 1); return pid; } int threadspawn(int fd[3], char *cmd, char *argv[]) { - if(_dowaitchan == nil){ - lock(&thewaitlock); - if(_dowaitchan == nil){ - _dowaitchan = chancreate(sizeof(ulong), 1); - chansetname(_dowaitchan, "dowaitchan"); - _threadexecchan = chancreate(sizeof(void*), 1); - chansetname(_threadexecchan, "execchan"); - proccreate(waitproc, nil, STACK); - } - unlock(&thewaitlock); - } return _runthreadspawn(fd, cmd, argv); } - int _threadexec(Channel *cpid, int fd[3], char *cmd, char *argv[]) { |