First try

This commit is contained in:
objatie_groba 2019-02-02 15:26:07 +03:00
parent 0f577da5c2
commit f1d90515a1
2 changed files with 70 additions and 1 deletions

View File

@ -231,6 +231,9 @@ private:
/// Previous value of logger element in config. It is used to reinitialize loggers whenever the value changed.
std::string config_logger;
/// Проверка возможности использовать некоторые инструкции, такие как SSE3
void check_required_instructions();
};

View File

@ -598,7 +598,10 @@ void BaseDaemon::reloadConfiguration()
/// For creating and destroying unique_ptr of incomplete type.
BaseDaemon::BaseDaemon() = default;
BaseDaemon::BaseDaemon()
{
check_required_instructions();
}
BaseDaemon::~BaseDaemon()
@ -609,6 +612,69 @@ BaseDaemon::~BaseDaemon()
}
enum class InstructionFail {
NONE = 0,
FAIL = 1,
};
static sigjmp_buf jmpbuf;
static void sig_handler(int sig, siginfo_t * info, void * context)
{
siglongjmp(jmpbuf, 1);
}
static void check_required_instructions(volatile InstructionFail * fail) {
std::cerr << "KEK\n";
*fail = InstructionFail::FAIL;
raise(SIGILL);
}
void BaseDaemon::check_required_instructions()
{
struct sigaction sa, sa_old;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = sig_handler;
sa.sa_flags = SA_SIGINFO;
auto signal = SIGILL;
if (sigemptyset(&sa.sa_mask)) {
std::cerr << ":(\n";
exit(1);
}
if (sigaddset(&sa.sa_mask, signal)) {
std::cerr << ":(\n";
exit(1);
}
if (sigaction(signal, &sa, &sa_old)) {
std::cerr << ":(\n";
exit(1);
}
volatile InstructionFail fail = InstructionFail::NONE;
if (sigsetjmp(jmpbuf, 1)) {
std::cerr << ":(\n";
exit(1);
}
if (fail != InstructionFail::NONE) {
std::cerr << ":(\n";
exit(1);
}
::check_required_instructions(&fail);
if (sigaction(signal, &sa_old, nullptr)) {
std::cerr << ":(\n";
exit(1);
}
}
void BaseDaemon::terminate()
{
getTaskManager().cancelAll();