mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 00:38:11 +00:00
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.
This commit is contained in:
parent
aa2df9277d
commit
c3dbe77024
2 changed files with 28 additions and 1 deletions
|
@ -519,6 +519,26 @@ void EventLoop::unregister_signal(int handler_id)
|
||||||
s_signal_handlers.remove(remove_signo);
|
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)
|
void EventLoop::wait_for_event(WaitMode mode)
|
||||||
{
|
{
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
|
|
|
@ -81,6 +81,13 @@ public:
|
||||||
static int register_signal(int signo, Function<void(int)> handler);
|
static int register_signal(int signo, Function<void(int)> handler);
|
||||||
static void unregister_signal(int handler_id);
|
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:
|
private:
|
||||||
bool start_rpc_server();
|
bool start_rpc_server();
|
||||||
void wait_for_event(WaitMode);
|
void wait_for_event(WaitMode);
|
||||||
|
@ -102,8 +109,8 @@ private:
|
||||||
|
|
||||||
class SignalHandlers {
|
class SignalHandlers {
|
||||||
AK_MAKE_NONCOPYABLE(SignalHandlers);
|
AK_MAKE_NONCOPYABLE(SignalHandlers);
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
SignalHandlers(SignalHandlers&& from)
|
SignalHandlers(SignalHandlers&& from)
|
||||||
: m_signo(from.m_signo)
|
: m_signo(from.m_signo)
|
||||||
, m_original_handler(from.m_original_handler)
|
, m_original_handler(from.m_original_handler)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue