X-Git-Url: http://nitlanguage.org diff --git a/lib/realtime.nit b/lib/realtime.nit index 8cfa4da..243b5d8 100644 --- a/lib/realtime.nit +++ b/lib/realtime.nit @@ -73,13 +73,16 @@ extern class Timespec `{struct timespec*`} clock_gettime(CLOCK_MONOTONIC, self); `} - # Substract a Timespec from `self`. - fun - ( o : Timespec ) : Timespec + # Subtract `other` from `self` + fun -(other: Timespec): Timespec do - var s = sec - o.sec - var ns = nanosec - o.nanosec - if ns > nanosec then s += 1 - return new Timespec( s, ns ) + var s = sec - other.sec + var ns = nanosec - other.nanosec + if ns < 0 then + s -= 1 + ns += 1000000000 + end + return new Timespec(s, ns) end # Number of whole seconds of elapsed time. @@ -117,15 +120,33 @@ extern class Timespec `{struct timespec*`} end # Keeps track of real time +# +# ~~~ +# var clock = new Clock +# +# # sleeping at least 1s +# 1.0.sleep +# assert clock.total >= 1.0 +# assert clock.lapse >= 1.0 +# +# # sleeping at least 5ms +# 0.005.sleep +# assert clock.total >= 1.005 +# assert clock.lapse >= 0.005 +# ~~~ class Clock - # Time at instanciation + super FinalizableOnce + + # TODO use less mallocs + + # Time at creation protected var time_at_beginning = new Timespec.monotonic_now # Time at last time a lapse method was called protected var time_at_last_lapse = new Timespec.monotonic_now # Smallest time frame reported by clock - fun resolution : Timespec `{ + fun resolution: Timespec `{ struct timespec* tv = malloc( sizeof(struct timespec) ); #ifdef __MACH__ clock_serv_t cclock; @@ -142,18 +163,43 @@ class Clock return tv; `} - # Return timelapse since instanciation of this instance - fun total : Timespec + # Seconds since the creation of this instance + fun total: Float do - return new Timespec.monotonic_now - time_at_beginning + var now = new Timespec.monotonic_now + var diff = now - time_at_beginning + var r = diff.to_f + diff.free + now.free + return r end - # Return timelapse since last call to lapse - fun lapse : Timespec + # Seconds since the last call to `lapse` + fun lapse: Float do var nt = new Timespec.monotonic_now var dt = nt - time_at_last_lapse + var r = dt.to_f + dt.free + time_at_last_lapse.free time_at_last_lapse = nt - return dt + return r + end + + # Seconds since the last call to `lapse`, without resetting the lapse counter + fun peek_lapse: Float + do + var nt = new Timespec.monotonic_now + var dt = nt - time_at_last_lapse + var r = dt.to_f + nt.free + dt.free + return r + end + + redef fun finalize_once + do + time_at_beginning.free + time_at_last_lapse.free end end