authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-10-07 16:46:19+11:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-11-18 15:36:40+02:00
logc492ef97fdc7c7c71c4656b0553214c61604be49
treeb67b2c78d7512705977033080099666233e0fe38
parentda84ef2a9cd55bd3fdf8d2005a69ed9be86db689

std: expose all atomic operations from std.atomic.Int


1 files changed, 22 insertions(+), 6 deletions(-)

lib/std/atomic/int.zig+22-6
......@@ -3,6 +3,9 @@
33// This file is part of [zig](https://ziglang.org/), which is MIT licensed.
44// The MIT license requires this copyright notice to be included in all copies
55// and substantial portions of the software.
6
7const builtin = @import("std").builtin;
8
69/// Thread-safe, lock-free integer
710pub fn Int(comptime T: type) type {
811 return struct {
......@@ -14,30 +17,43 @@ pub fn Int(comptime T: type) type {
1417 return Self{ .unprotected_value = init_val };
1518 }
1619
20 /// Read, Modify, Write
21 pub fn rmw(self: *Self, comptime op: builtin.AtomicRmwOp, operand: T, comptime ordering: builtin.AtomicOrder) T {
22 return @atomicRmw(T, &self.unprotected_value, operand, ordering);
23 }
24
25 pub fn load(self: *Self, comptime ordering: builtin.AtomicOrder) T {
26 return @atomicLoad(T, &self.unprotected_value, ordering);
27 }
28
29 pub fn store(self: *Self, value: T, comptime ordering: builtin.AtomicOrder) void {
30 @atomicStore(T, &self.unprotected_value, value, ordering);
31 }
32
1733 /// Returns previous value
1834 pub fn incr(self: *Self) T {
19 return @atomicRmw(T, &self.unprotected_value, .Add, 1, .SeqCst);
35 return self.rmw(.Add, 1, .SeqCst);
2036 }
2137
2238 /// Returns previous value
2339 pub fn decr(self: *Self) T {
24 return @atomicRmw(T, &self.unprotected_value, .Sub, 1, .SeqCst);
40 return self.rmw(.Sub, 1, .SeqCst);
2541 }
2642
2743 pub fn get(self: *Self) T {
28 return @atomicLoad(T, &self.unprotected_value, .SeqCst);
44 return self.load(.SeqCst);
2945 }
3046
3147 pub fn set(self: *Self, new_value: T) void {
32 _ = self.xchg(new_value);
48 self.store(new_value, .SeqCst);
3349 }
3450
3551 pub fn xchg(self: *Self, new_value: T) T {
36 return @atomicRmw(T, &self.unprotected_value, .Xchg, new_value, .SeqCst);
52 return self.rmw(.Xchg, new_value, .SeqCst);
3753 }
3854
3955 pub fn fetchAdd(self: *Self, op: T) T {
40 return @atomicRmw(T, &self.unprotected_value, .Add, op, .SeqCst);
56 return self.rmw(.Add, op, .SeqCst);
4157 }
4258 };
4359}