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
realtime :: Clock :: defaultinit
realtime :: Clock :: peek_lapse
Seconds since the last call tolapse
, without resetting the lapse counter
realtime $ Clock :: finalize_once
Real finalization method ofFinalizableOnce
, will be called only once
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
core :: FinalizableOnce :: defaultinit
core :: Finalizable :: defaultinit
core :: Object :: defaultinit
realtime :: Clock :: defaultinit
core :: Finalizable :: finalize
Liberate any resources held byself
before the memory holding self
is freed
core :: FinalizableOnce :: finalize_once
Real finalization method ofFinalizableOnce
, will be called only once
core :: FinalizableOnce :: finalized
Hasself
been finalized? (either by the GC or an explicit call to finalize
)
core :: FinalizableOnce :: finalized=
Hasself
been finalized? (either by the GC or an explicit call to finalize
)
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
core :: Object :: output_class_name
Display class name on stdout (debug only).realtime :: Clock :: peek_lapse
Seconds since the last call tolapse
, without resetting the lapse counter
# 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
super FinalizableOnce
# TODO use less mallocs
# Time at creation
private var time_at_beginning = new Timespec.monotonic_now
# Time at last time a lapse method was called
private var time_at_last_lapse = new Timespec.monotonic_now
private var temp = new Timespec.monotonic_now
# Smallest time frame reported by clock
private fun resolution: Timespec `{
struct timespec* tv = malloc( sizeof(struct timespec) );
#if (defined(__MACH__) || defined(TARGET_OS_IPHONE)) && !defined(CLOCK_REALTIME)
clock_serv_t cclock;
int nsecs;
mach_msg_type_number_t count;
host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
clock_get_attributes(cclock, CLOCK_GET_TIME_RES, (clock_attr_t)&nsecs, &count);
mach_port_deallocate(mach_task_self(), cclock);
tv->tv_sec = 0;
tv->tv_nsec = nsecs;
#else
clock_getres( CLOCK_MONOTONIC, tv );
#endif
return tv;
`}
# Seconds since the creation of this instance
fun total: Float
do
var now = temp
now.update
now.minus(now, time_at_beginning)
return now.to_f
end
# Seconds since the last call to `lapse`
fun lapse: Float
do
var time_at_last_lapse = time_at_last_lapse
var now = temp
now.update
time_at_last_lapse.minus(now, time_at_last_lapse)
var r = time_at_last_lapse.to_f
self.temp = time_at_last_lapse
self.time_at_last_lapse = now
return r
end
# Seconds since the last call to `lapse`, without resetting the lapse counter
fun peek_lapse: Float
do
var now = temp
now.update
now.minus(now, time_at_last_lapse)
return now.to_f
end
redef fun finalize_once
do
time_at_beginning.free
time_at_last_lapse.free
temp.free
end
end
lib/realtime/realtime.nit:149,1--234,3