mirror of
https://github.com/ziglang/zig.git
synced 2025-12-16 11:13:08 +00:00
std.cache_hash: temporary workaround for mtime precision on linux
See #6082
This commit is contained in:
parent
56c81c713f
commit
c0517bf1f6
@ -451,10 +451,17 @@ fn isProblematicTimestamp(fs_clock: i128) bool {
|
|||||||
// to detect precision of seconds, because looking at the zero bits in base
|
// to detect precision of seconds, because looking at the zero bits in base
|
||||||
// 2 would not detect precision of the seconds value.
|
// 2 would not detect precision of the seconds value.
|
||||||
const fs_sec = @intCast(i64, @divFloor(fs_clock, std.time.ns_per_s));
|
const fs_sec = @intCast(i64, @divFloor(fs_clock, std.time.ns_per_s));
|
||||||
const fs_nsec = @intCast(i64, @mod(fs_clock, std.time.ns_per_s));
|
var fs_nsec = @intCast(i64, @mod(fs_clock, std.time.ns_per_s));
|
||||||
var wall_sec = @intCast(i64, @divFloor(wall_clock, std.time.ns_per_s));
|
var wall_sec = @intCast(i64, @divFloor(wall_clock, std.time.ns_per_s));
|
||||||
var wall_nsec = @intCast(i64, @mod(wall_clock, std.time.ns_per_s));
|
var wall_nsec = @intCast(i64, @mod(wall_clock, std.time.ns_per_s));
|
||||||
|
|
||||||
|
if (std.Target.current.os.tag == .linux) {
|
||||||
|
// TODO As a temporary measure while we figure out how to solve
|
||||||
|
// https://github.com/ziglang/zig/issues/6082, we cut the granularity of nanoseconds
|
||||||
|
// by a large amount.
|
||||||
|
fs_nsec &= @as(i64, -1) << 23;
|
||||||
|
}
|
||||||
|
|
||||||
// First make all the least significant zero bits in the fs_clock, also zero bits in the wall clock.
|
// First make all the least significant zero bits in the fs_clock, also zero bits in the wall clock.
|
||||||
if (fs_nsec == 0) {
|
if (fs_nsec == 0) {
|
||||||
wall_nsec = 0;
|
wall_nsec = 0;
|
||||||
@ -466,16 +473,7 @@ fn isProblematicTimestamp(fs_clock: i128) bool {
|
|||||||
} else {
|
} else {
|
||||||
wall_nsec &= @as(i64, -1) << @intCast(u6, @ctz(i64, fs_nsec));
|
wall_nsec &= @as(i64, -1) << @intCast(u6, @ctz(i64, fs_nsec));
|
||||||
}
|
}
|
||||||
if (wall_nsec == fs_nsec and wall_sec == fs_sec)
|
return wall_nsec == fs_nsec and wall_sec == fs_sec;
|
||||||
return true;
|
|
||||||
|
|
||||||
// I have also observed precision problems at a millisecond granularity.
|
|
||||||
const fs_msec = @intCast(i64, @divFloor(fs_clock, std.time.ns_per_ms * 2));
|
|
||||||
const wall_msec = @intCast(i64, @divFloor(wall_clock, std.time.ns_per_ms * 2));
|
|
||||||
if (fs_msec == wall_msec)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test "cache file and then recall it" {
|
test "cache file and then recall it" {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user