authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-10-31 10:29:49-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-10-31 10:29:49-04:00
logb04c6cee60814655fc5356879aa4b0d002e94791
tree744bfcdfb6b2a4bcb0bb5c2b245ab6bcfb35146f
parent4e12f909df6ab2f71848bbc70433a718f7549627
parentd9ed3d186dc09cab05b841b924664fc886077275
signature Commit is signed but in an unrecognized format.

Merge branch 'add-test-for-atomic-Queue-dump' of https://github.com/winksaville/zig into winksaville-add-test-for-atomic-Queue-dump


2 files changed, 77 insertions(+), 12 deletions(-)

std/atomic/queue.zig+76-11
...@@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type {...@@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type {
103 }103 }
104104
105 pub fn dump(self: *Self) void {105 pub fn dump(self: *Self) void {
106 var stderr_file = std.io.getStdErr() catch return;
107 const stderr = &stderr_file.outStream().stream;
108
109 self.dumpToStream(stderr) catch return;
110 }
111
112 pub fn dumpToStream(self: *Self, stream: var) @typeOf(stream).Error!void {
106 const held = self.mutex.acquire();113 const held = self.mutex.acquire();
107 defer held.release();114 defer held.release();
108115
109 std.debug.warn("head: ");116 try stream.print("head: ");
110 dumpRecursive(self.head, 0);117 try dumpRecursive(stream, self.head, 0);
111 std.debug.warn("tail: ");118 try stream.print("tail: ");
112 dumpRecursive(self.tail, 0);119 try dumpRecursive(stream, self.tail, 0);
113 }120 }
114121
115 fn dumpRecursive(optional_node: ?*Node, indent: usize) void {122 fn dumpRecursive(stream: var, optional_node: ?*Node, indent: usize) error!void {
116 var stderr_file = std.io.getStdErr() catch return;123 try stream.writeByteNTimes(' ', indent);
117 const stderr = &stderr_file.outStream().stream;
118 stderr.writeByteNTimes(' ', indent) catch return;
119 if (optional_node) |node| {124 if (optional_node) |node| {
120 std.debug.warn("0x{x}={}\n", @ptrToInt(node), node.data);125 try stream.print("0x{x}={}\n", @ptrToInt(node), node.data);
121 dumpRecursive(node.next, indent + 1);126 try dumpRecursive(stream, node.next, indent + 1);
122 } else {127 } else {
123 std.debug.warn("(null)\n");128 try stream.print("(null)\n");
124 }129 }
125 }130 }
126 };131 };
...@@ -274,3 +279,63 @@ test "std.atomic.Queue single-threaded" {...@@ -274,3 +279,63 @@ test "std.atomic.Queue single-threaded" {
274279
275 assert(queue.get() == null);280 assert(queue.get() == null);
276}281}
282
283test "std.atomic.Queue dump" {
284 const mem = std.mem;
285 const SliceOutStream = std.io.SliceOutStream;
286 var buffer: [1024]u8 = undefined;
287 var expected_buffer: [1024]u8 = undefined;
288 var sos = SliceOutStream.init(buffer[0..]);
289
290 var queue = Queue(i32).init();
291
292 // Test empty stream
293 sos.reset();
294 try queue.dumpToStream(&sos.stream);
295 assert(mem.eql(u8, buffer[0..sos.pos],
296 \\head: (null)
297 \\tail: (null)
298 \\
299 ));
300
301 // Test a stream with one element
302 var node_0 = Queue(i32).Node {
303 .data = 1,
304 .next = undefined,
305 .prev = undefined,
306 };
307 queue.put(&node_0);
308
309 sos.reset();
310 try queue.dumpToStream(&sos.stream);
311
312 var expected = try std.fmt.bufPrint(expected_buffer[0..],
313 \\head: 0x{x}=1
314 \\ (null)
315 \\tail: 0x{x}=1
316 \\ (null)
317 \\
318 , @ptrToInt(queue.head), @ptrToInt(queue.tail));
319 assert(mem.eql(u8, buffer[0..sos.pos], expected));
320
321 // Test a stream with two elements
322 var node_1 = Queue(i32).Node {
323 .data = 2,
324 .next = undefined,
325 .prev = undefined,
326 };
327 queue.put(&node_1);
328
329 sos.reset();
330 try queue.dumpToStream(&sos.stream);
331
332 expected = try std.fmt.bufPrint(expected_buffer[0..],
333 \\head: 0x{x}=1
334 \\ 0x{x}=2
335 \\ (null)
336 \\tail: 0x{x}=2
337 \\ (null)
338 \\
339 , @ptrToInt(queue.head), @ptrToInt(queue.head.?.next), @ptrToInt(queue.tail));
340 assert(mem.eql(u8, buffer[0..sos.pos], expected));
341}
std/io.zig+1-1
...@@ -442,7 +442,7 @@ pub const SliceOutStream = struct.{...@@ -442,7 +442,7 @@ pub const SliceOutStream = struct.{
442442
443 pub stream: Stream,443 pub stream: Stream,
444444
445 pos: usize,445 pub pos: usize,
446 slice: []u8,446 slice: []u8,
447447
448 pub fn init(slice: []u8) SliceOutStream {448 pub fn init(slice: []u8) SliceOutStream {