diff options
author | rsc <devnull@localhost> | 2004-12-27 17:19:44 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-12-27 17:19:44 +0000 |
commit | e127e40bb1327662a05f5b70dd1bbca5c69b042c (patch) | |
tree | 174086bd28c59819eff30a2bd1986e12a5ecb5ca /src/libthread/exec.c | |
parent | e8a7b9699925f3f650593d07eb382155e9374ae6 (diff) | |
download | plan9port-e127e40bb1327662a05f5b70dd1bbca5c69b042c.tar.gz plan9port-e127e40bb1327662a05f5b70dd1bbca5c69b042c.tar.bz2 plan9port-e127e40bb1327662a05f5b70dd1bbca5c69b042c.zip |
shuffle to allow use of execchan in non-pthreads impls
Diffstat (limited to 'src/libthread/exec.c')
-rw-r--r-- | src/libthread/exec.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/src/libthread/exec.c b/src/libthread/exec.c index 2cbb4437..f31b004a 100644 --- a/src/libthread/exec.c +++ b/src/libthread/exec.c @@ -7,17 +7,22 @@ static Lock thewaitlock; static Channel *thewaitchan; static Channel *dowaitchan; +static Channel *execchan; -/* BUG - start waitproc on first exec, not when threadwaitchan is called */ static void waitproc(void *v) { Channel *c; Waitmsg *w; + Execjob *e; _threadsetsysproc(); for(;;){ - while((w = wait()) == nil){ + for(;;){ + while((e = nbrecvp(execchan)) != nil) + sendul(e->c, _threadspawn(e->fd, e->cmd, e->argv)); + if((w = wait()) != nil) + break; if(errno == ECHILD) recvul(dowaitchan); } @@ -40,15 +45,12 @@ threadwaitchan(void) } thewaitchan = chancreate(sizeof(Waitmsg*), 4); chansetname(thewaitchan, "threadwaitchan"); - dowaitchan = chancreate(sizeof(ulong), 1); - chansetname(dowaitchan, "dowaitchan"); - proccreate(waitproc, nil, STACK); unlock(&thewaitlock); return thewaitchan; } int -threadspawn(int fd[3], char *cmd, char *argv[]) +_threadspawn(int fd[3], char *cmd, char *argv[]) { int i, n, p[2], pid; char exitstr[100]; @@ -97,6 +99,24 @@ threadspawn(int fd[3], char *cmd, char *argv[]) } 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"); + execchan = chancreate(sizeof(void*), 0); + chansetname(execchan, "execchan"); + proccreate(waitproc, nil, STACK); + } + unlock(&thewaitlock); + } + return _runthreadspawn(fd, cmd, argv); +} + + +int _threadexec(Channel *cpid, int fd[3], char *cmd, char *argv[]) { int pid; |