3
0
mirror of https://github.com/hyprwm/Hyprland.git synced 2026-02-04 14:25:28 +00:00

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
This commit is contained in:
Hiroki Tagato
2026-01-06 22:38:25 +09:00
committed by GitHub
parent cbfbd9712a
commit f1652b2951

View File

@ -7,11 +7,17 @@
#include <sys/poll.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <ranges>
#include <string_view>
#if defined(__linux__)
#include <sys/prctl.h>
#elif defined(__FreeBSD__)
#include <signal.h>
#include <sys/procctl.h>
#endif
#include <hyprutils/os/Process.hpp>
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;
}
}