diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-10-12 00:49:12 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-10-12 00:49:12 +0000 |
commit | 07608c768faadfe960872d492d960be3112b7999 (patch) | |
tree | dd98f9f231519dcc6a5f2b78164af83a50f851e6 /sys/src/libthread/exec.c | |
parent | 24bd67f990fde5f25783293f57f651c93ce19125 (diff) |
libthread: deal with _schedfork() and _schedexec() returning -1
The current behaviour of the kernel to deadlock itself
instead of returning an error on fork.
This might change in the future, so prepare libthread
to handle this case.
For _schedfork(), we'r going to just retry forking
on every switch, while for _schedexec(), the exec
will fail and send ~0 down the pid channel.
Diffstat (limited to 'sys/src/libthread/exec.c')
-rw-r--r-- | sys/src/libthread/exec.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/src/libthread/exec.c b/sys/src/libthread/exec.c index 3bfbda3c6..b3ac6c213 100644 --- a/sys/src/libthread/exec.c +++ b/sys/src/libthread/exec.c @@ -45,8 +45,10 @@ procexec(Channel *pidc, char *prog, char *args[]) close(p->exec.fd[1]); p->exec.fd[1] = n; + while(p->needexec || p->newproc) + _sched(); + /* exec in parallel via the scheduler */ - assert(p->needexec==0); p->exec.prog = prog; p->exec.args = args; p->needexec = 1; @@ -61,6 +63,8 @@ procexec(Channel *pidc, char *prog, char *args[]) } close(p->exec.fd[0]); + if(t->ret == -1) + goto Bad; if(pidc) sendul(pidc, t->ret); |