mirror of
https://github.com/xmrig/xmrig.git
synced 2025-01-18 16:55:55 +00:00
Update Signals class.
This commit is contained in:
parent
75283445fd
commit
d6a1c98314
2 changed files with 134 additions and 57 deletions
|
@ -1,6 +1,6 @@
|
||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2020 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2022 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2022 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -14,25 +14,113 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional permission under GNU GPL version 3 section 7
|
||||||
|
*
|
||||||
|
* If you modify this Program, or any covered work, by linking or combining
|
||||||
|
* it with OpenSSL (or a modified version of that library), containing parts
|
||||||
|
* covered by the terms of OpenSSL License and SSLeay License, the licensors
|
||||||
|
* of this Program grant you additional permission to convey the resulting work.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "base/kernel/interfaces/ISignalListener.h"
|
|
||||||
#include "base/io/log/Log.h"
|
|
||||||
#include "base/io/log/Tags.h"
|
|
||||||
#include "base/io/Signals.h"
|
#include "base/io/Signals.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/kernel/interfaces/ISignalListener.h"
|
||||||
|
#include "base/kernel/Process.h"
|
||||||
#include "base/tools/Handle.h"
|
#include "base/tools/Handle.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef SIGUSR1
|
#ifdef XMRIG_FEATURE_EVENTS
|
||||||
static const int signums[xmrig::Signals::kSignalsCount] = { SIGHUP, SIGINT, SIGTERM, SIGUSR1 };
|
# include "base/kernel/Events.h"
|
||||||
#else
|
# include "base/kernel/events/SignalEvent.h"
|
||||||
static const int signums[xmrig::Signals::kSignalsCount] = { SIGHUP, SIGINT, SIGTERM };
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
xmrig::Signals::Signals(ISignalListener *listener)
|
#include <csignal>
|
||||||
: m_listener(listener)
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SIGUSR1
|
||||||
|
constexpr static const size_t kSignalsCount = 4;
|
||||||
|
constexpr static const int signums[kSignalsCount] = { SIGHUP, SIGINT, SIGTERM, SIGUSR1 };
|
||||||
|
#else
|
||||||
|
constexpr static const size_t kSignalsCount = 3;
|
||||||
|
constexpr static const int signums[kSignalsCount] = { SIGHUP, SIGINT, SIGTERM };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_EVENTS
|
||||||
|
static const char *signame(int signum)
|
||||||
|
{
|
||||||
|
switch (signum) {
|
||||||
|
case SIGHUP:
|
||||||
|
return "SIGHUP";
|
||||||
|
|
||||||
|
case SIGINT:
|
||||||
|
return "SIGINT";
|
||||||
|
|
||||||
|
case SIGTERM:
|
||||||
|
return "SIGTERM";
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class Signals::Private : public ISignalListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE(Private)
|
||||||
|
|
||||||
|
Private();
|
||||||
|
~Private() override;
|
||||||
|
|
||||||
|
ISignalListener *listener = nullptr;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void onSignal(int signum) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void onSignal(uv_signal_t *handle, int signum);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uv_signal_t *signals[kSignalsCount]{};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Signals::Signals() :
|
||||||
|
d(std::make_shared<Private>())
|
||||||
|
{
|
||||||
|
d->listener = d.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Signals::Signals(ISignalListener *listener) :
|
||||||
|
d(std::make_shared<Private>())
|
||||||
|
{
|
||||||
|
d->listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Signals::tag()
|
||||||
|
{
|
||||||
|
static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " signal ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Signals::Private::Private()
|
||||||
{
|
{
|
||||||
# ifndef XMRIG_OS_WIN
|
# ifndef XMRIG_OS_WIN
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
@ -42,47 +130,44 @@ xmrig::Signals::Signals(ISignalListener *listener)
|
||||||
auto signal = new uv_signal_t;
|
auto signal = new uv_signal_t;
|
||||||
signal->data = this;
|
signal->data = this;
|
||||||
|
|
||||||
m_signals[i] = signal;
|
signals[i] = signal;
|
||||||
|
|
||||||
uv_signal_init(uv_default_loop(), signal);
|
uv_signal_init(uv_default_loop(), signal);
|
||||||
uv_signal_start(signal, Signals::onSignal, signums[i]);
|
uv_signal_start(signal, onSignal, signums[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::Signals::~Signals()
|
xmrig::Signals::Private::~Private()
|
||||||
{
|
{
|
||||||
for (auto signal : m_signals) {
|
for (auto signal : signals) {
|
||||||
Handle::close(signal);
|
Handle::close(signal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Signals::onSignal(uv_signal_t *handle, int signum)
|
void xmrig::Signals::Private::onSignal(int signum)
|
||||||
{
|
{
|
||||||
|
# ifdef XMRIG_FEATURE_EVENTS
|
||||||
|
Process::events().send<SignalEvent>(signum);
|
||||||
|
|
||||||
switch (signum)
|
switch (signum)
|
||||||
{
|
{
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
LOG_WARN("%s " YELLOW("SIGHUP received, exiting"), Tags::signal());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
LOG_WARN("%s " YELLOW("SIGTERM received, exiting"), Tags::signal());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
LOG_WARN("%s " YELLOW("SIGINT received, exiting"), Tags::signal());
|
LOG_WARN("%s " YELLOW_BOLD("%s ") YELLOW("received, exiting"), tag(), signame(signum));
|
||||||
|
Process::exit(128 + signum);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
# ifdef SIGUSR1
|
|
||||||
case SIGUSR1:
|
|
||||||
LOG_V5("%s " WHITE_BOLD("SIGUSR1 received"), Tags::signal());
|
|
||||||
break;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
static_cast<Signals *>(handle->data)->m_listener->onSignal(signum);
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::Signals::Private::onSignal(uv_signal_t *handle, int signum)
|
||||||
|
{
|
||||||
|
static_cast<Private *>(handle->data)->listener->onSignal(signum);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2020 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2022 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2022 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -14,6 +14,13 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional permission under GNU GPL version 3 section 7
|
||||||
|
*
|
||||||
|
* If you modify this Program, or any covered work, by linking or combining
|
||||||
|
* it with OpenSSL (or a modified version of that library), containing parts
|
||||||
|
* covered by the terms of OpenSSL License and SSLeay License, the licensors
|
||||||
|
* of this Program grant you additional permission to convey the resulting work.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_SIGNALS_H
|
#ifndef XMRIG_SIGNALS_H
|
||||||
|
@ -23,13 +30,6 @@
|
||||||
#include "base/tools/Object.h"
|
#include "base/tools/Object.h"
|
||||||
|
|
||||||
|
|
||||||
#include <csignal>
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
|
|
||||||
using uv_signal_t = struct uv_signal_s;
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,28 +39,20 @@ class ISignalListener;
|
||||||
class Signals
|
class Signals
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
XMRIG_DISABLE_COPY_MOVE_DEFAULT(Signals)
|
XMRIG_DISABLE_COPY_MOVE(Signals)
|
||||||
|
|
||||||
# ifdef SIGUSR1
|
Signals();
|
||||||
constexpr static const size_t kSignalsCount = 4;
|
explicit Signals(ISignalListener *listener);
|
||||||
# else
|
~Signals() = default;
|
||||||
constexpr static const size_t kSignalsCount = 3;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
Signals(ISignalListener *listener);
|
static const char *tag();
|
||||||
~Signals();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void close(int signum);
|
XMRIG_DECL_PRIVATE()
|
||||||
|
|
||||||
static void onSignal(uv_signal_t *handle, int signum);
|
|
||||||
|
|
||||||
ISignalListener *m_listener;
|
|
||||||
uv_signal_t *m_signals[kSignalsCount]{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_SIGNALS_H */
|
#endif // XMRIG_SIGNALS_H
|
||||||
|
|
Loading…
Reference in a new issue