41 lines
820 B
V
41 lines
820 B
V
module time
|
|
|
|
#include <mach/mach_time.h>
|
|
|
|
const (
|
|
// start_time is needed on Darwin and Windows because of potential overflows
|
|
start_time = C.mach_absolute_time()
|
|
time_base = init_time_base()
|
|
)
|
|
|
|
[typedef]
|
|
struct C.mach_timebase_info_data_t {
|
|
numer u64
|
|
denom u64
|
|
}
|
|
|
|
fn C.mach_absolute_time() u64
|
|
fn C.mach_timebase_info(&C.mach_timebase_info_data_t)
|
|
|
|
struct InternalTimeBase {
|
|
numer u64
|
|
denom u64
|
|
}
|
|
|
|
fn init_time_base() InternalTimeBase {
|
|
mut tb := C.mach_timebase_info_data_t{}
|
|
C.mach_timebase_info(&tb)
|
|
return InternalTimeBase{numer:tb.numer, denom:tb.denom}
|
|
}
|
|
|
|
fn sys_mono_now_darwin() u64 {
|
|
tm := C.mach_absolute_time()
|
|
return mul_div(tm - start_time, time_base.numer, time_base.denom)
|
|
}
|
|
|
|
fn mul_div(val, numer, denom u64) u64 {
|
|
q := val / denom
|
|
r := val % denom
|
|
return q * numer + r * numer / denom
|
|
}
|