[Soft] fixing 32bits support because I have free will
Mirror Gitea refs to GitHub / mirror (push) Successful in 11s
Test / build_and_test (push) Successful in 5m47s
Build / build (push) Successful in 7m13s

This commit is contained in:
2026-07-30 02:21:36 +02:00
parent 1042b4a422
commit b7629ef4d7
9 changed files with 92 additions and 27 deletions
+44 -1
View File
@@ -14,8 +14,51 @@ queries: []Query,
vtable: *const VTable,
/// 32 bits platforms only supportss atomics up to 32 bits,
/// so serialize 64-bit query access with a 32-bit lock.
const LockedU64 = struct {
mutex: std.atomic.Value(u32) = std.atomic.Value(u32).init(0),
raw: u64,
fn init(value: u64) LockedU64 {
return .{ .raw = value };
}
fn lock(self: *LockedU64) void {
while (self.mutex.cmpxchgWeak(0, 1, .acquire, .monotonic) != null) {
std.atomic.spinLoopHint();
}
}
fn unlock(self: *LockedU64) void {
self.mutex.store(0, .release);
}
fn load(self: *LockedU64, comptime _: std.builtin.AtomicOrder) u64 {
self.lock();
defer self.unlock();
return self.raw;
}
fn store(self: *LockedU64, value: u64, comptime _: std.builtin.AtomicOrder) void {
self.lock();
defer self.unlock();
self.raw = value;
}
fn fetchAdd(self: *LockedU64, value: u64, comptime _: std.builtin.AtomicOrder) u64 {
self.lock();
defer self.unlock();
const previous = self.raw;
self.raw +%= value;
return previous;
}
};
const QueryValue = if (@bitSizeOf(usize) >= 64) std.atomic.Value(u64) else LockedU64;
const Query = struct {
value: std.atomic.Value(u64) = std.atomic.Value(u64).init(0),
value: QueryValue = QueryValue.init(0),
available: bool = false,
active: bool = false,
};