commit 2dfe798217c6348f4fc18b5fa9d86d9db06146b1 (tree)
parent 7586ce0023e309fa5c86b67fe13d476f04a290f0
Author: LeRoyce Pearson <leroycepearson@geemili.xyz>
Date: Thu, 30 Apr 2020 23:16:54 -0600
Use `once` to init _timestart in thread safe way
Diffstat:
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib/std/time.zig b/lib/std/time.zig
@@ -67,9 +67,10 @@ const DarwinTimeStart = struct {
initclock: u64,
};
-var _timestart: ?DarwinTimeStart = null;
+var _timestart: DarwinTimeStart = undefined;
+var _init_timestart_once = std.once(_init_timestart);
-pub fn _init_time_for_darwin() DarwinTimeStart {
+pub fn _init_timestart() void {
var micro: os.darwin.timeval = undefined;
var timestart: DarwinTimeStart = undefined;
@@ -84,7 +85,6 @@ pub fn _init_time_for_darwin() DarwinTimeStart {
timestart.inittime.tv_nsec = micro.tv_usec * 1000;
_timestart = timestart;
- return timestart;
}
/// Get the posix timestamp, UTC, in nanoseconds
@@ -115,14 +115,14 @@ pub fn nanoTimestamp() u64 {
}
if (comptime std.Target.current.isDarwin()) {
// https://stackoverflow.com/a/21352348
- const timestart = if (_timestart) |timestart| timestart else _init_time_for_darwin();
- const clock: u64 = os.darwin.mach_absolute_time() - timestart.initclock;
- const nano = clock * @divFloor(@as(u64, timestart.timebase.number), @as(u64, timestart.timebase.denom));
+ _init_timestart_once.call();
- var future = timestart.inittime;
- const tv_sec_nsec = @intCast(u64, timestart.inittime.tv_sec) * ns_per_s;
- const tv_nsec = @intCast(u64, timestart.inittime.tv_nsec);
+ const clock: u64 = os.darwin.mach_absolute_time() - _timestart.initclock;
+ const nano = clock * @divFloor(@as(u64, _timestart.timebase.number), @as(u64, _timestart.timebase.denom));
+
+ const tv_sec_nsec = @intCast(u64, _timestart.inittime.tv_sec) * ns_per_s;
+ const tv_nsec = @intCast(u64, _timestart.inittime.tv_nsec);
return tv_sec_nsec + tv_nsec + nano;
}