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:
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user