Explorar el Código

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.
AnotherTest hace 4 años
padre
commit
c3dbe77024
Se han modificado 2 ficheros con 28 adiciones y 1 borrados
  1. 20 0
      Libraries/LibCore/EventLoop.cpp
  2. 8 1
      Libraries/LibCore/EventLoop.h

+ 20 - 0
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;

+ 8 - 1
Libraries/LibCore/EventLoop.h

@@ -81,6 +81,13 @@ public:
     static int register_signal(int signo, Function<void(int)> 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)