X-Git-Url: http://git.annexia.org/?p=virt-mem.git;a=blobdiff_plain;f=ps%2Fvirt_ps.ml;h=07e5e76bba4b9fb37abf2dccd100077a7adce182;hp=5c53dbf7e29aa7475d77f94a4c3239265d2fc3e1;hb=48a85384daa4089f6d310293ab3f8d713740f962;hpb=cf4669f31197abcfb14dee874a4b738c9c2e6483 diff --git a/ps/virt_ps.ml b/ps/virt_ps.ml index 5c53dbf..07e5e76 100644 --- a/ps/virt_ps.ml +++ b/ps/virt_ps.ml @@ -23,33 +23,16 @@ open Virt_mem_gettext.Gettext open Virt_mem_utils open Virt_mem_types -open Kernel_task_struct +open Kernel -let run debug { domname = domname; mem = mem } - { utsname = utsname; tasks = tasks } = - let utsname = Option.get utsname in - let kernel_version = utsname.kernel_release in - let init_task_addr = Option.get tasks in - - (* Starting at init_task, navigate through the linked list of - * tasks (through tasks.next). The main program has already made - * sure these are mapped into memory. - *) - let tasks = - let rec loop acc task = - let next = task.task_struct_tasks'next in - if next <> init_task_addr then ( - let task = get_task_struct kernel_version mem next in - let task = { - task with - task_struct_comm = truncate_c_string task.task_struct_comm - } in - let acc = task :: acc in - loop acc task - ) else - acc - in - loop [] (get_task_struct kernel_version mem init_task_addr) in +let run debug { addrmap = addrmap } = + (* Grab all the task_struct structures. *) + let tasks = AddrMap.fold ( + fun _ v tasks -> + match v with + | _, Some (_, _, Task_struct task) -> task :: tasks + | _ -> tasks + ) addrmap [] in (* Sort tasks by PID. *) let cmp { task_struct_pid = p1 } { task_struct_pid = p2 } = compare p1 p2 in @@ -58,8 +41,9 @@ let run debug { domname = domname; mem = mem } printf " PID STAT COMMAND\n"; List.iter ( - fun task -> - printf "%5Ld %s\n" task.task_struct_pid task.task_struct_comm + fun { task_struct_pid = pid; task_struct_comm = comm } -> + let comm = truncate_c_string comm in + printf "%5Ld %s\n" pid comm ) tasks let summary = s_"list processes in virtual machine" @@ -68,5 +52,4 @@ virt-ps prints a process listing for virtual machines running under libvirt." let () = - Virt_mem.register "ps" summary description - ~needs_utsname:true ~needs_tasks:true ~run + Virt_mem.register "ps" summary description ~needs_tasks:true ~run