From f1652b295130fd241bd3a6505908d6db562fdcf1 Mon Sep 17 00:00:00 2001 From: Hiroki Tagato Date: Tue, 6 Jan 2026 22:38:25 +0900 Subject: [PATCH] start: add parent-death handling for BSDs (#12863) * Add parent-death handling for BSDs prctl() is a system call specific to Linux. So we cannot use it on BSDs. FreeBSD has a system call procctl() which is similar to prctl(). We can use it with PROC_PDEATHSIG_CTL. OpenBSD, NetBSD, and DragonFly BSD do not appear to have a similar mechanism. So intead of relying on a system call, we need to manually poll ppid to see if the parent process has died. With the changes, the spawned Hyprland process is terminated when the launcher process exits, matching Linux behavior as closely as possible on BSD platforms. * Remove ppid polling on OpenBSD, NetBSD, and DragonFly BSD --- start/src/core/Instance.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/start/src/core/Instance.cpp b/start/src/core/Instance.cpp index c89d9d0b3..ec56cc756 100644 --- a/start/src/core/Instance.cpp +++ b/start/src/core/Instance.cpp @@ -7,11 +7,17 @@ #include #include #include -#include #include #include #include +#if defined(__linux__) +#include +#elif defined(__FreeBSD__) +#include +#include +#endif + #include using namespace Hyprutils::OS; @@ -41,7 +47,12 @@ void CHyprlandInstance::runHyprlandThread(bool safeMode) { int forkRet = fork(); if (forkRet == 0) { // Make hyprland die on our SIGKILL +#if defined(__linux__) prctl(PR_SET_PDEATHSIG, SIGKILL); +#elif defined(__FreeBSD__) + int sig = SIGKILL; + procctl(P_PID, getpid(), PROC_PDEATHSIG_CTL, &sig); +#endif execvp(g_state->customPath.value_or("Hyprland").c_str(), args.data()); @@ -164,4 +175,4 @@ bool CHyprlandInstance::run(bool safeMode) { m_hlThread.join(); return !m_hyprlandInitialized || m_hyprlandExiting; -} \ No newline at end of file +}