From b3060956c35cb1f49b43b604bf1ab9335135f98f Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Fri, 7 Nov 2025 12:57:43 -0500
Subject: [PATCH] wayland: Release the SHM pool after initial cursor buffer
creation
The backing memory will be automatically unmapped when the buffer objects are destroyed, so no need to keep the pool around.
---
src/video/wayland/SDL_waylandmouse.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/video/wayland/SDL_waylandmouse.c b/src/video/wayland/SDL_waylandmouse.c
index a6759f6c3b579..6de3f93584821 100644
--- a/src/video/wayland/SDL_waylandmouse.c
+++ b/src/video/wayland/SDL_waylandmouse.c
@@ -65,7 +65,6 @@ typedef struct
int hot_x;
int hot_y;
- Wayland_SHMPool *shmPool;
int images_per_frame;
CustomCursorImage images[];
} Wayland_CustomCursor;
@@ -736,6 +735,7 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
}
SDL_CursorData *data = NULL;
+ Wayland_SHMPool *shm_pool = NULL;
int pool_size = 0;
int max_images = 0;
bool is_stack = false;
@@ -773,8 +773,8 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
goto failed;
}
- data->cursor_data.custom.shmPool = Wayland_AllocSHMPool(pool_size);
- if (!data->cursor_data.custom.shmPool) {
+ shm_pool = Wayland_AllocSHMPool(pool_size);
+ if (!shm_pool) {
goto failed;
}
@@ -812,7 +812,7 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
data->cursor_data.custom.images[offset + j].height = surface->h;
void *buf_data;
- data->cursor_data.custom.images[offset + j].buffer = Wayland_AllocBufferFromPool(data->cursor_data.custom.shmPool, surface->w, surface->h, &buf_data);
+ data->cursor_data.custom.images[offset + j].buffer = Wayland_AllocBufferFromPool(shm_pool, surface->w, surface->h, &buf_data);
// Wayland requires premultiplied alpha for its surfaces.
SDL_PremultiplyAlpha(surface->w, surface->h,
surface->format, surface->pixels, surface->pitch,
@@ -828,12 +828,13 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
}
SDL_small_free(surfaces, is_stack);
+ Wayland_ReleaseSHMPool(shm_pool);
return cursor;
failed:
+ Wayland_ReleaseSHMPool(shm_pool);
if (data) {
- Wayland_ReleaseSHMPool(data->cursor_data.custom.shmPool);
SDL_free(data->frame_durations_ms);
for (int i = 0; i < data->cursor_data.custom.images_per_frame * frame_count; ++i) {
if (data->cursor_data.custom.images[i].buffer) {
@@ -922,8 +923,6 @@ static void Wayland_FreeCursorData(SDL_CursorData *d)
wl_buffer_destroy(d->cursor_data.custom.images[i].buffer);
}
}
-
- Wayland_ReleaseSHMPool(d->cursor_data.custom.shmPool);
}
SDL_free(d->frame_durations_ms);