2020-01-23 21:04:46 +01:00
|
|
|
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
2020-01-01 12:01:03 +01:00
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
module time
|
|
|
|
|
2020-06-07 15:19:09 +02:00
|
|
|
#include <time.h>
|
|
|
|
|
2020-01-01 12:01:03 +01:00
|
|
|
struct C.tm {
|
2020-05-18 17:05:48 +02:00
|
|
|
tm_sec int
|
2020-05-18 21:38:06 +02:00
|
|
|
tm_min int
|
|
|
|
tm_hour int
|
|
|
|
tm_mday int
|
|
|
|
tm_mon int
|
|
|
|
tm_year int
|
2020-01-01 12:01:03 +01:00
|
|
|
}
|
|
|
|
|
2020-02-05 06:13:11 +01:00
|
|
|
fn C.timegm(&tm) time_t
|
2020-01-01 12:01:03 +01:00
|
|
|
|
2020-03-03 15:06:21 +01:00
|
|
|
fn make_unix_time(t C.tm) int {
|
2020-02-07 22:10:48 +01:00
|
|
|
return int(C.timegm(&t))
|
2020-02-04 12:17:04 +01:00
|
|
|
}
|
2020-04-24 07:33:25 +02:00
|
|
|
|
|
|
|
type time_t voidptr
|
|
|
|
|
|
|
|
// in most systems, these are __quad_t, which is an i64
|
|
|
|
struct C.timespec {
|
|
|
|
tv_sec i64
|
|
|
|
tv_nsec i64
|
|
|
|
}
|
|
|
|
|
|
|
|
// the first arg is defined in include/bits/types.h as `__S32_TYPE`, which is `int`
|
|
|
|
fn C.clock_gettime(int, &C.timespec)
|
|
|
|
|
2020-05-18 22:54:08 +02:00
|
|
|
pub fn sys_mono_now() u64 {
|
2020-04-24 07:33:25 +02:00
|
|
|
$if macos {
|
|
|
|
return sys_mono_now_darwin()
|
|
|
|
} $else {
|
|
|
|
ts := C.timespec{}
|
|
|
|
C.clock_gettime(C.CLOCK_MONOTONIC, &ts)
|
|
|
|
return u64(ts.tv_sec) * 1_000_000_000 + u64(ts.tv_nsec)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-26 19:36:38 +02:00
|
|
|
// NB: vpc_now is used by `v -profile` .
|
|
|
|
// It should NOT call *any other v function*, just C functions and casts.
|
|
|
|
[inline]
|
|
|
|
fn vpc_now() u64 {
|
2020-05-05 16:19:25 +02:00
|
|
|
ts := C.timespec{}
|
|
|
|
C.clock_gettime(C.CLOCK_MONOTONIC, &ts)
|
|
|
|
return u64(ts.tv_sec) * 1_000_000_000 + u64(ts.tv_nsec)
|
2020-04-26 19:36:38 +02:00
|
|
|
}
|
2020-06-07 15:19:09 +02:00
|
|
|
|
|
|
|
// dummy to compile with all compilers
|
|
|
|
pub fn win_now() Time {
|
|
|
|
return Time{}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// dummy to compile with all compilers
|
|
|
|
pub struct C.timeval {
|
|
|
|
tv_sec u64
|
|
|
|
tv_usec u64
|
|
|
|
}
|