~ chicken-core (chicken-5) faeeb21091bc43f4e02670828080d6ff117915bf
commit faeeb21091bc43f4e02670828080d6ff117915bf Author: Peter Bex <peter@more-magic.net> AuthorDate: Thu Feb 6 15:19:16 2025 +0100 Commit: Peter Bex <peter@more-magic.net> CommitDate: Thu Feb 6 15:19:16 2025 +0100 Clean up process-fork return value handling and fix ##sys#call-with-cthulhu call Similar to 8de3923, more explicitly handle the three "pid" return value cases: error, child or parent. Also, wrap the call to the thunk in a lambda which is passed to the ##sys#call-with-cthulhu procedure instead of calling it and passing the result to ##sys#call-with-cthulhu (which somehow did not cause an error... probably because the exit call happened inside that thunk already) so that the continuation for the child is reset correctly. diff --git a/posixunix.scm b/posixunix.scm index a3fe86b9..8b8757be 100644 --- a/posixunix.scm +++ b/posixunix.scm @@ -1110,21 +1110,23 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) (if killothers (##sys#kill-other-threads thunk) (thunk))))) - (when (fx= -1 pid) - (posix-error #:process-error 'process-fork "cannot create child process")) - (cond ((zero? pid) - ;; child + (cond ((fx= -1 pid) ; error + (posix-error #:process-error 'process-fork "cannot create child process")) + ((fx= 0 pid) ; child process + (set! children '()) (cond (thunk - (##sys#call-with-cthulhu - (maybe-kill-others (lambda () - (set! children '()) - (thunk) - (exit 0))))) + (maybe-kill-others (lambda () + (##sys#call-with-cthulhu + (lambda () + (thunk) + ;; Make sure to run clean up tasks. + ;; NOTE: ##sys#call-with-cthulhu will invoke + ;; a more low-level runtime C_exit_runtime(0) + (exit 0)))))) (else - (maybe-kill-others (lambda () - (set! children '()) - #f))))) - (else (register-pid pid))))))) + (maybe-kill-others (lambda () #f))))) + (else ; parent process + (register-pid pid))))))) (set! chicken.process#process-execute (lambda (filename #!optional (arglist '()) envlist _)Trap