View: add more assertions around destruction

This should make leaks like the one fixed by the previous commit harder
to write.
This commit is contained in:
Isaac Freund 2024-04-08 15:18:12 +02:00
parent a374c6ab84
commit 94828474b0
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11
4 changed files with 12 additions and 6 deletions

View File

@ -726,7 +726,7 @@ fn commitTransaction(root: *Root) void {
var it = root.hidden.inflight.focus_stack.safeIterator(.forward); var it = root.hidden.inflight.focus_stack.safeIterator(.forward);
while (it.next()) |view| { while (it.next()) |view| {
view.dropSavedSurfaceTree(); view.dropSavedSurfaceTree();
if (view.destroying) view.destroy(); if (view.destroying) view.destroy(.assert);
} }
} }

View File

@ -228,8 +228,9 @@ pub fn create(impl: Impl) error{OutOfMemory}!*View {
/// If saved buffers of the view are currently in use by a transaction, /// If saved buffers of the view are currently in use by a transaction,
/// mark this view for destruction when the transaction completes. Otherwise /// mark this view for destruction when the transaction completes. Otherwise
/// destroy immediately. /// destroy immediately.
pub fn destroy(view: *View) void { pub fn destroy(view: *View, when: enum { lazy, assert }) void {
assert(view.impl == .none); assert(view.impl == .none);
assert(!view.mapped);
view.destroying = true; view.destroying = true;
@ -249,6 +250,11 @@ pub fn destroy(view: *View) void {
if (view.output_before_evac) |name| util.gpa.free(name); if (view.output_before_evac) |name| util.gpa.free(name);
util.gpa.destroy(view); util.gpa.destroy(view);
} else {
switch (when) {
.lazy => {},
.assert => unreachable,
}
} }
} }

View File

@ -81,7 +81,7 @@ pub fn create(wlr_toplevel: *wlr.XdgToplevel) error{OutOfMemory}!void {
.view = undefined, .view = undefined,
.wlr_toplevel = wlr_toplevel, .wlr_toplevel = wlr_toplevel,
} }); } });
errdefer view.destroy(); errdefer view.destroy(.assert);
const toplevel = &view.impl.toplevel; const toplevel = &view.impl.toplevel;
@ -219,7 +219,7 @@ fn handleDestroy(listener: *wl.Listener(void)) void {
const view = toplevel.view; const view = toplevel.view;
view.impl = .none; view.impl = .none;
view.destroy(); view.destroy(.lazy);
} }
fn handleMap(listener: *wl.Listener(void)) void { fn handleMap(listener: *wl.Listener(void)) void {

View File

@ -64,7 +64,7 @@ pub fn create(xwayland_surface: *wlr.XwaylandSurface) error{OutOfMemory}!void {
.view = undefined, .view = undefined,
.xwayland_surface = xwayland_surface, .xwayland_surface = xwayland_surface,
} }); } });
errdefer view.destroy(); errdefer view.destroy(.assert);
const xwayland_view = &view.impl.xwayland_view; const xwayland_view = &view.impl.xwayland_view;
xwayland_view.view = view; xwayland_view.view = view;
@ -142,7 +142,7 @@ fn handleDestroy(listener: *wl.Listener(void)) void {
const view = xwayland_view.view; const view = xwayland_view.view;
view.impl = .none; view.impl = .none;
view.destroy(); view.destroy(.lazy);
} }
fn handleAssociate(listener: *wl.Listener(void)) void { fn handleAssociate(listener: *wl.Listener(void)) void {