55 lines
1.9 KiB
OCaml
55 lines
1.9 KiB
OCaml
(**************************************************************************)
|
|
(* *)
|
|
(* OCaml *)
|
|
(* *)
|
|
(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *)
|
|
(* OCaml 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 GNU Lesser General Public License version 2.1, with the *)
|
|
(* special exception on linking described in the file LICENSE. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
(* 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 _ =
|
|
match Sys.os_type with
|
|
"Win32" -> ()
|
|
| _ ->
|
|
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
|