From 6be75ce1c7e49ca7a576ef86adba0d95b0895021 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 May 2024 12:21:56 +0530 Subject: [PATCH] Dont hold lock while reporting reaped pids Can lead to a deadlock if the python code calls something that tries to acquire the same lock --- kitty/child-monitor.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index c847978f5..6d2c343e7 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -948,14 +948,17 @@ monitor_pid(PyObject *self UNUSED, PyObject *args) { static void report_reaped_pids(void) { + static ReapedPID pids[64]; + size_t i = 0; children_mutex(lock); if (reaped_pids_count) { - for (size_t i = 0; i < reaped_pids_count; i++) { - call_boss(on_monitored_pid_death, "ii", (int)reaped_pids[i].pid, reaped_pids[i].status); + for (; i < reaped_pids_count && i < arraysz(pids); i++) { + pids[i] = reaped_pids[i]; } reaped_pids_count = 0; } children_mutex(unlock); + for (size_t n = 0; n < i; n++) { call_boss(on_monitored_pid_death, "li", (long)pids[n].pid, pids[n].status); } } static void*