Blame support/timer.ml

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file LICENSE found in the OCaml source tree.          *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
Packit bd2e5d
(* $Id$ *)
Packit bd2e5d
Packit bd2e5d
(* Timers *)
Packit bd2e5d
open Protocol
Packit bd2e5d
Packit bd2e5d
type tkTimer = int
Packit bd2e5d
Packit bd2e5d
external internal_add_timer : int -> cbid -> tkTimer
Packit bd2e5d
        =  "camltk_add_timer"
Packit bd2e5d
external internal_rem_timer : tkTimer -> unit
Packit bd2e5d
        =  "camltk_rem_timer"
Packit bd2e5d
Packit bd2e5d
type t = tkTimer * cbid (* the token and the cb id *)
Packit bd2e5d
Packit bd2e5d
(* A timer is used only once, so we must clean the callback table *)
Packit bd2e5d
let add ~ms ~callback =
Packit bd2e5d
  if !Protocol.debug then begin
Packit bd2e5d
    prerr_string "Timer.add "; flush stderr;
Packit bd2e5d
  end;
Packit bd2e5d
  let id = new_function_id () in
Packit bd2e5d
  if !Protocol.debug then begin
Packit bd2e5d
    prerr_string "id="; prerr_cbid id; flush stderr;
Packit bd2e5d
  end;
Packit bd2e5d
  let wrapped _ =
Packit bd2e5d
    clear_callback id; (* do it first in case f raises exception *)
Packit bd2e5d
    callback() in
Packit bd2e5d
  Hashtbl.add callback_naming_table id wrapped;
Packit bd2e5d
  let t = internal_add_timer ms id in
Packit bd2e5d
  if !Protocol.debug then begin
Packit bd2e5d
    prerr_endline " done"
Packit bd2e5d
  end;
Packit bd2e5d
   t,id
Packit bd2e5d
Packit bd2e5d
let set ~ms ~callback = ignore (add ~ms ~callback);;
Packit bd2e5d
Packit bd2e5d
(* If the timer has never been used, there is a small space leak in
Packit bd2e5d
   the C heap, where a copy of id has been stored *)
Packit bd2e5d
let remove (tkTimer, id) =
Packit bd2e5d
  internal_rem_timer tkTimer;
Packit bd2e5d
  clear_callback id