authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2019-06-16 22:11:09+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-18 16:31:06-04:00
log381c6a38b145665a22440f7aa816f0ddd9b70ee5
treee95a50c1a22b46ae55a7e15e4bd344e8421f4965
parentc7bcf1a447de08a18f5113c97744233a54bb9af7

Correct the isEmpty function

Integrate isEmpty into the tests for std.atomic.Queue Fix wrong test Oops Simpler checking

1 files changed, 20 insertions(+), 1 deletions(-)

std/atomic/queue.zig+20-1
...@@ -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 }
105105
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 };
173173
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 }
204211
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 {
250257
251test "std.atomic.Queue single-threaded" {258test "std.atomic.Queue single-threaded" {
252 var queue = Queue(i32).init();259 var queue = Queue(i32).init();
260 expect(queue.isEmpty());
253261
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());
260269
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());
267277
268 expect(queue.get().?.data == 0);278 expect(queue.get().?.data == 0);
279 expect(!queue.isEmpty());
269280
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());
276288
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());
283296
284 expect(queue.get().?.data == 1);297 expect(queue.get().?.data == 1);
298 expect(!queue.isEmpty());
285299
286 expect(queue.get().?.data == 2);300 expect(queue.get().?.data == 2);
301 expect(!queue.isEmpty());
287302
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());
294310
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());
297314
298 expect(queue.get().?.data == 4);315 expect(queue.get().?.data == 4);
316 expect(queue.isEmpty());
299317
300 expect(queue.get() == null);318 expect(queue.get() == null);
319 expect(queue.isEmpty());
301}320}
302321
303test "std.atomic.Queue dump" {322test "std.atomic.Queue dump" {