╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ serve_common.zig ─────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
153 154 fn run(c: @This()) void { 155 handleConn(c.context, c.stream); 156 } 157 }; 158 159 const Listener = struct { 160 io: std.Io, 161 net_server: *std.Io.net.Server, 162 tasks: *std.Io.Group, 163 err: *std.Io.Writer, 164 name: []const u8, 165 context: Context, 166 167 fn run(self: @This()) void { 168 while (true) { 169 const stream = self.net_server.accept(self.io) catch |accept_err| { 170 if (accept_err == error.Canceled) return; 171 logError(self.io, self.err, "{s} accept failed: {s}\n", .{ self.name, @errorName(accept_err) }); 172 continue; 173 }; 174 self.tasks.async(self.io, Conn.run, .{Conn{ .context = self.context, .stream = stream }}); 175 } 176 } 177 }; 178 179 tasks.async(io, Listener.run, .{Listener{ 180 .io = io, 181 .net_server = net_server, 182 .tasks = tasks, 183 .err = err, 184 .name = name, 185 .context = context, 186 }}); 187 } 188