You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.4 KiB

(*
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
module F = Format
let late_callback = ref (fun () -> ())
let register_late f =
let g = !late_callback in
late_callback := fun () -> f () ; g ()
let late () = !late_callback ()
(* Run the epilogues when we get SIGINT (Control-C). We do not want to mask SIGINT unless at least
one epilogue has been registered, so make this value lazy. *)
let activate_run_epilogues_on_signal =
lazy
(let run_epilogues_on_signal s =
F.eprintf "*** %s: Caught %s, time to die@."
(Filename.basename Sys.executable_name)
(Signal.to_string s) ;
(* Invoke the callback that runs at the end of uncaught_exception_handler *)
late () ;
(* Epilogues are registered with [at_exit] so exiting will make them run. *)
Pervasives.exit 0
in
Signal.Expert.handle Signal.int run_epilogues_on_signal)
let register ~f desc =
let f_no_exn () =
if not !ProcessPoolState.in_child then
try f () with exn ->
F.eprintf "Error while running epilogue \"%s\":@ %a.@ Powering through...@." desc Exn.pp
exn
in
(* We call `exit` in a bunch of places, so register the epilogues with [at_exit]. *)
Pervasives.at_exit f_no_exn ;
(* Register signal masking. *)
Lazy.force activate_run_epilogues_on_signal