aboutsummaryrefslogtreecommitdiff
path: root/clib
diff options
context:
space:
mode:
authorGaëtan Gilbert2019-11-08 21:40:57 +0100
committerGaëtan Gilbert2020-01-13 15:27:13 +0100
commita0c02da54bfedeaaa73b1188c3e2e0cd9a4e086b (patch)
treee28165b0a567c78296f2c075ccadf25ce27ef0bb /clib
parent7cde333abd7a1c25765a9438d1b830a133a15498 (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')
-rw-r--r--clib/cUnix.ml17
-rw-r--r--clib/cUnix.mli2
2 files changed, 19 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
diff --git a/clib/cUnix.mli b/clib/cUnix.mli
index 17574b3c42..55d307c724 100644
--- a/clib/cUnix.mli
+++ b/clib/cUnix.mli
@@ -65,3 +65,5 @@ val waitpid_non_intr : int -> Unix.process_status
(** Check if two file names refer to the same (existing) file *)
val same_file : string -> string -> bool
+(** Like [Stdlib.Filename.temp_file] but producing a directory. *)
+val mktemp_dir : ?temp_dir:string -> string -> string -> string