From 8111ff4be8335c73b93717ba6b948ee57395a740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 24 Mar 2021 20:46:51 +0100 Subject: [PATCH] render: draw sixels before taking the render worker lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes a possible deadlock; render_sixels_images() may call render_cell(), which may need to take the worker lock (when rendering either a blinking cell, or a box drawing glyph that isn’t yet in the glyph cache). --- CHANGELOG.md | 1 + render.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04b0fe7f..7c7a6b1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ * Crash when compositor send `text-input-v3::enter` events without first having sent a `keyboard::enter` event (https://codeberg.org/dnkl/foot/issues/411). +* Deadlock when rendering sixel images. ### Security diff --git a/render.c b/render.c index dd8070e0..d8e1a009 100644 --- a/render.c +++ b/render.c @@ -2090,6 +2090,8 @@ grid_render(struct terminal *term) cursor.row &= term->grid->num_rows - 1; } + render_sixel_images(term, buf->pix[0], &cursor); + if (term->render.workers.count > 0) { mtx_lock(&term->render.workers.lock); term->render.workers.buf = buf; @@ -2099,8 +2101,6 @@ grid_render(struct terminal *term) xassert(tll_length(term->render.workers.queue) == 0); } - render_sixel_images(term, buf->pix[0], &cursor); - int first_dirty_row = -1; for (int r = 0; r < term->rows; r++) { struct row *row = grid_row_in_view(term->grid, r);