diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2026-01-02 23:11:03 +0000 |
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2026-01-02 23:13:54 +0000 |
| commit | 0f851a140d35b6747ec8b5ece92b6eb6afe94a50 (patch) | |
| tree | 9f7838f37d463d755b856b3d213672c4a77c413f /src/server/client.zig | |
| parent | 67908cf19875dd42f17d4ae6768fe7cf54a05e6c (diff) | |
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.
Diffstat (limited to 'src/server/client.zig')
| -rw-r--r-- | src/server/client.zig | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/server/client.zig b/src/server/client.zig index 004b0f9..2ce3c38 100644 --- a/src/server/client.zig +++ b/src/server/client.zig @@ -6,18 +6,20 @@ const Client = @This(); connect: ?Message.Connect, // Messages for this client to receive. -recv_queue: ?*std.Io.Queue(Message) = null, +recv_queue: *std.Io.Queue(Message), from_client: *std.Io.Reader, to_client: *std.Io.Writer, pub fn init( connect: ?Message.Connect, + recv_queue: *std.Io.Queue(Message), in: *std.Io.Reader, out: *std.Io.Writer, ) Client { return .{ .connect = connect, + .recv_queue = recv_queue, .from_client = in, .to_client = out, }; @@ -30,17 +32,17 @@ pub fn deinit(self: *Client, alloc: std.mem.Allocator) void { self.* = undefined; } -pub fn start(self: *Client, io: std.Io, alloc: std.mem.Allocator, queue: *std.Io.Queue(Message)) !void { - self.recv_queue = queue; +pub fn start(self: *Client, io: std.Io, alloc: std.mem.Allocator) !void { var msgs: [8]Message = undefined; while (true) { - const len = try queue.get(io, &msgs, 1); + const len = try self.recv_queue.get(io, &msgs, 1); std.debug.assert(len <= msgs.len); for (0..len) |i| { const msg = msgs[i]; defer switch (msg) { .msg => |m| m.deinit(alloc), + .hmsg => |h| h.deinit(alloc), else => {}, }; errdefer for (msgs[i + 1 .. len]) |mg| switch (mg) { @@ -98,9 +100,7 @@ pub fn start(self: *Client, io: std.Io, alloc: std.mem.Allocator, queue: *std.Io } pub fn send(self: *Client, io: std.Io, msg: Message) !void { - if (self.recv_queue) |queue| { - try queue.putOne(io, msg); - } else @panic("Must start() the client before sending it messages."); + try self.recv_queue.putOne(io, msg); } pub fn next(self: *Client, allocator: std.mem.Allocator) !Message { |
