#ifndef MRT_SIGNAL_MANAGER_H
#define MRT_SIGNAL_MANAGER_H
#include <vector>
#include "Base/Macros.h"
#include "Common/PagePool.h"
#include "Signal/SignalHandler.h"
#include "Signal/SignalStack.h"
namespace MapleRuntime {
struct ThreadLocalData;
class SignalManager {
public:
SignalManager() = default;
~SignalManager()
{
if (extraStack != nullptr) {
PagePool::Instance().ReturnPage(static_cast<uint8_t*>(extraStack), extraStackSize);
}
}
void Init();
void Fini();
static void AddHandlerToSignalStack(int signal, SignalAction* sa);
static void RemoveHandlerFromSignalStack(int signal, bool (*fn)(int, siginfo_t*, void*));
static const char* GetSignalName(uint8_t idx)
{
constexpr uint8_t maxSigNum = 31;
if (idx > maxSigNum || idx == 0) {
return "wrong signal";
}
const char* signalNameArr[] = { "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT",
"SIGBUS", "SIGFPE", "SIGKILL", "SIGUSR1", "SIGSEGV", "SIGUSR2",
"SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT",
"SIGSTOP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU",
"SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO", "SIGPWR",
"SIGSYS" };
return signalNameArr[idx - 1];
}
private:
void PrepareSigStack();
void FreeSigStack();
void BlockSignals();
void InstallSegvHandler();
void InstallUnexpectedSignalHandlers();
void InstallSIGUSR1Handlers() const;
#ifdef __OHOS__
void InstallSIGUSR2Handlers() const;
static bool HandleUnexpectedSIGUSR2(int sig, siginfo_t *info, void *context);
#endif
static bool HandleUnexpectedSIGUSR1(int sig, siginfo_t *info, void *context);
static bool HandleUnexpectedSigsegv(int sig, siginfo_t* info, void* context);
static bool HandleUnexpectedSignal(int sig, siginfo_t* info, void* context);
DISABLE_CLASS_COPY_AND_ASSIGN(SignalManager);
void* extraStack{ nullptr };
uint32_t extraStackSize{ 0 };
stack_t signalStack;
};
}
#endif