mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
First try
This commit is contained in:
parent
0f577da5c2
commit
f1d90515a1
@ -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();
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user