| ... | @@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type { | ... | @@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type { |
| 103 | } | 103 | } |
| 104 | | 104 | |
| 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(); |
| 108 | | 115 | |
| 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 | } |
| 114 | | 121 | |
| 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" { |
| 274 | | 279 | |
| 275 | assert(queue.get() == null); | 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 | } |