summaryrefslogtreecommitdiff
path: root/sys/src/libthread/exec.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-10-12 00:49:12 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2021-10-12 00:49:12 +0000
commit07608c768faadfe960872d492d960be3112b7999 (patch)
treedd98f9f231519dcc6a5f2b78164af83a50f851e6 /sys/src/libthread/exec.c
parent24bd67f990fde5f25783293f57f651c93ce19125 (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.c6
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);