aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/exec.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-12-27 19:11:33 +0000
committerrsc <devnull@localhost>2004-12-27 19:11:33 +0000
commit8cbd854a8ab2c4f8c738c5bea5263217cb892a77 (patch)
tree0908a1e1cd3388a83308af104ae131fe663ef72b /src/libthread/exec.c
parent03417610742c4a67bb0345a8fa0fb4e13dee07f7 (diff)
downloadplan9port-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.c62
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[])
{