-let read_procmem pid =
- let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in
- let matchline s =
- try
- Scanf.sscanf s " VmHWM: %i kB" (fun i -> Some i)
- with
- | _ -> None
- in
- let rec loop () =
- match matchline (input_line cin) with
- Some i -> i
- | None -> loop ()
- in
- let s = try loop() with _ -> -1 in
- close_in cin;
- s
+module Options =
+ struct
+ let outfile = ref "/dev/stderr"
+ let page_size = ref ~-1
+ let timeout = ref 30
+ let max_mem = ref (512*1024)
+ let interval = ref 250
+ let quiet = ref false
+
+ let args = ref []
+ let spec = Arg.align [
+ "-o", Arg.Set_string outfile, " output file (default stderr)";
+ "-p", Arg.Set_int page_size, " page size in bytes (default autodetect)";
+ "-t", Arg.Set_int timeout, " timeout in s (default 30s)";
+ "-m", Arg.Set_int max_mem, " maximum memory in kiB (default 512 MiB)";
+ "-i", Arg.Set_int interval, " refresh interval in ms (default 250ms)";
+ "-q", Arg.Set(quiet), " don't print messages while running";
+ ]
+ let argument s = args := s :: !args
+ let usage_msg = sprintf "usage: %s [options] <program> [arguments ...]" Sys.argv.(0)
+
+ let parse_cmdline () =
+ let _ = Arg.parse spec argument usage_msg in
+ match !args with
+ [] -> Arg.usage spec usage_msg; exit 1
+ | l -> Array.of_list (List.rev l)
+
+ end
+
+
+(* Utility functions *)
+open Unix
+
+let get_page_size () =
+ let cin = open_process_in "getconf PAGESIZE" in
+ let s = input_line cin in
+ match close_process_in cin with
+ WEXITED 0 -> (try int_of_string s with _ -> ~-1)
+ | _ -> ~-1