X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=utils%2Falarm.ml;h=06a4913c6118dd329a8a9b3d5ce9f0178d410853;hb=d8e8a2b5c08a980a440d9fc9f3ea27af7711b524;hp=5a9c83f383f104fb2548cbc6ea79013ed3bb60e2;hpb=ae5b9f9b96a702ae8a8f61a31e5aa012283ce185;p=SXSI%2Fxpathcomp.git diff --git a/utils/alarm.ml b/utils/alarm.ml index 5a9c83f..06a4913 100644 --- a/utils/alarm.ml +++ b/utils/alarm.ml @@ -9,7 +9,6 @@ module Options = 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)"; @@ -18,15 +17,31 @@ module Options = "-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] [arguments ...]" Sys.argv.(0) + let usage_msg = sprintf "usage: %s [options] -- [arguments ...]" Sys.argv.(0) + let find_dash a = + let rec loop i len = + if i < len then + if a.(i) = "--" then i + else loop (i+1) len + else + raise Not_found + in + loop 0 (Array.length a) 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) - + let idash = find_dash Sys.argv in + let argv = Array.sub Sys.argv 0 idash in + let cmd = Array.sub Sys.argv (idash+1) (Array.length Sys.argv - idash - 1) in + let () = + try + Arg.parse_argv argv spec ignore usage_msg + with + Arg.Bad(s) -> Printf.eprintf "%s\n" s; exit 1 + | Arg.Help(s) -> Printf.printf "%s\n" s; exit 0 + | Not_found -> Arg.usage spec usage_msg; exit 1 + in + if Array.length cmd = 0 then (Arg.usage spec usage_msg; exit 1); + cmd end @@ -71,7 +86,7 @@ let rec monitor pid start finish mem fmt = else begin if not !Options.quiet then - fprintf fmt "[%f] Memory: current=%ikb max=%ikb\n%!" + fprintf fmt "[% 11.3f] Memory: current=%ikb max=%ikb\n%!" (current_time -. start) current_mem !max_mem; usleep !Options.interval; monitor pid start finish mem fmt