diff --git a/src/common.cpp b/src/common.cpp index 7b42630af..5f59edee3 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -2269,7 +2269,11 @@ void append_path_component(wcstring &path, const wcstring &component) { extern "C" { [[gnu::noinline]] void debug_thread_error(void) { - while (1) sleep(9999999); + // Wait for a SIGINT. We can't use sigsuspend() because the signal may be delivered on another + // thread. + auto &tm = topic_monitor_t::principal(); + auto gens = tm.current_generations(); + tm.check(&gens, {topic_t::sighupint}, true /* wait */); } } diff --git a/src/signal.cpp b/src/signal.cpp index 06d0ee6c9..24e4e8726 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -255,6 +255,7 @@ static void handle_int_notinteractive(int sig, siginfo_t *info, void *context) { if (reraise_if_forked_child(sig)) return; parser_t::skip_all_blocks(); default_handler(sig, info, context); + topic_monitor_t::principal().post(topic_t::sighupint); } /// sigchld handler. Does notification and calls the handler in proc.c.