From 90a53aed59be6bac45c13eac954471d56ac23375 Mon Sep 17 00:00:00 2001 From: virchau13 Date: Sun, 28 Apr 2024 00:38:48 +0800 Subject: 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. --- src/signal-safe.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/signal-safe.cpp (limited to 'src/signal-safe.cpp') 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 +#endif +#include +#include +#include + +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 +} -- cgit v1.2.3