From b44620d0650ebe9299ca0331855ffcd446140753 Mon Sep 17 00:00:00 2001 From: spaceface777 Date: Fri, 25 Sep 2020 17:02:02 +0200 Subject: [PATCH] time: use linux high-precision timers on Android as well (#6476) --- vlib/time/time.v | 4 ++-- vlib/time/time_linux.c.v | 27 --------------------------- vlib/time/time_nix.c.v | 28 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/vlib/time/time.v b/vlib/time/time.v index 84d09e427a..7b19726e3f 100644 --- a/vlib/time/time.v +++ b/vlib/time/time.v @@ -100,7 +100,7 @@ pub fn now() Time { $if solaris { return solaris_now() } - $if linux { + $if linux || android { return linux_now() } // defaults to most common feature, the microsecond precision is not available @@ -121,7 +121,7 @@ pub fn utc() Time { $if solaris { return solaris_utc() } - $if linux { + $if linux || android { return linux_utc() } // defaults to most common feature, the microsecond precision is not available diff --git a/vlib/time/time_linux.c.v b/vlib/time/time_linux.c.v index 7d17497b5c..8c3556ac34 100644 --- a/vlib/time/time_linux.c.v +++ b/vlib/time/time_linux.c.v @@ -1,32 +1,5 @@ module time -// linux_now returns the local time with high precision for most os:es -// this should be implemented properly with support for leap seconds. -// It uses the realtime clock to get and converts it to local time -[inline] -fn linux_now() Time { - - // get the high precision time as UTC realtime clock - // and use the nanoseconds part - mut ts := C.timespec{} - C.clock_gettime(C.CLOCK_REALTIME, &ts) - - loc_tm := C.tm{} - C.localtime_r(&ts.tv_sec, &loc_tm) - - return convert_ctime(loc_tm, int(ts.tv_nsec/1000)) -} - -[inline] -fn linux_utc() Time { - // get the high precision time as UTC realtime clock - // and use the nanoseconds part - mut ts := C.timespec{} - C.clock_gettime(C.CLOCK_REALTIME, &ts) - - return unix2(int(ts.tv_sec), int(ts.tv_nsec/1000)) -} - fn sys_mono_now_darwin() u64 { return 0 } diff --git a/vlib/time/time_nix.c.v b/vlib/time/time_nix.c.v index 9de352f6b1..3ae63475b6 100644 --- a/vlib/time/time_nix.c.v +++ b/vlib/time/time_nix.c.v @@ -62,7 +62,35 @@ fn vpc_now() u64 { return u64(ts.tv_sec) * 1_000_000_000 + u64(ts.tv_nsec) } +// The linux_* functions are placed here, since they're used on Android as well +// TODO: should `$if linux {}` be parsed on Android as well? (Android runs under the Linux kernel) +// linux_now returns the local time with high precision for most os:es +// this should be implemented properly with support for leap seconds. +// It uses the realtime clock to get and converts it to local time +[inline] +fn linux_now() Time { + + // get the high precision time as UTC realtime clock + // and use the nanoseconds part + mut ts := C.timespec{} + C.clock_gettime(C.CLOCK_REALTIME, &ts) + + loc_tm := C.tm{} + C.localtime_r(&ts.tv_sec, &loc_tm) + + return convert_ctime(loc_tm, int(ts.tv_nsec/1000)) +} + +[inline] +fn linux_utc() Time { + // get the high precision time as UTC realtime clock + // and use the nanoseconds part + mut ts := C.timespec{} + C.clock_gettime(C.CLOCK_REALTIME, &ts) + + return unix2(int(ts.tv_sec), int(ts.tv_nsec/1000)) +} // dummy to compile with all compilers pub fn win_now() Time {