| ... | @@ -100,7 +100,7 @@ pub fn Queue(comptime T: type) type { | ... | @@ -100,7 +100,7 @@ pub fn Queue(comptime T: type) type { |
| 100 | pub fn isEmpty(self: *Self) bool { | 100 | pub fn isEmpty(self: *Self) bool { |
| 101 | const held = self.mutex.acquire(); | 101 | const held = self.mutex.acquire(); |
| 102 | defer held.release(); | 102 | defer held.release(); |
| 103 | return self.head != null; | 103 | return self.head == null; |
| 104 | } | 104 | } |
| 105 | | 105 | |
| 106 | pub fn dump(self: *Self) void { | 106 | pub fn dump(self: *Self) void { |
| ... | @@ -172,12 +172,14 @@ test "std.atomic.Queue" { | ... | @@ -172,12 +172,14 @@ test "std.atomic.Queue" { |
| 172 | }; | 172 | }; |
| 173 | | 173 | |
| 174 | if (builtin.single_threaded) { | 174 | if (builtin.single_threaded) { |
| | 175 | expect(context.queue.isEmpty()); |
| 175 | { | 176 | { |
| 176 | var i: usize = 0; | 177 | var i: usize = 0; |
| 177 | while (i < put_thread_count) : (i += 1) { | 178 | while (i < put_thread_count) : (i += 1) { |
| 178 | expect(startPuts(&context) == 0); | 179 | expect(startPuts(&context) == 0); |
| 179 | } | 180 | } |
| 180 | } | 181 | } |
| | 182 | expect(!context.queue.isEmpty()); |
| 181 | context.puts_done = 1; | 183 | context.puts_done = 1; |
| 182 | { | 184 | { |
| 183 | var i: usize = 0; | 185 | var i: usize = 0; |
| ... | @@ -185,7 +187,10 @@ test "std.atomic.Queue" { | ... | @@ -185,7 +187,10 @@ test "std.atomic.Queue" { |
| 185 | expect(startGets(&context) == 0); | 187 | expect(startGets(&context) == 0); |
| 186 | } | 188 | } |
| 187 | } | 189 | } |
| | 190 | expect(context.queue.isEmpty()); |
| 188 | } else { | 191 | } else { |
| | 192 | expect(context.queue.isEmpty()); |
| | 193 | |
| 189 | var putters: [put_thread_count]*std.Thread = undefined; | 194 | var putters: [put_thread_count]*std.Thread = undefined; |
| 190 | for (putters) |*t| { | 195 | for (putters) |*t| { |
| 191 | t.* = try std.Thread.spawn(&context, startPuts); | 196 | t.* = try std.Thread.spawn(&context, startPuts); |
| ... | @@ -200,6 +205,8 @@ test "std.atomic.Queue" { | ... | @@ -200,6 +205,8 @@ test "std.atomic.Queue" { |
| 200 | _ = @atomicRmw(u8, &context.puts_done, builtin.AtomicRmwOp.Xchg, 1, AtomicOrder.SeqCst); | 205 | _ = @atomicRmw(u8, &context.puts_done, builtin.AtomicRmwOp.Xchg, 1, AtomicOrder.SeqCst); |
| 201 | for (getters) |t| | 206 | for (getters) |t| |
| 202 | t.wait(); | 207 | t.wait(); |
| | 208 | |
| | 209 | expect(context.queue.isEmpty()); |
| 203 | } | 210 | } |
| 204 | | 211 | |
| 205 | if (context.put_sum != context.get_sum) { | 212 | if (context.put_sum != context.get_sum) { |
| ... | @@ -250,6 +257,7 @@ fn startGets(ctx: *Context) u8 { | ... | @@ -250,6 +257,7 @@ fn startGets(ctx: *Context) u8 { |
| 250 | | 257 | |
| 251 | test "std.atomic.Queue single-threaded" { | 258 | test "std.atomic.Queue single-threaded" { |
| 252 | var queue = Queue(i32).init(); | 259 | var queue = Queue(i32).init(); |
| | 260 | expect(queue.isEmpty()); |
| 253 | | 261 | |
| 254 | var node_0 = Queue(i32).Node{ | 262 | var node_0 = Queue(i32).Node{ |
| 255 | .data = 0, | 263 | .data = 0, |
| ... | @@ -257,6 +265,7 @@ test "std.atomic.Queue single-threaded" { | ... | @@ -257,6 +265,7 @@ test "std.atomic.Queue single-threaded" { |
| 257 | .prev = undefined, | 265 | .prev = undefined, |
| 258 | }; | 266 | }; |
| 259 | queue.put(&node_0); | 267 | queue.put(&node_0); |
| | 268 | expect(!queue.isEmpty()); |
| 260 | | 269 | |
| 261 | var node_1 = Queue(i32).Node{ | 270 | var node_1 = Queue(i32).Node{ |
| 262 | .data = 1, | 271 | .data = 1, |
| ... | @@ -264,8 +273,10 @@ test "std.atomic.Queue single-threaded" { | ... | @@ -264,8 +273,10 @@ test "std.atomic.Queue single-threaded" { |
| 264 | .prev = undefined, | 273 | .prev = undefined, |
| 265 | }; | 274 | }; |
| 266 | queue.put(&node_1); | 275 | queue.put(&node_1); |
| | 276 | expect(!queue.isEmpty()); |
| 267 | | 277 | |
| 268 | expect(queue.get().?.data == 0); | 278 | expect(queue.get().?.data == 0); |
| | 279 | expect(!queue.isEmpty()); |
| 269 | | 280 | |
| 270 | var node_2 = Queue(i32).Node{ | 281 | var node_2 = Queue(i32).Node{ |
| 271 | .data = 2, | 282 | .data = 2, |
| ... | @@ -273,6 +284,7 @@ test "std.atomic.Queue single-threaded" { | ... | @@ -273,6 +284,7 @@ test "std.atomic.Queue single-threaded" { |
| 273 | .prev = undefined, | 284 | .prev = undefined, |
| 274 | }; | 285 | }; |
| 275 | queue.put(&node_2); | 286 | queue.put(&node_2); |
| | 287 | expect(!queue.isEmpty()); |
| 276 | | 288 | |
| 277 | var node_3 = Queue(i32).Node{ | 289 | var node_3 = Queue(i32).Node{ |
| 278 | .data = 3, | 290 | .data = 3, |
| ... | @@ -280,10 +292,13 @@ test "std.atomic.Queue single-threaded" { | ... | @@ -280,10 +292,13 @@ test "std.atomic.Queue single-threaded" { |
| 280 | .prev = undefined, | 292 | .prev = undefined, |
| 281 | }; | 293 | }; |
| 282 | queue.put(&node_3); | 294 | queue.put(&node_3); |
| | 295 | expect(!queue.isEmpty()); |
| 283 | | 296 | |
| 284 | expect(queue.get().?.data == 1); | 297 | expect(queue.get().?.data == 1); |
| | 298 | expect(!queue.isEmpty()); |
| 285 | | 299 | |
| 286 | expect(queue.get().?.data == 2); | 300 | expect(queue.get().?.data == 2); |
| | 301 | expect(!queue.isEmpty()); |
| 287 | | 302 | |
| 288 | var node_4 = Queue(i32).Node{ | 303 | var node_4 = Queue(i32).Node{ |
| 289 | .data = 4, | 304 | .data = 4, |
| ... | @@ -291,13 +306,17 @@ test "std.atomic.Queue single-threaded" { | ... | @@ -291,13 +306,17 @@ test "std.atomic.Queue single-threaded" { |
| 291 | .prev = undefined, | 306 | .prev = undefined, |
| 292 | }; | 307 | }; |
| 293 | queue.put(&node_4); | 308 | queue.put(&node_4); |
| | 309 | expect(!queue.isEmpty()); |
| 294 | | 310 | |
| 295 | expect(queue.get().?.data == 3); | 311 | expect(queue.get().?.data == 3); |
| 296 | node_3.next = null; | 312 | node_3.next = null; |
| | 313 | expect(!queue.isEmpty()); |
| 297 | | 314 | |
| 298 | expect(queue.get().?.data == 4); | 315 | expect(queue.get().?.data == 4); |
| | 316 | expect(queue.isEmpty()); |
| 299 | | 317 | |
| 300 | expect(queue.get() == null); | 318 | expect(queue.get() == null); |
| | 319 | expect(queue.isEmpty()); |
| 301 | } | 320 | } |
| 302 | | 321 | |
| 303 | test "std.atomic.Queue dump" { | 322 | test "std.atomic.Queue dump" { |