From c3dbe770243ecc245a5df02e0a1e2cb367d72c31 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Mon, 7 Sep 2020 22:44:42 +0430 Subject: [PATCH] LibCore: Add 'notify_forked()' to tear down the eventloop in forked child This makes the forked process capable of constructing a new event loop, should it choose to. --- Libraries/LibCore/EventLoop.cpp | 20 ++++++++++++++++++++ Libraries/LibCore/EventLoop.h | 9 ++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Libraries/LibCore/EventLoop.cpp b/Libraries/LibCore/EventLoop.cpp index c800d795e3..0c1e51d4df 100644 --- a/Libraries/LibCore/EventLoop.cpp +++ b/Libraries/LibCore/EventLoop.cpp @@ -519,6 +519,26 @@ void EventLoop::unregister_signal(int handler_id) s_signal_handlers.remove(remove_signo); } +void EventLoop::notify_forked(ForkEvent event) +{ + switch (event) { + case ForkEvent::Child: + s_main_event_loop = nullptr; + s_event_loop_stack->clear(); + s_timers->clear(); + s_notifiers->clear(); + s_signal_handlers.clear(); + s_handling_signal = 0; + s_next_signal_id = 0; + s_pid = 0; + s_rpc_server = nullptr; + s_rpc_clients.clear(); + return; + } + + ASSERT_NOT_REACHED(); +} + void EventLoop::wait_for_event(WaitMode mode) { fd_set rfds; diff --git a/Libraries/LibCore/EventLoop.h b/Libraries/LibCore/EventLoop.h index 07064f798c..465e3095c2 100644 --- a/Libraries/LibCore/EventLoop.h +++ b/Libraries/LibCore/EventLoop.h @@ -81,6 +81,13 @@ public: static int register_signal(int signo, Function handler); static void unregister_signal(int handler_id); + // Note: Boost uses Parent/Child/Prepare, but we don't really have anything + // interesting to do in the parent or before forking. + enum class ForkEvent { + Child, + }; + static void notify_forked(ForkEvent); + private: bool start_rpc_server(); void wait_for_event(WaitMode); @@ -102,8 +109,8 @@ private: class SignalHandlers { AK_MAKE_NONCOPYABLE(SignalHandlers); - public: + public: SignalHandlers(SignalHandlers&& from) : m_signo(from.m_signo) , m_original_handler(from.m_original_handler)