From 0f851a140d35b6747ec8b5ece92b6eb6afe94a50 Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Fri, 2 Jan 2026 23:11:03 +0000 Subject: Fix possible race condition since the queue was being set in an async task and we were then calling send asserting that the queue was set, we could have triggered a panic. didn't run into it but seemed likely to cause issues in the future. also compute the buffer size for operators at comptime. --- src/server/main.zig | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'src/server/main.zig') diff --git a/src/server/main.zig b/src/server/main.zig index 4c1093f..92ac671 100644 --- a/src/server/main.zig +++ b/src/server/main.zig @@ -160,13 +160,7 @@ fn handleConnection( var reader = stream.reader(io, &r_buffer); const in = &reader.interface; - // Create client - var client: Client = .init(null, in, out); - defer client.deinit(server_allocator); - - try server.addClient(server_allocator, id, &client); - defer server.removeClient(io, server_allocator, id); - + // Set up buffer queue var qbuf: [8]Message = undefined; var queue: std.Io.Queue(Message) = .init(&qbuf); defer { @@ -174,15 +168,23 @@ fn handleConnection( while (queue.getOne(io)) |msg| { switch (msg) { .msg => |m| m.deinit(server_allocator), + .hmsg => |h| h.deinit(server_allocator), else => {}, } } else |_| {} } + // Create client + var client: Client = .init(null, &queue, in, out); + defer client.deinit(server_allocator); + + try server.addClient(server_allocator, id, &client); + defer server.removeClient(io, server_allocator, id); + // Do initial handshake with client try queue.putOne(io, .{ .info = server.info }); - var client_task = try io.concurrent(Client.start, .{ &client, io, server_allocator, &queue }); + var client_task = try io.concurrent(Client.start, .{ &client, io, server_allocator }); defer client_task.cancel(io) catch {}; // Messages are owned by the server after they are received from the client -- cgit