From dd609d6d367f570848aee7c102890d54c1501493 Mon Sep 17 00:00:00 2001 From: Janis Date: Sat, 17 Dec 2022 17:39:13 +0100 Subject: [PATCH] memory leaks --- main.zig | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/main.zig b/main.zig index 183e60a..48b4f6d 100644 --- a/main.zig +++ b/main.zig @@ -363,14 +363,6 @@ fn ListItem(comptime T: type) type { link: list.Link, value: T = undefined, - fn create(ally: std.mem.Allocator, value: T) !*Self { - const self = try ally.create(Self); - - self.init(value); - - return self; - } - fn init(self: *Self, value: T) void { self.value = value; } @@ -1127,11 +1119,40 @@ const State = struct { } fn deinit(self: *Self) void { - self.ally.destroy(self.seats); - self.ally.destroy(self.outputs); - self.ally.destroy(self); + defer self.ally.destroy(self); - // TODO: clean up wayland state + var seats_iter = self.seats.safeIterator(.forward); + while (seats_iter.next()) |next| { + next.remove(); + self.ally.destroy(next); + } + self.ally.destroy(self.seats); + + + var outputs_iter = self.outputs.safeIterator(.forward); + while (outputs_iter.next()) |next| { + next.remove(); + self.ally.destroy(next); + } + self.ally.destroy(self.outputs); + + if (self.shm) |p| { + p.destroy(); + } + if (self.compositor) |p| { + p.destroy(); + } + if (self.layer_shell) |p| { + p.destroy(); + } + if (self.xdg_output_manager) |p| { + p.destroy(); + } + + self.registry.destroy(); + self.ally.destroy( + self.registry_listener + ); } fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, self: *Self) void { @@ -1153,13 +1174,15 @@ const State = struct { } else if (std.cstr.cmp(global.interface, wl.Seat.getInterface().name) == 0) { const seat = registry.bind(global.name, wl.Seat, 1) catch return; - if (ListItem(Seat).create(self.ally, Seat{.seat = seat}) catch null) |ele| { + if (self.ally.create(ListItem(Seat)) catch null) |ele| { + ele.init(Seat{.seat = seat}); self.seats.append(ele); } } else if (std.cstr.cmp(global.interface, wl.Output.getInterface().name) == 0) { const output = registry.bind(global.name, wl.Output, 3) catch return; - if (ListItem(Output).create(self.ally, Output{.output = output}) catch null) |ele| { + if (self.ally.create(ListItem(Output)) catch null) |ele| { + ele.init(Output{.output = output}); self.outputs.append(ele); } } @@ -1328,6 +1351,7 @@ const State = struct { self.xdg_output_manager.destroy(); xkb.xkb_context_unref(self.xkb_context); self.registry.destroy(); + self.ally.destroy(self.registry_listener); self.ally.free(self.cursor_theme); }