From 61c4f80e9059b8c5a9ae5cfd70a3f198e0f42bd4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Oct 2023 18:16:13 +0530 Subject: [PATCH] Fix deadlock on macOS caused by recent support for pipe peers Apparently on macOS we cant post an event to the main loop if the main loop is waiting on a lock we are holding. Absurd. Fixes #6751 --- kitty/child-monitor.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 9e7d29be1..0d17994b2 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -1782,7 +1782,6 @@ prune_peers(ChildMonitor *self) { pruned = true; } } - if (pruned) wakeup_main_loop(); return pruned; } @@ -1834,6 +1833,7 @@ talk_loop(void *data) { while (LIKELY(!self->shutting_down)) { num_peer_fds = 0; + bool need_to_wakup_main_loop = false; talk_mutex(lock); if (peers_to_inject.num) { for (size_t i = 0; i < peers_to_inject.num; i++) { @@ -1844,7 +1844,7 @@ talk_loop(void *data) { peers_to_inject.num = 0; } if (talk_data.num_peers > 0) { - prune_peers(self); + if (prune_peers(self)) need_to_wakup_main_loop = true; for (size_t i = 0; i < talk_data.num_peers; i++) { Peer *p = talk_data.peers + i; if (!p->read.finished || p->write.used) { @@ -1859,6 +1859,7 @@ talk_loop(void *data) { } } talk_mutex(unlock); + if (need_to_wakup_main_loop) wakeup_main_loop(); for (size_t i = 0; i < num_listen_fds; i++) fds[i].revents = 0; int ret = poll(fds, num_listen_fds + num_peer_fds, -1); if (ret > 0) {