From 010627c13ed31d9d3d0ad94be244a70616264d82 Mon Sep 17 00:00:00 2001 From: JD Smith <93749+jdtsmith@users.noreply.github.com> Date: Sat, 25 Oct 2025 07:43:42 -0400 Subject: [PATCH] Fix GCD deadlock on sync queue draw * src/macappkit.m (set_global_focus_view_frame): set identifier key on drawing queue for easy identification. (mac_draw_queue_sync): Do not dispatch empty block if already running from drawing queue. --- src/macappkit.m | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/macappkit.m b/src/macappkit.m index 40c55710363..6b678ff5a37 100644 --- a/src/macappkit.m +++ b/src/macappkit.m @@ -7630,6 +7630,7 @@ - (NSCandidateListTouchBarItem *)candidateListTouchBarItem static bool saved_focus_view_modified_p; #if DRAWING_USE_GCD static dispatch_queue_t global_focus_drawing_queue; +static const void * kDrawingQueueKey = &kDrawingQueueKey; #endif static void @@ -7651,8 +7652,12 @@ - (NSCandidateListTouchBarItem *)candidateListTouchBarItem if (mac_drawing_use_gcd) { if (global_focus_drawing_queue == NULL) - global_focus_drawing_queue = - dispatch_queue_create ("org.gnu.Emacs.drawing", NULL); + { + global_focus_drawing_queue = + dispatch_queue_create ("org.gnu.Emacs.drawing", NULL); + dispatch_queue_set_specific(global_focus_drawing_queue, kDrawingQueueKey, + (void *)kDrawingQueueKey, NULL); + } } else { @@ -7671,8 +7676,10 @@ - (NSCandidateListTouchBarItem *)candidateListTouchBarItem mac_draw_queue_sync (void) { #if DRAWING_USE_GCD - if (global_focus_drawing_queue) - dispatch_sync (global_focus_drawing_queue, ^{}); + if (global_focus_drawing_queue && + /* Avoid deadlock if already on the drawing queue */ + !dispatch_get_specific(kDrawingQueueKey)) + dispatch_sync (global_focus_drawing_queue, ^{}); #endif }