From 37154a5275e5b2f58db8e54acfa8f2e45d8e8b84 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Tue, 28 Jul 2026 13:57:00 +0800 Subject: [PATCH] Wayland: destroy transient framebuffer SHM pools (#21870) --- .../Transient/Rendering/WaylandFramebuffer.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Wayland/Server/Transient/Rendering/WaylandFramebuffer.cs b/src/Avalonia.Wayland/Server/Transient/Rendering/WaylandFramebuffer.cs index 1c971f2f7b..65d8a9c6df 100644 --- a/src/Avalonia.Wayland/Server/Transient/Rendering/WaylandFramebuffer.cs +++ b/src/Avalonia.Wayland/Server/Transient/Rendering/WaylandFramebuffer.cs @@ -72,10 +72,21 @@ class WaylandFramebuffer(IWaylandFramebufferSurface surface) : IFramebufferPlatf if (!State.IsReady) return; - using var pool = _p._surface.Globals!.WlShm.CreatePool(fd, bufferLen); - var listener = new BufferListener(); - var buffer = pool.CreateBuffer(0, size.Width, size.Height, stride, - WlShm.FormatEnum.Argb8888, listener); + var pool = _p._surface.Globals!.WlShm.CreatePool(fd, bufferLen); + WlBuffer buffer; + try + { + var listener = new BufferListener(); + buffer = pool.CreateBuffer(0, size.Width, size.Height, stride, + WlShm.FormatEnum.Argb8888, listener); + } + finally + { + // NWayland's Dispose only destroys the local proxy; + // the generated method is required to marshal the + // Wayland destructor request to the compositor. + pool.Destroy(); + } // Stage per-frame state (frame callback + // ack_configure + geometry + viewport/scale +