From 5a5bac70f486f2910a2f608c419e00441d6ad7bc Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 23 Feb 2013 12:44:49 -0800 Subject: [PATCH] unix.linux.proc: Refactor /proc parsing. Add generic to make pid/string and pid-string/string pairs into /proc/pid/pathname. --- basis/unix/linux/proc/proc.factor | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/basis/unix/linux/proc/proc.factor b/basis/unix/linux/proc/proc.factor index 3025b9df7b..45638550f4 100644 --- a/basis/unix/linux/proc/proc.factor +++ b/basis/unix/linux/proc/proc.factor @@ -3,7 +3,7 @@ USING: accessors arrays combinators combinators.smart io.encodings.utf8 io.files kernel math math.order math.parser memoize sequences sorting.slots splitting splitting.monotonic -strings ; +strings io.pathnames ; IN: unix.linux.proc ! /proc/* @@ -220,16 +220,24 @@ TUPLE: cpu-stat name user nice system idle iowait irq softirq steal guest guest- ! /proc/pid/* -: proc-pid-path ( pid string -- path ) +GENERIC# proc-pid-path 1 ( object string -- path ) + +M: integer proc-pid-path ( pid string -- path ) [ "/proc/" ] 2dip [ number>string "/" append ] dip 3append ; -: proc-pid-first-line ( pid string -- string ) - proc-pid-path utf8 file-lines first ; +M: string proc-pid-path ( pid-string string -- path ) + [ "/proc/" ] 2dip [ append-path ] dip append-path ; -: proc-pid-cmdline ( pid -- string ) - "cmdline" proc-pid-first-line ; +: proc-file-lines ( path -- strings ) utf8 file-lines ; +: proc-first-line ( path -- string/f ) proc-file-lines ?first ; + +: proc-pid-first-line ( pid string -- string ) + proc-pid-path proc-first-line ; + +: parse-proc-pid-cmdline ( pid -- string/f ) + "cmdline" proc-pid-path proc-first-line ; TUPLE: pid-stat pid filename state parent-pid group-id session-id terminal# terminal-group-id task-flags @@ -263,7 +271,9 @@ TUPLE: pid-stat pid filename state parent-pid group-id session-id terminal# env-start env-end exit-code ; -: proc-pid-stat ( pid -- stat ) - "stat" proc-pid-first-line " " split harvest +: parse-proc-pid-stat ( pid -- stat ) + "stat" proc-pid-path + proc-first-line + " " split harvest [ dup string>number [ nip ] when* ] map [ pid-stat boa ] input