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.
This commit is contained in:
cinap_lenrek 2021-10-12 00:49:12 +00:00
parent 24bd67f990
commit 07608c768f
6 changed files with 72 additions and 63 deletions

View file

@ -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);