From 655eec74e87f8c065db8138d10ae8595fe2b7028 Mon Sep 17 00:00:00 2001 From: Leandro Ribeiro Date: Tue, 31 Mar 2026 15:47:11 -0300 Subject: [PATCH] drm: assert writeback state is freed after capture task retirement No behavior change, just a refactor to make it more clear that the state is freed after the capture task is retired. Signed-off-by: Leandro Ribeiro (cherry picked from commit 7444c29fd20baa677b632375fba1d1299dbe408a) --- libweston/backend-drm/drm.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index f8132b90d..6db8232e8 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -719,10 +719,14 @@ drm_writeback_state_alloc(void) } static void -drm_writeback_state_free(struct drm_writeback_state *state) +drm_writeback_state_free(struct weston_compositor *c, + struct drm_writeback_state *state) { struct drm_fb **fb; + /* Capture task must be retired before freeing the state. */ + weston_assert_ptr_null(c, state->ct); + if (state->out_fence_fd >= 0) close(state->out_fence_fd); @@ -847,7 +851,7 @@ drm_output_pick_writeback_capture_task(struct drm_output *output) return; err_fb: - drm_writeback_state_free(output->wb_state); + free(output->wb_state); output->wb_state = NULL; err: weston_capture_task_retire_failed(ct, msg); @@ -3436,6 +3440,7 @@ static void drm_writeback_success_screenshot(struct drm_writeback_state *state) { struct drm_output *output = state->output; + struct weston_compositor *c = output->base.compositor; struct weston_buffer *buffer; int width, height; int dst_stride, src_stride; @@ -3469,9 +3474,10 @@ drm_writeback_success_screenshot(struct drm_writeback_state *state) } weston_capture_task_retire_complete(state->ct); + state->ct = NULL; destroy_state: - drm_writeback_state_free(state); + drm_writeback_state_free(c, state); output->wb_state = NULL; } @@ -3480,6 +3486,7 @@ drm_writeback_fail_screenshot(struct drm_writeback_state *state, const char *err_msg) { struct drm_output *output = state->output; + struct weston_compositor *c = output->base.compositor; /** * Capture task already retired, see @@ -3490,9 +3497,10 @@ drm_writeback_fail_screenshot(struct drm_writeback_state *state, goto destroy_state; weston_capture_task_retire_failed(state->ct, err_msg); + state->ct = NULL; destroy_state: - drm_writeback_state_free(state); + drm_writeback_state_free(c, state); output->wb_state = NULL; }