diff --git a/Ladybird/HelperProcess.cpp b/Ladybird/HelperProcess.cpp index fa5393f7ab0..b8b00170804 100644 --- a/Ladybird/HelperProcess.cpp +++ b/Ladybird/HelperProcess.cpp @@ -15,14 +15,14 @@ enum class RegisterWithProcessManager { Yes, }; -template -static ErrorOr> launch_server_process_impl( +template +static ErrorOr> launch_server_process( StringView server_name, ReadonlySpan candidate_server_paths, Vector arguments, RegisterWithProcessManager register_with_process_manager, Ladybird::EnableCallgrindProfiling enable_callgrind_profiling, - SpawnFunction&& spawn_function) + ClientArguments&&... client_arguments) { if (enable_callgrind_profiling == Ladybird::EnableCallgrindProfiling::Yes) { arguments.prepend({ @@ -43,7 +43,7 @@ static ErrorOr> launch_server_process_impl( options.executable = path; } - auto result = spawn_function(options); + auto result = Core::IPCProcess::spawn(move(options), forward(client_arguments)...); if (!result.is_error()) { auto process = result.release_value(); @@ -70,33 +70,6 @@ static ErrorOr> launch_server_process_impl( VERIFY_NOT_REACHED(); } -template -static ErrorOr> launch_generic_server_process( - StringView server_name, - ReadonlySpan candidate_server_paths, - Vector arguments, - RegisterWithProcessManager register_with_process_manager, - Ladybird::EnableCallgrindProfiling enable_callgrind_profiling, - ClientArguments&&... client_arguments) -{ - return launch_server_process_impl(server_name, candidate_server_paths, move(arguments), register_with_process_manager, enable_callgrind_profiling, [&](auto options) { - return Core::IPCProcess::spawn(move(options), forward(client_arguments)...); - }); -} - -template -static ErrorOr> launch_singleton_server_process( - StringView server_name, - ReadonlySpan candidate_server_paths, - Vector arguments, - RegisterWithProcessManager register_with_process_manager, - ClientArguments&&... client_arguments) -{ - return launch_server_process_impl(server_name, candidate_server_paths, move(arguments), register_with_process_manager, Ladybird::EnableCallgrindProfiling::No, [&](auto options) { - return Core::IPCProcess::spawn_singleton(move(options), forward(client_arguments)...); - }); -} - ErrorOr> launch_web_content_process( WebView::ViewImplementation& view, ReadonlySpan candidate_web_content_paths, @@ -135,12 +108,12 @@ ErrorOr> launch_web_content_process( arguments.append(ByteString::number(request_server_socket->fd())); } - return launch_generic_server_process("WebContent"sv, candidate_web_content_paths, move(arguments), RegisterWithProcessManager::No, web_content_options.enable_callgrind_profiling, view); + return launch_server_process("WebContent"sv, candidate_web_content_paths, move(arguments), RegisterWithProcessManager::No, web_content_options.enable_callgrind_profiling, view); } ErrorOr> launch_image_decoder_process(ReadonlySpan candidate_image_decoder_paths) { - return launch_generic_server_process("ImageDecoder"sv, candidate_image_decoder_paths, {}, RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); + return launch_server_process("ImageDecoder"sv, candidate_image_decoder_paths, {}, RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); } ErrorOr> launch_web_worker_process(ReadonlySpan candidate_web_worker_paths, NonnullRefPtr request_client) @@ -152,7 +125,7 @@ ErrorOr> launch_web_worker_process(Rea ByteString::number(socket.fd()), }; - return launch_generic_server_process("WebWorker"sv, candidate_web_worker_paths, move(arguments), RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); + return launch_server_process("WebWorker"sv, candidate_web_worker_paths, move(arguments), RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); } ErrorOr> launch_request_server_process(ReadonlySpan candidate_request_server_paths, StringView serenity_resource_root, Vector const& certificates) @@ -172,7 +145,7 @@ ErrorOr> launch_request_server_process(Re arguments.append(server.value()); } - return launch_generic_server_process("RequestServer"sv, candidate_request_server_paths, move(arguments), RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); + return launch_server_process("RequestServer"sv, candidate_request_server_paths, move(arguments), RegisterWithProcessManager::Yes, Ladybird::EnableCallgrindProfiling::No); } ErrorOr connect_new_request_server_client(Protocol::RequestClient& client) diff --git a/Userland/Libraries/LibCore/Process.cpp b/Userland/Libraries/LibCore/Process.cpp index bf0e1bbe28a..65d0c8fb095 100644 --- a/Userland/Libraries/LibCore/Process.cpp +++ b/Userland/Libraries/LibCore/Process.cpp @@ -453,57 +453,4 @@ ErrorOr IPCProcess::paths_for_process(StringView proce return ProcessPaths { move(socket_path), move(pid_path) }; } -ErrorOr IPCProcess::spawn_singleton_and_connect_to_process(ProcessSpawnOptions const& options) -{ - auto [socket_path, pid_path] = TRY(paths_for_process(options.name)); - Process process { -1 }; - - if (auto existing_pid = TRY(get_process_pid(options.name, pid_path)); existing_pid.has_value()) { - process = Process { *existing_pid }; - } else { - auto ipc_fd = TRY(create_ipc_socket(socket_path)); - - sigset_t original_set; - sigset_t setting_set; - sigfillset(&setting_set); - (void)pthread_sigmask(SIG_BLOCK, &setting_set, &original_set); - - // FIXME: Roll this daemon implementation into `Process::disown`. - if (auto pid = TRY(System::fork()); pid == 0) { - (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr); - TRY(System::setsid()); - TRY(System::signal(SIGCHLD, SIG_IGN)); - - auto& arguments = const_cast&>(options.arguments); - arguments.append("--pid-file"sv); - arguments.append(pid_path); - - auto takeover_string = ByteString::formatted("{}:{}", options.name, TRY(System::dup(ipc_fd))); - TRY(Environment::set("SOCKET_TAKEOVER"sv, takeover_string, Environment::Overwrite::Yes)); - - auto process = TRY(Process::spawn(options)); - { - auto pid_file = TRY(File::open(pid_path, File::OpenMode::Write)); - TRY(pid_file->write_until_depleted(ByteString::number(process.pid()))); - } - - TRY(System::kill(getpid(), SIGTERM)); - } else { - auto wait_err = System::waitpid(pid); - (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr); - TRY(wait_err); - } - - auto pid = TRY(get_process_pid(options.name, pid_path)); - VERIFY(pid.has_value()); - - process = Process { *pid }; - } - - auto ipc_socket = TRY(LocalSocket::connect(socket_path)); - TRY(ipc_socket->set_blocking(true)); - - return ProcessAndIPCSocket { move(process), move(ipc_socket) }; -} - } diff --git a/Userland/Libraries/LibCore/Process.h b/Userland/Libraries/LibCore/Process.h index a870b97be78..7b71fcb3115 100644 --- a/Userland/Libraries/LibCore/Process.h +++ b/Userland/Libraries/LibCore/Process.h @@ -129,15 +129,6 @@ public: return ProcessAndIPCClient { move(process), move(client) }; } - template - static ErrorOr> spawn_singleton(ProcessSpawnOptions const& options, ClientArguments&&... client_arguments) - { - auto [process, socket] = TRY(spawn_singleton_and_connect_to_process(options)); - auto client = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ClientType { move(socket), forward(client_arguments)... })); - - return ProcessAndIPCClient { move(process), move(client) }; - } - struct ProcessPaths { ByteString socket_path; ByteString pid_path; @@ -154,7 +145,6 @@ private: NonnullOwnPtr m_ipc_socket; }; static ErrorOr spawn_and_connect_to_process(ProcessSpawnOptions const& options); - static ErrorOr spawn_singleton_and_connect_to_process(ProcessSpawnOptions const& options); Process m_process; };