51 lines
1.6 KiB
OCaml
51 lines
1.6 KiB
OCaml
(***********************************************************************)
|
|
(* *)
|
|
(* Objective Caml *)
|
|
(* *)
|
|
(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *)
|
|
(* Objective Caml port by John Malecki and Xavier Leroy *)
|
|
(* *)
|
|
(* Copyright 1996 Institut National de Recherche en Informatique et *)
|
|
(* en Automatique. All rights reserved. This file is distributed *)
|
|
(* under the terms of the Q Public License version 1.0. *)
|
|
(* *)
|
|
(***********************************************************************)
|
|
|
|
(* $Id$ *)
|
|
|
|
(* Handling of keyboard interrupts *)
|
|
|
|
let interrupted = ref false
|
|
|
|
let is_protected = ref false
|
|
|
|
let break signum =
|
|
if !is_protected
|
|
then interrupted := true
|
|
else raise Sys.Break
|
|
|
|
let _ =
|
|
Sys.set_signal Sys.sigint (Sys.Signal_handle break);
|
|
Sys.set_signal Sys.sigpipe (Sys.Signal_handle (fun _ -> raise End_of_file))
|
|
|
|
let protect f =
|
|
if !is_protected then
|
|
f ()
|
|
else begin
|
|
is_protected := true;
|
|
if not !interrupted then
|
|
f ();
|
|
is_protected := false;
|
|
if !interrupted then begin interrupted := false; raise Sys.Break end
|
|
end
|
|
|
|
let unprotect f =
|
|
if not !is_protected then
|
|
f ()
|
|
else begin
|
|
is_protected := false;
|
|
if !interrupted then begin interrupted := false; raise Sys.Break end;
|
|
f ();
|
|
is_protected := true
|
|
end
|