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 <leandro.ribeiro@collabora.com>
(cherry picked from commit 7444c29fd2)
This commit is contained in:
Leandro Ribeiro 2026-03-31 15:47:11 -03:00 committed by Marius Vlad
parent 59c945c300
commit 655eec74e8

View file

@ -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;
}