| ... | @@ -154,7 +154,7 @@ fn atomicExchangeFn(comptime T: type) fn (*T, T, i32) callconv(.C) T { | ... | @@ -154,7 +154,7 @@ fn atomicExchangeFn(comptime T: type) fn (*T, T, i32) callconv(.C) T { |
| 154 | if (@sizeOf(T) > largest_atomic_size) { | 154 | if (@sizeOf(T) > largest_atomic_size) { |
| 155 | var sl = spinlocks.get(@ptrToInt(ptr)); | 155 | var sl = spinlocks.get(@ptrToInt(ptr)); |
| 156 | defer sl.release(); | 156 | defer sl.release(); |
| 157 | var value = ptr.*; | 157 | const value = ptr.*; |
| 158 | ptr.* = val; | 158 | ptr.* = val; |
| 159 | return value; | 159 | return value; |
| 160 | } else { | 160 | } else { |
| ... | @@ -177,11 +177,12 @@ fn atomicCompareExchangeFn(comptime T: type) fn (*T, *T, T, i32, i32) callconv(. | ... | @@ -177,11 +177,12 @@ fn atomicCompareExchangeFn(comptime T: type) fn (*T, *T, T, i32, i32) callconv(. |
| 177 | if (@sizeOf(T) > largest_atomic_size) { | 177 | if (@sizeOf(T) > largest_atomic_size) { |
| 178 | var sl = spinlocks.get(@ptrToInt(ptr)); | 178 | var sl = spinlocks.get(@ptrToInt(ptr)); |
| 179 | defer sl.release(); | 179 | defer sl.release(); |
| 180 | if (ptr.* == expected.*) { | 180 | const value = ptr.*; |
| | 181 | if (value == expected.*) { |
| 181 | ptr.* = desired; | 182 | ptr.* = desired; |
| 182 | return 1; | 183 | return 1; |
| 183 | } | 184 | } |
| 184 | expected.* = ptr.*; | 185 | expected.* = value; |
| 185 | return 0; | 186 | return 0; |
| 186 | } else { | 187 | } else { |
| 187 | if (@cmpxchgStrong(T, ptr, expected.*, desired, .SeqCst, .SeqCst)) |old_value| { | 188 | if (@cmpxchgStrong(T, ptr, expected.*, desired, .SeqCst, .SeqCst)) |old_value| { |
| ... | @@ -208,14 +209,14 @@ fn fetchFn(comptime T: type, comptime op: builtin.AtomicRmwOp) fn (*T, T, i32) c | ... | @@ -208,14 +209,14 @@ fn fetchFn(comptime T: type, comptime op: builtin.AtomicRmwOp) fn (*T, T, i32) c |
| 208 | var sl = spinlocks.get(@ptrToInt(ptr)); | 209 | var sl = spinlocks.get(@ptrToInt(ptr)); |
| 209 | defer sl.release(); | 210 | defer sl.release(); |
| 210 | | 211 | |
| 211 | var value = ptr.*; | 212 | const value = ptr.*; |
| 212 | ptr.* = switch (op) { | 213 | ptr.* = switch (op) { |
| 213 | .Add => ptr.* +% val, | 214 | .Add => value +% val, |
| 214 | .Sub => ptr.* -% val, | 215 | .Sub => value -% val, |
| 215 | .And => ptr.* & val, | 216 | .And => value & val, |
| 216 | .Nand => ~(ptr.* & val), | 217 | .Nand => ~(value & val), |
| 217 | .Or => ptr.* | val, | 218 | .Or => value | val, |
| 218 | .Xor => ptr.* ^ val, | 219 | .Xor => value ^ val, |
| 219 | else => @compileError("unsupported atomic op"), | 220 | else => @compileError("unsupported atomic op"), |
| 220 | }; | 221 | }; |
| 221 | | 222 | |