1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/time/time_darwin.c.v

99 lines
2.4 KiB
V
Raw Normal View History

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()
2020-12-06 17:19:39 +03:00
time_base = init_time_base()
)
[typedef]
struct C.mach_timebase_info_data_t {
2020-04-26 20:36:38 +03:00
numer u32
denom u32
}
fn C.mach_absolute_time() u64
2020-12-06 17:19:39 +03:00
fn C.mach_timebase_info(&C.mach_timebase_info_data_t)
2020-12-06 17:19:39 +03:00
2020-04-26 20:36:38 +03:00
fn C.clock_gettime_nsec_np(int) u64
struct InternalTimeBase {
2020-04-26 20:36:38 +03:00
numer u32 = 1
denom u32 = 1
}
pub struct C.timeval {
tv_sec u64
tv_usec u64
}
fn init_time_base() C.mach_timebase_info_data_t {
2020-04-26 20:36:38 +03:00
tb := C.mach_timebase_info_data_t{}
C.mach_timebase_info(&tb)
2020-12-06 17:19:39 +03:00
return C.mach_timebase_info_data_t{
numer: tb.numer
denom: tb.denom
}
}
fn sys_mono_now_darwin() u64 {
tm := C.mach_absolute_time()
2021-01-25 12:26:20 +03:00
if time.time_base.denom == 0 {
unsafe {
C.mach_timebase_info(&time.time_base)
}
2020-04-26 20:36:38 +03:00
}
2021-01-25 12:26:20 +03:00
return (tm - time.start_time) * time.time_base.numer / time.time_base.denom
}
// Note: vpc_now_darwin is used by `v -profile` .
// It should NOT call *any other v function*, just C functions and casts.
[inline]
fn vpc_now_darwin() u64 {
tm := C.mach_absolute_time()
2021-01-25 12:26:20 +03:00
if time.time_base.denom == 0 {
unsafe {
C.mach_timebase_info(&time.time_base)
}
}
2021-01-25 12:26:20 +03:00
return (tm - time.start_time) * time.time_base.numer / time.time_base.denom
}
// darwin_now returns a better precision current time for Darwin based operating system
// this should be implemented with native system calls eventually
// but for now a bit tweaky. It uses the deprecated gettimeofday clock to get
2020-06-10 12:14:55 +03:00
// the microseconds seconds part and converts to local time
fn darwin_now() Time {
// get the high precision time as UTC clock
tv := C.timeval{}
C.gettimeofday(&tv, 0)
2020-06-10 12:14:55 +03:00
loc_tm := C.tm{}
2021-04-05 15:31:29 +03:00
asec := voidptr(&tv.tv_sec)
C.localtime_r(asec, &loc_tm)
2020-06-10 12:14:55 +03:00
return convert_ctime(loc_tm, int(tv.tv_usec))
}
// darwin_utc returns a better precision current time for Darwin based operating system
// this should be implemented with native system calls eventually
// but for now a bit tweaky. It uses the deprecated gettimeofday clock to get
// the microseconds seconds part and normal local time to get correct local time
fn darwin_utc() Time {
// get the high precision time as UTC clock
tv := C.timeval{}
C.gettimeofday(&tv, 0)
return unix2(i64(tv.tv_sec), int(tv.tv_usec))
}
// dummy to compile with all compilers
pub fn solaris_now() Time {
return Time{}
}
// dummy to compile with all compilers
pub fn solaris_utc() Time {
return Time{}
}