~ chicken-core (chicken-5) 8ce5a7bfdddb7a537516a72ce24f33db13eff53c
commit 8ce5a7bfdddb7a537516a72ce24f33db13eff53c Author: Mario Domenech Goulart <mario@parenteses.org> AuthorDate: Thu Sep 12 20:36:10 2024 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Sep 17 16:25:46 2024 +0200 batch-driver.scm: Create C files atomically Parallel builds might break if C files are not create atomically. Signed-off-by: felix <felix@call-with-current-continuation.org> diff --git a/batch-driver.scm b/batch-driver.scm index b9cbe674..0cd0a9a0 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -37,6 +37,7 @@ (import scheme chicken.base + chicken.file chicken.fixnum chicken.format chicken.gc @@ -46,6 +47,7 @@ chicken.platform chicken.pretty-print chicken.process-context + chicken.process-context.posix chicken.string chicken.syntax chicken.port @@ -227,6 +229,10 @@ oname) ) ) ) ((memq 'to-stdout options) #f) (else (make-pathname #f (if filename (pathname-file filename) "out") "c")) ) ) + ;; Create a temporary file to receive the C code, so that it + ;; can atomically be renamed to the actual output file after + ;; the C generation. + (tmp-outfile (conc outfile ".tmp." (current-process-id) (current-seconds))) (opasses (default-optimization-passes)) (time0 #f) (time-breakdown #f) @@ -882,12 +888,15 @@ (with-output-to-file emit-link-file (cut pp exts)))) ;; Code generation - (let ((out (if outfile (open-output-file outfile) (current-output-port))) ) - (dribble "generating `~A' ..." outfile) + (let ((out (if outfile + (open-output-file tmp-outfile) + (current-output-port))) ) + (dribble "generating `~A' ..." tmp-outfile) (generate-code literals lliterals lambda-table out filename user-supplied-options dynamic db dbg-info) - (when outfile - (close-output-port out))) + (when tmp-outfile + (close-output-port out)) + (rename-file tmp-outfile outfile #t)) (end-time "code generation") (when (memq 't debugging-chicken) (##sys#display-times (##sys#stop-timer)))Trap