浏览代码

LibSQL: Block signals while forking SQLServer in Lagom

When debugging in Xcode, the waitpid() for the initial forked process
would always return EINTR or ECHILD. Work around this by blocking all
signals until we're ready to wait for the initial child.
Andrew Kaster 2 年之前
父节点
当前提交
afb3a4a030
共有 1 个文件被更改,包括 11 次插入1 次删除
  1. 11 1
      Userland/Libraries/LibSQL/SQLClient.cpp

+ 11 - 1
Userland/Libraries/LibSQL/SQLClient.cpp

@@ -15,6 +15,7 @@
 #    include <LibCore/StandardPaths.h>
 #    include <LibCore/StandardPaths.h>
 #    include <LibCore/System.h>
 #    include <LibCore/System.h>
 #    include <LibFileSystem/FileSystem.h>
 #    include <LibFileSystem/FileSystem.h>
+#    include <signal.h>
 #endif
 #endif
 
 
 namespace SQL {
 namespace SQL {
@@ -58,9 +59,14 @@ static ErrorOr<void> launch_server(DeprecatedString const& socket_path, Deprecat
         return server_fd_or_error.release_error();
         return server_fd_or_error.release_error();
     }
     }
     auto server_fd = server_fd_or_error.value();
     auto server_fd = server_fd_or_error.value();
+    sigset_t original_set;
+    sigset_t setting_set;
+    sigfillset(&setting_set);
+    (void)pthread_sigmask(SIG_BLOCK, &setting_set, &original_set);
     auto server_pid = TRY(Core::System::fork());
     auto server_pid = TRY(Core::System::fork());
 
 
     if (server_pid == 0) {
     if (server_pid == 0) {
+        (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr);
         TRY(Core::System::setsid());
         TRY(Core::System::setsid());
         TRY(Core::System::signal(SIGCHLD, SIG_IGN));
         TRY(Core::System::signal(SIGCHLD, SIG_IGN));
         server_pid = TRY(Core::System::fork());
         server_pid = TRY(Core::System::fork());
@@ -95,8 +101,12 @@ static ErrorOr<void> launch_server(DeprecatedString const& socket_path, Deprecat
 
 
         VERIFY_NOT_REACHED();
         VERIFY_NOT_REACHED();
     }
     }
+    VERIFY(server_pid > 0);
 
 
-    TRY(Core::System::waitpid(server_pid));
+    auto wait_err = Core::System::waitpid(server_pid);
+    (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr);
+    if (wait_err.is_error())
+        return wait_err.release_error();
     return {};
     return {};
 }
 }