diff --git a/CMakeLists.txt b/CMakeLists.txt index 619b9c76..121e711a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,9 +23,11 @@ set(HEADERS src/base/io/Json.h src/base/io/Watcher.h src/base/kernel/interfaces/IConfigListener.h + src/base/kernel/interfaces/ISignalListener.h src/base/kernel/interfaces/IWatcherListener.h src/base/kernel/Entry.h src/base/kernel/Process.h + src/base/kernel/Signals.h src/base/tools/Arguments.h src/base/tools/Handle.h src/base/tools/String.h @@ -109,6 +111,7 @@ set(SOURCES src/base/io/Watcher.cpp src/base/kernel/Entry.cpp src/base/kernel/Process.cpp + src/base/kernel/Signals.cpp src/base/tools/Arguments.cpp src/base/tools/Handle.cpp src/base/tools/String.cpp diff --git a/src/App.cpp b/src/App.cpp index 07acc09a..31691fbf 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -30,6 +30,7 @@ #include "api/Api.h" #include "App.h" +#include "base/kernel/Signals.h" #include "common/Console.h" #include "common/cpu/Cpu.h" #include "common/log/Log.h" @@ -49,16 +50,11 @@ #endif -xmrig::App *xmrig::App::m_self = nullptr; - - - xmrig::App::App(Process *process) : m_console(nullptr), - m_httpd(nullptr) + m_httpd(nullptr), + m_signals(nullptr) { - m_self = this; - m_controller = new xmrig::Controller(process); if (m_controller->init() != 0) { return; @@ -67,10 +63,6 @@ xmrig::App::App(Process *process) : if (!m_controller->config()->isBackground()) { m_console = new Console(this); } - - uv_signal_init(uv_default_loop(), &m_sigHUP); - uv_signal_init(uv_default_loop(), &m_sigINT); - uv_signal_init(uv_default_loop(), &m_sigTERM); } @@ -78,6 +70,7 @@ xmrig::App::~App() { uv_tty_reset_mode(); + delete m_signals; delete m_console; delete m_controller; @@ -93,9 +86,7 @@ int xmrig::App::exec() return 2; } - uv_signal_start(&m_sigHUP, App::onSignal, SIGHUP); - uv_signal_start(&m_sigINT, App::onSignal, SIGINT); - uv_signal_start(&m_sigTERM, App::onSignal, SIGTERM); + m_signals = new Signals(this); background(); @@ -172,21 +163,7 @@ void xmrig::App::onConsoleCommand(char command) } -void xmrig::App::close() -{ - m_controller->network()->stop(); - Workers::stop(); - - uv_stop(uv_default_loop()); -} - - -void xmrig::App::release() -{ -} - - -void xmrig::App::onSignal(uv_signal_t *handle, int signum) +void xmrig::App::onSignal(int signum) { switch (signum) { @@ -206,6 +183,19 @@ void xmrig::App::onSignal(uv_signal_t *handle, int signum) break; } - uv_signal_stop(handle); - m_self->close(); + close(); +} + + +void xmrig::App::close() +{ + m_controller->network()->stop(); + Workers::stop(); + + uv_stop(uv_default_loop()); +} + + +void xmrig::App::release() +{ } diff --git a/src/App.h b/src/App.h index b93fc4a1..9ec8edcc 100644 --- a/src/App.h +++ b/src/App.h @@ -27,9 +27,7 @@ #define XMRIG_APP_H -#include - - +#include "base/kernel/interfaces/ISignalListener.h" #include "common/interfaces/IConsoleListener.h" @@ -43,9 +41,10 @@ namespace xmrig { class Controller; class Process; +class Signals; -class App : public IConsoleListener +class App : public IConsoleListener, public ISignalListener { public: App(Process *process); @@ -55,21 +54,16 @@ public: protected: void onConsoleCommand(char command) override; + void onSignal(int signum) override; private: void background(); void close(); void release(); - static void onSignal(uv_signal_t *handle, int signum); - - static App *m_self; - Console *m_console; Httpd *m_httpd; - uv_signal_t m_sigHUP; - uv_signal_t m_sigINT; - uv_signal_t m_sigTERM; + Signals *m_signals; xmrig::Controller *m_controller; }; diff --git a/src/base/kernel/Signals.cpp b/src/base/kernel/Signals.cpp new file mode 100644 index 00000000..a37c49c6 --- /dev/null +++ b/src/base/kernel/Signals.cpp @@ -0,0 +1,63 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018 SChernykh + * Copyright 2016-2018 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include + + +#include "base/kernel/interfaces/ISignalListener.h" +#include "base/kernel/Signals.h" +#include "base/tools/Handle.h" + + +static const int signums[xmrig::Signals::kSignalsCount] = { SIGHUP, SIGINT, SIGTERM }; + + +xmrig::Signals::Signals(ISignalListener *listener) + : m_listener(listener) +{ + for (size_t i = 0; i < kSignalsCount; ++i) { + uv_signal_t *signal = new uv_signal_t; + signal->data = this; + + m_signals[i] = signal; + + uv_signal_init(uv_default_loop(), signal); + uv_signal_start(signal, xmrig::Signals::onSignal, signums[i]); + } +} + + +xmrig::Signals::~Signals() +{ + for (size_t i = 0; i < kSignalsCount; ++i) { + Handle::close(m_signals[i]); + } +} + + +void xmrig::Signals::onSignal(uv_signal_t *handle, int signum) +{ + static_cast(handle->data)->m_listener->onSignal(signum); +} diff --git a/src/base/kernel/Signals.h b/src/base/kernel/Signals.h new file mode 100644 index 00000000..8ef4a4bb --- /dev/null +++ b/src/base/kernel/Signals.h @@ -0,0 +1,62 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef XMRIG_SIGNALS_H +#define XMRIG_SIGNALS_H + + +#include + + +typedef struct uv_signal_s uv_signal_t; + + +namespace xmrig { + + +class ISignalListener; + + +class Signals +{ +public: + constexpr static const size_t kSignalsCount = 3; + + Signals(ISignalListener *listener); + ~Signals(); + +private: + void close(int signum); + + static void onSignal(uv_signal_t *handle, int signum); + + ISignalListener *m_listener; + uv_signal_t *m_signals[kSignalsCount]; +}; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_SIGNALS_H */ diff --git a/src/base/kernel/interfaces/ISignalListener.h b/src/base/kernel/interfaces/ISignalListener.h new file mode 100644 index 00000000..bbcd11f1 --- /dev/null +++ b/src/base/kernel/interfaces/ISignalListener.h @@ -0,0 +1,47 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef XMRIG_ISIGNALLISTENER_H +#define XMRIG_ISIGNALLISTENER_H + + +namespace xmrig { + + +class String; + + +class ISignalListener +{ +public: + virtual ~ISignalListener() = default; + + virtual void onSignal(int signum) = 0; +}; + + +} /* namespace xmrig */ + + +#endif // XMRIG_ISIGNALLISTENER_H