Blame frx/frx_mem.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
(* Memory gauge *)
Packit bd2e5d
open Camltk
Packit bd2e5d
open Gc
Packit bd2e5d
Packit bd2e5d
let inited = ref None
Packit bd2e5d
let w = ref 300
Packit bd2e5d
let delay = ref 5 (* in seconds *)
Packit bd2e5d
let wordsize = (* officially approved *)
Packit bd2e5d
  if 1 lsl 31 = 0 then 4 else 8
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
let init () =
Packit bd2e5d
  let top = Toplevel.create Widget.default_toplevel [Class "CamlGC"] in
Packit bd2e5d
  let name = Camltk.appname_get () in
Packit bd2e5d
    Wm.title_set top (name ^ " Memory Gauge");
Packit bd2e5d
    Wm.withdraw top;
Packit bd2e5d
    inited := Some top;
Packit bd2e5d
    (* this should be executed before the internal "all" binding *)
Packit bd2e5d
    bind top [[], Destroy] (BindSet ([], (fun _ -> inited := None)));
Packit bd2e5d
    let fminors = Frame.create top [] in
Packit bd2e5d
      let lminors = Label.create fminors [Text "Minor collections"]
Packit bd2e5d
      and vminors = Label.create fminors [] in
Packit bd2e5d
      pack [lminors][Side Side_Left];
Packit bd2e5d
      pack [vminors][Side Side_Right; Fill Fill_X; Expand true];
Packit bd2e5d
    let fmajors = Frame.create top [] in
Packit bd2e5d
      let lmajors = Label.create fmajors [Text "Major collections"]
Packit bd2e5d
      and vmajors = Label.create fmajors [] in
Packit bd2e5d
      pack [lmajors][Side Side_Left];
Packit bd2e5d
      pack [vmajors][Side Side_Right; Fill Fill_X; Expand true];
Packit bd2e5d
    let fcompacts = Frame.create top [] in
Packit bd2e5d
      let lcompacts = Label.create fcompacts [Text "Compactions"]
Packit bd2e5d
      and vcompacts = Label.create fcompacts [] in
Packit bd2e5d
      pack [lcompacts][Side Side_Left];
Packit bd2e5d
      pack [vcompacts][Side Side_Right; Fill Fill_X; Expand true];
Packit bd2e5d
    let fsize = Frame.create top [] in
Packit bd2e5d
      let lsize = Label.create fsize [Text "Heap size (bytes)"]
Packit bd2e5d
      and vsize = Label.create fsize [] in
Packit bd2e5d
      pack [lsize][Side Side_Left];
Packit bd2e5d
      pack [vsize][Side Side_Right; Fill Fill_X; Expand true];
Packit bd2e5d
    let fheap = Frame.create top [Width (Pixels !w); Height (Pixels 10)] in
Packit bd2e5d
    let flive = Frame.create fheap [Background Red]
Packit bd2e5d
    and ffree = Frame.create fheap [Background Green]
Packit bd2e5d
    and fdead = Frame.create fheap [Background Black] in
Packit bd2e5d
      pack [fminors; fmajors; fcompacts; fsize; fheap][Fill Fill_X];
Packit bd2e5d
Packit bd2e5d
    let display () =
Packit bd2e5d
      let st = Gc.stat() in
Packit bd2e5d
       Label.configure vminors [Text (string_of_int st.minor_collections)];
Packit bd2e5d
       Label.configure vmajors [Text (string_of_int st.major_collections)];
Packit bd2e5d
       Label.configure vcompacts [Text (string_of_int st.compactions)];
Packit bd2e5d
       Label.configure vsize [Text (string_of_int (wordsize * st.heap_words))];
Packit bd2e5d
       let liver = (float st.live_words) /. (float st.heap_words)
Packit bd2e5d
       and freer = (float st.free_words) /. (float st.heap_words) in
Packit bd2e5d
       Place.configure flive [X (Pixels 0); Y (Pixels 0);
Packit bd2e5d
                              RelWidth liver; RelHeight 1.0];
Packit bd2e5d
       Place.configure ffree [RelX liver; Y (Pixels 0);
Packit bd2e5d
                              RelWidth freer; RelHeight 1.0];
Packit bd2e5d
       Place.configure fdead [RelX (liver +. freer); Y (Pixels 0);
Packit bd2e5d
                              RelWidth (1.0 -. freer -. liver); RelHeight 1.0]
Packit bd2e5d
Packit bd2e5d
    in
Packit bd2e5d
    let rec tim () =
Packit bd2e5d
      if Winfo.exists top then begin
Packit bd2e5d
        display();
Packit bd2e5d
        Timer.set (!delay * 1000) tim
Packit bd2e5d
      end
Packit bd2e5d
    in
Packit bd2e5d
    tim()
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
let rec f () =
Packit bd2e5d
  match !inited with
Packit bd2e5d
    Some w -> Wm.deiconify w
Packit bd2e5d
  | None -> init (); f()