diff options
| author | Gaëtan Gilbert | 2019-11-08 21:40:57 +0100 |
|---|---|---|
| committer | Gaëtan Gilbert | 2020-01-13 15:27:13 +0100 |
| commit | a0c02da54bfedeaaa73b1188c3e2e0cd9a4e086b (patch) | |
| tree | e28165b0a567c78296f2c075ccadf25ce27ef0bb /clib/cUnix.ml | |
| parent | 7cde333abd7a1c25765a9438d1b830a133a15498 (diff) | |
Native compute: cleanup temporary files on program exit
We make a temporary directory for these files and cleanup at process
exit. The temporary directory means we don't have to guess what
extensions ocaml will produce, we can just delete everything there.
We use Lazy to avoid spamming unused directories when ahead-of-time
compiling without actually using native casts / nativenorm (typically
stdlib files).
Sadly ocaml has "create temp file" but not "create temp dir", so we
have to copy the name generation code.
Fix #10495
Diffstat (limited to 'clib/cUnix.ml')
| -rw-r--r-- | clib/cUnix.ml | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clib/cUnix.ml b/clib/cUnix.ml index c5f6bebb8e..6e3ad59b1f 100644 --- a/clib/cUnix.ml +++ b/clib/cUnix.ml @@ -140,3 +140,20 @@ let same_file f1 = Unix.Unix_error _ -> false) with Unix.Unix_error _ -> (fun _ -> false) + +(* Copied from ocaml filename.ml *) +let prng = lazy(Random.State.make_self_init ()) + +let temp_file_name temp_dir prefix suffix = + let rnd = (Random.State.bits (Lazy.force prng)) land 0xFFFFFF in + Filename.concat temp_dir (Printf.sprintf "%s%06x%s" prefix rnd suffix) + +let mktemp_dir ?(temp_dir=Filename.get_temp_dir_name()) prefix suffix = + let rec try_name counter = + let name = temp_file_name temp_dir prefix suffix in + match Unix.mkdir name 0o700 with + | () -> name + | exception (Sys_error _ as e) -> + if counter >= 1000 then raise e else try_name (counter + 1) + in + try_name 0 |
