diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2025-12-31 03:11:42 +0000 |
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2026-01-01 05:22:02 +0000 |
| commit | a78187603871238c154d2fec105eecbb15cee225 (patch) | |
| tree | 03dbd800f403eb51d9173166bbeb9dbf5bbe3341 /src/server/client.zig | |
| parent | 0f138e5984cbebe64bc398513597d62f4e879b05 (diff) | |
Simplified a ton of things and cleaned up ownership
Diffstat (limited to 'src/server/client.zig')
| -rw-r--r-- | src/server/client.zig | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/server/client.zig b/src/server/client.zig index 9acc3b1..69e655b 100644 --- a/src/server/client.zig +++ b/src/server/client.zig @@ -7,6 +7,8 @@ pub const ClientState = struct { /// Messages that this client should receive. recv_queue: std.Io.Queue(Message) = undefined, recv_queue_buffer: [1024]Message = undefined, + // Used to take ownership of values as they are put in the queue. + recv_alloc: std.mem.Allocator, from_client: *std.Io.Reader, to_client: *std.Io.Writer, @@ -15,11 +17,13 @@ pub const ClientState = struct { pub fn init( connect: Message.AllocatedConnect, + alloc: std.mem.Allocator, in: *std.Io.Reader, out: *std.Io.Writer, ) !ClientState { var res: ClientState = .{ .connect = connect, + .recv_alloc = alloc, .from_client = in, .to_client = out, }; @@ -49,6 +53,7 @@ pub const ClientState = struct { writeInfo(self.to_client, info) catch break; }, .msg => |m| { + defer m.deinit(self.recv_alloc); writeMsg(self.to_client, m) catch break; }, else => { @@ -68,8 +73,16 @@ pub const ClientState = struct { } /// Return true if the value was put in the clients buffer to process, else false. - pub fn send(self: *ClientState, io: std.Io, msg: Message) (std.Io.Cancelable || std.Io.QueueClosedError)!void { - try self.recv_queue.putOne(io, msg); + pub fn send(self: *ClientState, io: std.Io, msg: Message) !void { + // Client needs to own msg that is put in its queue + switch (msg) { + .msg => |m| { + try self.recv_queue.putOne(io, .{ .msg = try m.dupe(self.recv_alloc) }); + }, + else => { + try self.recv_queue.putOne(io, msg); + }, + } } pub fn next(self: *ClientState, allocator: std.mem.Allocator) !Message { |
