diff options
| author | virchau13 <virchau13@hexular.net> | 2024-04-28 00:38:48 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-27 17:38:48 +0100 |
| commit | 90a53aed59be6bac45c13eac954471d56ac23375 (patch) | |
| tree | c1a246f6cdf0b9f6d0f1f6ea6f282b4fa5666976 /src/signal-safe.cpp | |
| parent | 55490637aaf13c8400a0679fcf5b7fca417bc923 (diff) | |
CrashReporter: fix deadlocks by making it mostly async-signal-safe (#5771)
`CrashReporter::createAndSaveCrash()` is not async-signal-safe,
resulting in random deadlocks/double-crashes during Hyprland crashes.
This changes the function to be (mostly) async-signal-safe.
Diffstat (limited to 'src/signal-safe.cpp')
| -rw-r--r-- | src/signal-safe.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/signal-safe.cpp b/src/signal-safe.cpp new file mode 100644 index 00000000..05ca9c65 --- /dev/null +++ b/src/signal-safe.cpp @@ -0,0 +1,30 @@ +#include "signal-safe.hpp" + +#ifndef __GLIBC__ +#include <signal.h> +#endif +#include <fcntl.h> +#include <unistd.h> +#include <string.h> + +extern char** environ; + +char const* sig_getenv(char const* name) { + int len = strlen(name); + for (char** var = environ; *var != NULL; var++) { + if (strncmp(*var, name, len) == 0 && (*var)[len] == '=') { + return (*var) + len + 1; + } + } + return NULL; +} + +char const* sig_strsignal(int sig) { +#ifdef __GLIBC__ + return sigabbrev_np(sig); +#elif defined(__DragonFly__) || defined(__FreeBSD__) + return sys_signame[sig]; +#else + return "unknown"; +#endif +} |
