| ... | @@ -67,9 +67,10 @@ const DarwinTimeStart = struct { | ... | @@ -67,9 +67,10 @@ const DarwinTimeStart = struct { |
| 67 | initclock: u64, | 67 | initclock: u64, |
| 68 | }; | 68 | }; |
| 69 | | 69 | |
| 70 | var _timestart: ?DarwinTimeStart = null; | 70 | var _timestart: DarwinTimeStart = undefined; |
| | 71 | var _init_timestart_once = std.once(_init_timestart); |
| 71 | | 72 | |
| 72 | pub fn _init_time_for_darwin() DarwinTimeStart { | 73 | pub fn _init_timestart() void { |
| 73 | var micro: os.darwin.timeval = undefined; | 74 | var micro: os.darwin.timeval = undefined; |
| 74 | var timestart: DarwinTimeStart = undefined; | 75 | var timestart: DarwinTimeStart = undefined; |
| 75 | | 76 | |
| ... | @@ -84,7 +85,6 @@ pub fn _init_time_for_darwin() DarwinTimeStart { | ... | @@ -84,7 +85,6 @@ pub fn _init_time_for_darwin() DarwinTimeStart { |
| 84 | timestart.inittime.tv_nsec = micro.tv_usec * 1000; | 85 | timestart.inittime.tv_nsec = micro.tv_usec * 1000; |
| 85 | | 86 | |
| 86 | _timestart = timestart; | 87 | _timestart = timestart; |
| 87 | return timestart; | | |
| 88 | } | 88 | } |
| 89 | | 89 | |
| 90 | /// Get the posix timestamp, UTC, in nanoseconds | 90 | /// Get the posix timestamp, UTC, in nanoseconds |
| ... | @@ -115,14 +115,14 @@ pub fn nanoTimestamp() u64 { | ... | @@ -115,14 +115,14 @@ pub fn nanoTimestamp() u64 { |
| 115 | } | 115 | } |
| 116 | if (comptime std.Target.current.isDarwin()) { | 116 | if (comptime std.Target.current.isDarwin()) { |
| 117 | // https://stackoverflow.com/a/21352348 | 117 | // https://stackoverflow.com/a/21352348 |
| 118 | const timestart = if (_timestart) |timestart| timestart else _init_time_for_darwin(); | | |
| 119 | | 118 | |
| 120 | const clock: u64 = os.darwin.mach_absolute_time() - timestart.initclock; | 119 | _init_timestart_once.call(); |
| 121 | const nano = clock * @divFloor(@as(u64, timestart.timebase.number), @as(u64, timestart.timebase.denom)); | | |
| 122 | | 120 | |
| 123 | var future = timestart.inittime; | 121 | const clock: u64 = os.darwin.mach_absolute_time() - _timestart.initclock; |
| 124 | const tv_sec_nsec = @intCast(u64, timestart.inittime.tv_sec) * ns_per_s; | 122 | const nano = clock * @divFloor(@as(u64, _timestart.timebase.number), @as(u64, _timestart.timebase.denom)); |
| 125 | const tv_nsec = @intCast(u64, timestart.inittime.tv_nsec); | 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); |
| 126 | | 126 | |
| 127 | return tv_sec_nsec + tv_nsec + nano; | 127 | return tv_sec_nsec + tv_nsec + nano; |
| 128 | } | 128 | } |