1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-26 02:38:04 +00:00

Use std::optional for siginfo

This commit is contained in:
elsid 2024-01-19 13:43:26 +01:00
parent c95c8fcc36
commit 388a73376c
No known key found for this signature in database
GPG Key ID: 4DE04C198CBA7625

View File

@ -2,6 +2,7 @@
#include <cstring> #include <cstring>
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <optional>
#include <span> #include <span>
#include <errno.h> #include <errno.h>
@ -61,8 +62,7 @@ static struct
{ {
int signum; int signum;
pid_t pid; pid_t pid;
int has_siginfo; std::optional<siginfo_t> siginfo;
siginfo_t siginfo;
char buf[1024]; char buf[1024];
} crash_info; } crash_info;
@ -261,8 +261,9 @@ static void crash_catcher(int signum, siginfo_t* siginfo, void* context)
crash_info.signum = signum; crash_info.signum = signum;
crash_info.pid = getpid(); crash_info.pid = getpid();
crash_info.has_siginfo = !!siginfo; if (siginfo == nullptr)
if (siginfo) crash_info.siginfo = std::nullopt;
else
crash_info.siginfo = *siginfo; crash_info.siginfo = *siginfo;
if (cc_user_info) if (cc_user_info)
cc_user_info(crash_info.buf, crash_info.buf + sizeof(crash_info.buf)); cc_user_info(crash_info.buf, crash_info.buf + sizeof(crash_info.buf));
@ -318,30 +319,30 @@ static void crash_handler(const char* logfile)
const char* sigdesc = findSignalDescription(signals, crash_info.signum); const char* sigdesc = findSignalDescription(signals, crash_info.signum);
if (crash_info.has_siginfo) if (crash_info.siginfo.has_value())
{ {
switch (crash_info.signum) switch (crash_info.signum)
{ {
case SIGSEGV: case SIGSEGV:
sigdesc = findSignalDescription(sigSegvCodes, crash_info.siginfo.si_code); sigdesc = findSignalDescription(sigSegvCodes, crash_info.siginfo->si_code);
break; break;
case SIGFPE: case SIGFPE:
sigdesc = findSignalDescription(sigFpeCodes, crash_info.siginfo.si_code); sigdesc = findSignalDescription(sigFpeCodes, crash_info.siginfo->si_code);
break; break;
case SIGILL: case SIGILL:
sigdesc = findSignalDescription(sigIllCodes, crash_info.siginfo.si_code); sigdesc = findSignalDescription(sigIllCodes, crash_info.siginfo->si_code);
break; break;
case SIGBUS: case SIGBUS:
sigdesc = findSignalDescription(sigBusCodes, crash_info.siginfo.si_code); sigdesc = findSignalDescription(sigBusCodes, crash_info.siginfo->si_code);
break; break;
} }
} }
fprintf(stderr, "%s (signal %i)\n", sigdesc, crash_info.signum); fprintf(stderr, "%s (signal %i)\n", sigdesc, crash_info.signum);
if (crash_info.has_siginfo) if (crash_info.siginfo.has_value())
fprintf(stderr, "Address: %p\n", crash_info.siginfo.si_addr); fprintf(stderr, "Address: %p\n", crash_info.siginfo->si_addr);
fputc('\n', stderr); fputc('\n', stderr);
if (logfile) if (logfile)
@ -358,8 +359,8 @@ static void crash_handler(const char* logfile)
"*** Fatal Error ***\n" "*** Fatal Error ***\n"
"%s (signal %i)\n", "%s (signal %i)\n",
sigdesc, crash_info.signum); sigdesc, crash_info.signum);
if (crash_info.has_siginfo) if (crash_info.siginfo.has_value())
printf("Address: %p\n", crash_info.siginfo.si_addr); printf("Address: %p\n", crash_info.siginfo->si_addr);
fputc('\n', stdout); fputc('\n', stdout);
fflush(stdout); fflush(stdout);
} }