rework how remote lua clients are stored in the server

This commit is contained in:
Squibid 2025-12-10 13:43:12 -05:00
parent 1e31875670
commit 6fcb13741a
Signed by: squibid
GPG key ID: BECE5684D3C4005D
2 changed files with 20 additions and 15 deletions

View file

@ -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);
}