aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/exec.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-12-27 17:19:44 +0000
committerrsc <devnull@localhost>2004-12-27 17:19:44 +0000
commite127e40bb1327662a05f5b70dd1bbca5c69b042c (patch)
tree174086bd28c59819eff30a2bd1986e12a5ecb5ca /src/libthread/exec.c
parente8a7b9699925f3f650593d07eb382155e9374ae6 (diff)
downloadplan9port-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.c32
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;