From 6fcb13741ad7b2ae2f1909b2773c92bd3bde0926 Mon Sep 17 00:00:00 2001 From: Squibid Date: Wed, 10 Dec 2025 13:43:12 -0500 Subject: [PATCH] rework how remote lua clients are stored in the server --- src/RemoteLua.zig | 29 ++++++++++++++++++----------- src/server.zig | 6 ++---- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/RemoteLua.zig b/src/RemoteLua.zig index c8582aa..3f1cd63 100644 --- a/src/RemoteLua.zig +++ b/src/RemoteLua.zig @@ -11,13 +11,16 @@ const mez = wayland.server.zmez; const gpa = std.heap.c_allocator; const server = &@import("main.zig").server; -id: usize, +node: std.DoublyLinkedList.Node, remote_lua_v1: *mez.RemoteLuaV1, L: *zlua.Lua, pub fn sendNewLogEntry(str: [*:0]const u8) void { - for (server.remote_lua_clients.items) |c| { - c.remote_lua_v1.sendNewLogEntry(str); + var node = server.remote_lua_clients.first; + while (node) |n| { + const data: ?*RemoteLua = @fieldParentPtr("node", n); + if (data) |d| d.remote_lua_v1.sendNewLogEntry(str); + node = n.next; } } @@ -28,7 +31,7 @@ pub fn create(client: *wl.Client, version: u32, id: u32) !void { errdefer gpa.destroy(node); node.* = .{ .remote_lua_v1 = remote_lua_v1, - .id = server.remote_lua_clients.items.len, + .node = .{}, .L = try zlua.Lua.init(gpa), }; errdefer node.L.deinit(); @@ -36,7 +39,7 @@ pub fn create(client: *wl.Client, version: u32, id: u32) !void { Lua.openLibs(node.L); // TODO: replace stdout and stderr with buffers we can send to the clients - try server.remote_lua_clients.append(gpa, node); + server.remote_lua_clients.prepend(&node.node); remote_lua_v1.setHandler(*RemoteLua, handleRequest, handleDestroy, node); } @@ -56,6 +59,16 @@ remote: *RemoteLua, } } +fn handleDestroy(_: *mez.RemoteLuaV1, remote_lua: *RemoteLua) void { + if (remote_lua.node.prev) |p| { + if (remote_lua.node.next) |n| n.prev.? = p; + p.next = remote_lua.node.next; + } else server.remote_lua_clients.first = remote_lua.node.next; + + remote_lua.L.deinit(); + gpa.destroy(remote_lua); +} + fn catchLuaFail(remote: *RemoteLua) void { const err_txt: []const u8 = remote.L.toString(-1) catch unreachable; const txt = std.mem.concat(gpa, u8, &[_][]const u8{ "repl: ", err_txt }) catch Utils.oomPanic(); @@ -69,9 +82,3 @@ fn catchLuaFail(remote: *RemoteLua) void { sendNewLogEntry(w_sentinel); return; } - -fn handleDestroy(_: *mez.RemoteLuaV1, remote_lua: *RemoteLua) void { - _ = server.remote_lua_clients.swapRemove(remote_lua.id); - remote_lua.L.deinit(); - gpa.destroy(remote_lua); -} diff --git a/src/server.zig b/src/server.zig index 032fbb6..1843ced 100644 --- a/src/server.zig +++ b/src/server.zig @@ -44,7 +44,7 @@ cursor: Cursor, keymaps: std.AutoHashMap(u64, Keymap), hooks: std.ArrayList(*Hook), events: Events, -remote_lua_clients: std.ArrayList(*RemoteLua), +remote_lua_clients: std.DoublyLinkedList, // Backend listeners new_input: wl.Listener(*wlr.InputDevice) = .init(handleNewInput), @@ -103,7 +103,7 @@ pub fn init(self: *Server) void { .keymaps = .init(gpa), .hooks = try .initCapacity(gpa, 10), // TODO: choose how many slots to start with .events = try .init(gpa), - .remote_lua_clients = try .initCapacity(gpa, 0), + .remote_lua_clients = .{}, }; self.renderer.initServer(wl_server) catch { @@ -138,8 +138,6 @@ pub fn deinit(self: *Server) noreturn { self.new_xdg_popup.link.remove(); self.new_xdg_toplevel_decoration.link.remove(); - self.remote_lua_clients.deinit(gpa); - self.seat.deinit(); self.root.deinit(); self.cursor.deinit();