module system/posix/time
strategies
/* The times() function stores the current process times in a quadruple
(user time, system time, user time of children, system time of children)
See man 2 times for more information */
times =
prim("SSL_times")
ticks-to-seconds =
?t; prim("SSL_TicksToSeconds", t)
diff-times :
((a1, b1, c1, d1), (a2, b2, c2, d2)) ->
(<subt>(a1, a2), <subt>(b1, b2), <subt>(c1, c2), <subt>(d1, d2))
add-times :
((a1, b1, c1, d1), (a2, b2, c2, d2)) ->
(<add>(a1, a2), <add>(b1, b2), <add>(c1, c2), <add>(d1, d2))
times-to-seconds :
(a, b, c, d) ->
(<ticks-to-seconds> a, <ticks-to-seconds> b, <ticks-to-seconds> c, <ticks-to-seconds> d)
user-time :
(a, b, c, d) -> a
system-time :
(a, b, c, d) -> b
cuser-time :
(a, b, c, d) -> c
csystem-time :
(a, b, c, d) -> d
self-children-user-time :
(a, b, c, d) -> <add>(a, c)
self-children-sys-time :
(a, b, c, d) -> <add>(b, d)
/**
* Total run-time so far.
*/
run-time =
times; crush(!0, add); ticks-to-seconds
/**
* Outputs the name of the program and the run time in seconds to
* stderr.
*/
report-run-time =
if <geq>(<get-config> "--statistics", 1) then
<fprintnl> (stderr(), [<whoami> (), " (", <run-time>, " secs)"])
end
profile(s) =
where(times => start)
; s
; !(<id>, <<diff-times> (<times>, start); crush(!0, add)>)
profile(msg, s) =
where(times => start)
; s
; where(
<diff-times
; <fprint> (stderr(), [<msg>
, " user ", <self-children-user-time; ticks-to-seconds>
, " system ", <self-children-sys-time; ticks-to-seconds>
, "\n"])> (<times>, start)
)
profile'(msg, s) =
where(times => start)
; s
; where(
!(<times>, start)
; diff-times
; ![" user ", <self-children-user-time; ticks-to-seconds>
, " system ", <self-children-sys-time; ticks-to-seconds>]
; msg
)