authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-10-31 10:44:25-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-10-31 10:44:25-04:00
log5b1b072d8dbfd6031eb7812bd47562fa15270855
tree9d01674be154c1b8fb218f6d787640022377f2a0
parent4e12f909df6ab2f71848bbc70433a718f7549627
parent0f3e7387bf5389440e8e394d512265e4688f323d
signaturelock-open Commit is signed but in an unrecognized format.

Merge branch 'winksaville-add-test-for-atomic-Queue-dump'


2 files changed, 84 insertions(+), 17 deletions(-)

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