authorgravatar for leroycepearson@geemili.xyzLeRoyce Pearson <leroycepearson@geemili.xyz> 2020-04-30 23:16:54-06:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-24 21:40:08-04:00
log2dfe798217c6348f4fc18b5fa9d86d9db06146b1
tree92f5a591488016837547dea606258b91a16bf324
parent7586ce0023e309fa5c86b67fe13d476f04a290f0

Use `once` to init _timestart in thread safe way


1 files changed, 9 insertions(+), 9 deletions(-)

lib/std/time.zig+9-9
......@@ -67,9 +67,10 @@ const DarwinTimeStart = struct {
6767 initclock: u64,
6868};
6969
70var _timestart: ?DarwinTimeStart = null;
70var _timestart: DarwinTimeStart = undefined;
71var _init_timestart_once = std.once(_init_timestart);
7172
72pub fn _init_time_for_darwin() DarwinTimeStart {
73pub fn _init_timestart() void {
7374 var micro: os.darwin.timeval = undefined;
7475 var timestart: DarwinTimeStart = undefined;
7576
......@@ -84,7 +85,6 @@ pub fn _init_time_for_darwin() DarwinTimeStart {
8485 timestart.inittime.tv_nsec = micro.tv_usec * 1000;
8586
8687 _timestart = timestart;
87 return timestart;
8888}
8989
9090/// Get the posix timestamp, UTC, in nanoseconds
......@@ -115,14 +115,14 @@ pub fn nanoTimestamp() u64 {
115115 }
116116 if (comptime std.Target.current.isDarwin()) {
117117 // https://stackoverflow.com/a/21352348
118 const timestart = if (_timestart) |timestart| timestart else _init_time_for_darwin();
119118
120 const clock: u64 = os.darwin.mach_absolute_time() - timestart.initclock;
121 const nano = clock * @divFloor(@as(u64, timestart.timebase.number), @as(u64, timestart.timebase.denom));
119 _init_timestart_once.call();
122120
123 var future = timestart.inittime;
124 const tv_sec_nsec = @intCast(u64, timestart.inittime.tv_sec) * ns_per_s;
125 const tv_nsec = @intCast(u64, timestart.inittime.tv_nsec);
121 const clock: u64 = os.darwin.mach_absolute_time() - _timestart.initclock;
122 const nano = clock * @divFloor(@as(u64, _timestart.timebase.number), @as(u64, _timestart.timebase.denom));
123
124 const tv_sec_nsec = @intCast(u64, _timestart.inittime.tv_sec) * ns_per_s;
125 const tv_nsec = @intCast(u64, _timestart.inittime.tv_nsec);
126126
127127 return tv_sec_nsec + tv_nsec + nano;
128128 }