| ... | ... | @@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type { |
| 103 | 103 | } |
| 104 | 104 | |
| 105 | 105 | pub fn dump(self: *Self) void { |
| 106 | var stderr_file = std.io.getStdErr() catch return; |
| 107 | const stderr = &std.io.FileOutStream.init(stderr_file).stream; |
| 108 | |
| 109 | self.dumpToStream(stderr) catch return; |
| 110 | } |
| 111 | |
| 112 | pub fn dumpToStream(self: *Self, stream: var) !void { |
| 106 | 113 | const held = self.mutex.acquire(); |
| 107 | 114 | defer held.release(); |
| 108 | 115 | |
| 109 | | std.debug.warn("head: "); |
| 110 | | dumpRecursive(self.head, 0); |
| 111 | | std.debug.warn("tail: "); |
| 112 | | dumpRecursive(self.tail, 0); |
| 116 | try stream.print("head: "); |
| 117 | try dumpRecursive(stream, self.head, 0); |
| 118 | try stream.print("tail: "); |
| 119 | try dumpRecursive(stream, self.tail, 0); |
| 113 | 120 | } |
| 114 | 121 | |
| 115 | | fn dumpRecursive(optional_node: ?*Node, indent: usize) void { |
| 116 | | var stderr_file = std.io.getStdErr() catch return; |
| 117 | | const stderr = &std.io.FileOutStream.init(stderr_file).stream; |
| 118 | | stderr.writeByteNTimes(' ', indent) catch return; |
| 122 | fn dumpRecursive(stream: var, optional_node: ?*Node, indent: usize) error!void { |
| 123 | try stream.writeByteNTimes(' ', indent); |
| 119 | 124 | if (optional_node) |node| { |
| 120 | | std.debug.warn("0x{x}={}\n", @ptrToInt(node), node.data); |
| 121 | | dumpRecursive(node.next, indent + 1); |
| 125 | try stream.print("0x{x}={}\n", @ptrToInt(node), node.data); |
| 126 | try dumpRecursive(stream, node.next, indent + 1); |
| 122 | 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 | 279 | |
| 275 | 280 | assert(queue.get() == null); |
| 276 | 281 | } |
| 282 | |
| 283 | test "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 | } |