| ... | @@ -7,8 +7,8 @@ const Allocator = std.mem.Allocator; | ... | @@ -7,8 +7,8 @@ const Allocator = std.mem.Allocator; |
| 7 | const assert = std.debug.assert; | 7 | const assert = std.debug.assert; |
| 8 | const Cache = std.Build.Cache; | 8 | const Cache = std.Build.Cache; |
| 9 | | 9 | |
| 10 | fn usage() noreturn { | 10 | fn usage(io: Io) noreturn { |
| 11 | std.Io.File.stdout().writeAll( | 11 | Io.File.stdout().writeStreamingAll(io, |
| 12 | \\Usage: zig std [options] | 12 | \\Usage: zig std [options] |
| 13 | \\ | 13 | \\ |
| 14 | \\Options: | 14 | \\Options: |
| ... | @@ -29,7 +29,7 @@ pub fn main() !void { | ... | @@ -29,7 +29,7 @@ pub fn main() !void { |
| 29 | var general_purpose_allocator: std.heap.GeneralPurposeAllocator(.{}) = .init; | 29 | var general_purpose_allocator: std.heap.GeneralPurposeAllocator(.{}) = .init; |
| 30 | const gpa = general_purpose_allocator.allocator(); | 30 | const gpa = general_purpose_allocator.allocator(); |
| 31 | | 31 | |
| 32 | var threaded: std.Io.Threaded = .init(gpa); | 32 | var threaded: Io.Threaded = .init(gpa, .{}); |
| 33 | defer threaded.deinit(); | 33 | defer threaded.deinit(); |
| 34 | const io = threaded.io(); | 34 | const io = threaded.io(); |
| 35 | | 35 | |
| ... | @@ -47,11 +47,11 @@ pub fn main() !void { | ... | @@ -47,11 +47,11 @@ pub fn main() !void { |
| 47 | var force_open_browser: ?bool = null; | 47 | var force_open_browser: ?bool = null; |
| 48 | while (argv.next()) |arg| { | 48 | while (argv.next()) |arg| { |
| 49 | if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) { | 49 | if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) { |
| 50 | usage(); | 50 | usage(io); |
| 51 | } else if (mem.eql(u8, arg, "-p") or mem.eql(u8, arg, "--port")) { | 51 | } else if (mem.eql(u8, arg, "-p") or mem.eql(u8, arg, "--port")) { |
| 52 | listen_port = std.fmt.parseInt(u16, argv.next() orelse usage(), 10) catch |err| { | 52 | listen_port = std.fmt.parseInt(u16, argv.next() orelse usage(io), 10) catch |err| { |
| 53 | std.log.err("expected port number: {}", .{err}); | 53 | std.log.err("expected port number: {}", .{err}); |
| 54 | usage(); | 54 | usage(io); |
| 55 | }; | 55 | }; |
| 56 | } else if (mem.eql(u8, arg, "--open-browser")) { | 56 | } else if (mem.eql(u8, arg, "--open-browser")) { |
| 57 | force_open_browser = true; | 57 | force_open_browser = true; |
| ... | @@ -59,18 +59,18 @@ pub fn main() !void { | ... | @@ -59,18 +59,18 @@ pub fn main() !void { |
| 59 | force_open_browser = false; | 59 | force_open_browser = false; |
| 60 | } else { | 60 | } else { |
| 61 | std.log.err("unrecognized argument: {s}", .{arg}); | 61 | std.log.err("unrecognized argument: {s}", .{arg}); |
| 62 | usage(); | 62 | usage(io); |
| 63 | } | 63 | } |
| 64 | } | 64 | } |
| 65 | const should_open_browser = force_open_browser orelse (listen_port == 0); | 65 | const should_open_browser = force_open_browser orelse (listen_port == 0); |
| 66 | | 66 | |
| 67 | const address = std.net.Address.parseIp("127.0.0.1", listen_port) catch unreachable; | 67 | const address = Io.net.IpAddress.parse("127.0.0.1", listen_port) catch unreachable; |
| 68 | var http_server = try address.listen(.{ | 68 | var http_server = try address.listen(io, .{ |
| 69 | .reuse_address = true, | 69 | .reuse_address = true, |
| 70 | }); | 70 | }); |
| 71 | const port = http_server.listen_address.in.getPort(); | 71 | const port = http_server.socket.address.getPort(); |
| 72 | const url_with_newline = try std.fmt.allocPrint(arena, "http://127.0.0.1:{d}/\n", .{port}); | 72 | const url_with_newline = try std.fmt.allocPrint(arena, "http://127.0.0.1:{d}/\n", .{port}); |
| 73 | std.Io.File.stdout().writeAll(url_with_newline) catch {}; | 73 | Io.File.stdout().writeStreamingAll(io, url_with_newline) catch {}; |
| 74 | if (should_open_browser) { | 74 | if (should_open_browser) { |
| 75 | openBrowserTab(gpa, io, url_with_newline[0 .. url_with_newline.len - 1 :'\n']) catch |err| { | 75 | openBrowserTab(gpa, io, url_with_newline[0 .. url_with_newline.len - 1 :'\n']) catch |err| { |
| 76 | std.log.err("unable to open browser: {t}", .{err}); | 76 | std.log.err("unable to open browser: {t}", .{err}); |
| ... | @@ -86,44 +86,43 @@ pub fn main() !void { | ... | @@ -86,44 +86,43 @@ pub fn main() !void { |
| 86 | .zig_lib_directory = zig_lib_directory, | 86 | .zig_lib_directory = zig_lib_directory, |
| 87 | }; | 87 | }; |
| 88 | | 88 | |
| | 89 | var group: Io.Group = .init; |
| | 90 | defer group.cancel(io); |
| | 91 | |
| 89 | while (true) { | 92 | while (true) { |
| 90 | const connection = try http_server.accept(); | 93 | const stream = try http_server.accept(io); |
| 91 | _ = std.Thread.spawn(.{}, accept, .{ &context, connection }) catch |err| { | 94 | group.async(io, accept, .{ &context, stream }); |
| 92 | std.log.err("unable to accept connection: {t}", .{err}); | | |
| 93 | connection.stream.close(io); | | |
| 94 | continue; | | |
| 95 | }; | | |
| 96 | } | 95 | } |
| 97 | } | 96 | } |
| 98 | | 97 | |
| 99 | fn accept(context: *Context, connection: std.net.Server.Connection) void { | 98 | fn accept(context: *Context, stream: Io.net.Stream) void { |
| 100 | const io = context.io; | 99 | const io = context.io; |
| 101 | defer connection.stream.close(io); | 100 | defer stream.close(io); |
| 102 | | 101 | |
| 103 | var recv_buffer: [4000]u8 = undefined; | 102 | var recv_buffer: [4000]u8 = undefined; |
| 104 | var send_buffer: [4000]u8 = undefined; | 103 | var send_buffer: [4000]u8 = undefined; |
| 105 | var conn_reader = connection.stream.reader(&recv_buffer); | 104 | var conn_reader = stream.reader(io, &recv_buffer); |
| 106 | var conn_writer = connection.stream.writer(&send_buffer); | 105 | var conn_writer = stream.writer(io, &send_buffer); |
| 107 | var server = std.http.Server.init(conn_reader.interface(), &conn_writer.interface); | 106 | var server = std.http.Server.init(&conn_reader.interface, &conn_writer.interface); |
| 108 | while (server.reader.state == .ready) { | 107 | while (server.reader.state == .ready) { |
| 109 | var request = server.receiveHead() catch |err| switch (err) { | 108 | var request = server.receiveHead() catch |err| switch (err) { |
| 110 | error.HttpConnectionClosing => return, | 109 | error.HttpConnectionClosing => return, |
| 111 | else => { | 110 | else => { |
| 112 | std.log.err("closing http connection: {s}", .{@errorName(err)}); | 111 | std.log.err("closing http connection: {t}", .{err}); |
| 113 | return; | 112 | return; |
| 114 | }, | 113 | }, |
| 115 | }; | 114 | }; |
| 116 | serveRequest(&request, context) catch |err| switch (err) { | 115 | serveRequest(&request, context) catch |err| switch (err) { |
| 117 | error.WriteFailed => { | 116 | error.WriteFailed => { |
| 118 | if (conn_writer.err) |e| { | 117 | if (conn_writer.err) |e| { |
| 119 | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(e) }); | 118 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, e }); |
| 120 | } else { | 119 | } else { |
| 121 | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); | 120 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, err }); |
| 122 | } | 121 | } |
| 123 | return; | 122 | return; |
| 124 | }, | 123 | }, |
| 125 | else => { | 124 | else => { |
| 126 | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); | 125 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, err }); |
| 127 | return; | 126 | return; |
| 128 | }, | 127 | }, |
| 129 | }; | 128 | }; |
| ... | @@ -216,7 +215,7 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { | ... | @@ -216,7 +215,7 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { |
| 216 | var archiver: std.tar.Writer = .{ .underlying_writer = &response.writer }; | 215 | var archiver: std.tar.Writer = .{ .underlying_writer = &response.writer }; |
| 217 | archiver.prefix = "std"; | 216 | archiver.prefix = "std"; |
| 218 | | 217 | |
| 219 | while (try walker.next()) |entry| { | 218 | while (try walker.next(io)) |entry| { |
| 220 | switch (entry.kind) { | 219 | switch (entry.kind) { |
| 221 | .file => { | 220 | .file => { |
| 222 | if (!std.mem.endsWith(u8, entry.basename, ".zig")) | 221 | if (!std.mem.endsWith(u8, entry.basename, ".zig")) |
| ... | @@ -229,12 +228,13 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { | ... | @@ -229,12 +228,13 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { |
| 229 | var file = try entry.dir.openFile(io, entry.basename, .{}); | 228 | var file = try entry.dir.openFile(io, entry.basename, .{}); |
| 230 | defer file.close(io); | 229 | defer file.close(io); |
| 231 | const stat = try file.stat(io); | 230 | const stat = try file.stat(io); |
| 232 | var file_reader: std.Io.File.Reader = .{ | 231 | var file_reader: Io.File.Reader = .{ |
| | 232 | .io = io, |
| 233 | .file = file, | 233 | .file = file, |
| 234 | .interface = std.Io.File.Reader.initInterface(&.{}), | 234 | .interface = Io.File.Reader.initInterface(&.{}), |
| 235 | .size = stat.size, | 235 | .size = stat.size, |
| 236 | }; | 236 | }; |
| 237 | try archiver.writeFile(io, entry.path, &file_reader, stat.mtime); | 237 | try archiver.writeFileTimestamp(entry.path, &file_reader, stat.mtime); |
| 238 | } | 238 | } |
| 239 | | 239 | |
| 240 | { | 240 | { |
| ... | @@ -267,7 +267,7 @@ fn serveWasm( | ... | @@ -267,7 +267,7 @@ fn serveWasm( |
| 267 | const wasm_base_path = try buildWasmBinary(arena, context, optimize_mode); | 267 | const wasm_base_path = try buildWasmBinary(arena, context, optimize_mode); |
| 268 | const bin_name = try std.zig.binNameAlloc(arena, .{ | 268 | const bin_name = try std.zig.binNameAlloc(arena, .{ |
| 269 | .root_name = autodoc_root_name, | 269 | .root_name = autodoc_root_name, |
| 270 | .target = &(std.zig.system.resolveTargetQuery(std.Build.parseTargetQuery(.{ | 270 | .target = &(std.zig.system.resolveTargetQuery(io, std.Build.parseTargetQuery(.{ |
| 271 | .arch_os_abi = autodoc_arch_os_abi, | 271 | .arch_os_abi = autodoc_arch_os_abi, |
| 272 | .cpu_features = autodoc_cpu_features, | 272 | .cpu_features = autodoc_cpu_features, |
| 273 | }) catch unreachable) catch unreachable), | 273 | }) catch unreachable) catch unreachable), |
| ... | @@ -330,7 +330,7 @@ fn buildWasmBinary( | ... | @@ -330,7 +330,7 @@ fn buildWasmBinary( |
| 330 | child.stderr_behavior = .Pipe; | 330 | child.stderr_behavior = .Pipe; |
| 331 | try child.spawn(io); | 331 | try child.spawn(io); |
| 332 | | 332 | |
| 333 | var poller = std.Io.poll(gpa, enum { stdout, stderr }, .{ | 333 | var poller = Io.poll(gpa, enum { stdout, stderr }, .{ |
| 334 | .stdout = child.stdout.?, | 334 | .stdout = child.stdout.?, |
| 335 | .stderr = child.stderr.?, | 335 | .stderr = child.stderr.?, |
| 336 | }); | 336 | }); |
| ... | @@ -361,7 +361,7 @@ fn buildWasmBinary( | ... | @@ -361,7 +361,7 @@ fn buildWasmBinary( |
| 361 | result_error_bundle = try std.zig.Server.allocErrorBundle(arena, body); | 361 | result_error_bundle = try std.zig.Server.allocErrorBundle(arena, body); |
| 362 | }, | 362 | }, |
| 363 | .emit_digest => { | 363 | .emit_digest => { |
| 364 | var r: std.Io.Reader = .fixed(body); | 364 | var r: Io.Reader = .fixed(body); |
| 365 | const emit_digest = r.takeStruct(std.zig.Server.Message.EmitDigest, .little) catch unreachable; | 365 | const emit_digest = r.takeStruct(std.zig.Server.Message.EmitDigest, .little) catch unreachable; |
| 366 | if (!emit_digest.flags.cache_hit) { | 366 | if (!emit_digest.flags.cache_hit) { |
| 367 | std.log.info("source changes detected; rebuilt wasm component", .{}); | 367 | std.log.info("source changes detected; rebuilt wasm component", .{}); |
| ... | @@ -387,7 +387,7 @@ fn buildWasmBinary( | ... | @@ -387,7 +387,7 @@ fn buildWasmBinary( |
| 387 | child.stdin.?.close(io); | 387 | child.stdin.?.close(io); |
| 388 | child.stdin = null; | 388 | child.stdin = null; |
| 389 | | 389 | |
| 390 | switch (try child.wait()) { | 390 | switch (try child.wait(io)) { |
| 391 | .Exited => |code| { | 391 | .Exited => |code| { |
| 392 | if (code != 0) { | 392 | if (code != 0) { |
| 393 | std.log.err( | 393 | std.log.err( |
| ... | @@ -407,7 +407,7 @@ fn buildWasmBinary( | ... | @@ -407,7 +407,7 @@ fn buildWasmBinary( |
| 407 | } | 407 | } |
| 408 | | 408 | |
| 409 | if (result_error_bundle.errorMessageCount() > 0) { | 409 | if (result_error_bundle.errorMessageCount() > 0) { |
| 410 | result_error_bundle.renderToStderr(io, .{}, true); | 410 | try result_error_bundle.renderToStderr(io, .{}, .auto); |
| 411 | std.log.err("the following command failed with {d} compilation errors:\n{s}", .{ | 411 | std.log.err("the following command failed with {d} compilation errors:\n{s}", .{ |
| 412 | result_error_bundle.errorMessageCount(), | 412 | result_error_bundle.errorMessageCount(), |
| 413 | try std.Build.Step.allocPrintCmd(arena, null, argv.items), | 413 | try std.Build.Step.allocPrintCmd(arena, null, argv.items), |
| ... | @@ -423,7 +423,7 @@ fn buildWasmBinary( | ... | @@ -423,7 +423,7 @@ fn buildWasmBinary( |
| 423 | }; | 423 | }; |
| 424 | } | 424 | } |
| 425 | | 425 | |
| 426 | fn sendMessage(io: Io, file: std.Io.File, tag: std.zig.Client.Message.Tag) !void { | 426 | fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void { |
| 427 | const header: std.zig.Client.Message.Header = .{ | 427 | const header: std.zig.Client.Message.Header = .{ |
| 428 | .tag = tag, | 428 | .tag = tag, |
| 429 | .bytes_len = 0, | 429 | .bytes_len = 0, |