summaryrefslogtreecommitdiff
path: root/src/signal-safe.cpp
diff options
context:
space:
mode:
authorvirchau13 <virchau13@hexular.net>2024-04-28 00:38:48 +0800
committerGitHub <noreply@github.com>2024-04-27 17:38:48 +0100
commit90a53aed59be6bac45c13eac954471d56ac23375 (patch)
treec1a246f6cdf0b9f6d0f1f6ea6f282b4fa5666976 /src/signal-safe.cpp
parent55490637aaf13c8400a0679fcf5b7fca417bc923 (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.cpp30
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
+}