Added classes Process and Arguments.

This commit is contained in:
XMRig 2019-02-15 05:42:46 +07:00
parent 0450c31449
commit f4d2dec628
18 changed files with 373 additions and 82 deletions

View file

@ -24,6 +24,8 @@ set(HEADERS
src/base/io/Watcher.h
src/base/kernel/interfaces/IConfigListener.h
src/base/kernel/interfaces/IWatcherListener.h
src/base/kernel/Process.h
src/base/tools/Arguments.h
src/base/tools/Handle.h
src/base/tools/String.h
src/common/config/CommonConfig.h
@ -104,6 +106,8 @@ set(SOURCES
src/App.cpp
src/base/io/Json.cpp
src/base/io/Watcher.cpp
src/base/kernel/Process.cpp
src/base/tools/Arguments.cpp
src/base/tools/Handle.cpp
src/base/tools/String.cpp
src/common/config/CommonConfig.cpp

View file

@ -5,7 +5,9 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2018 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -47,18 +49,18 @@
#endif
App *App::m_self = nullptr;
xmrig::App *xmrig::App::m_self = nullptr;
App::App(int argc, char **argv) :
xmrig::App::App(Process *process) :
m_console(nullptr),
m_httpd(nullptr)
{
m_self = this;
m_controller = new xmrig::Controller();
if (m_controller->init(argc, argv) != 0) {
m_controller = new xmrig::Controller(process);
if (m_controller->init() != 0) {
return;
}
@ -72,7 +74,7 @@ App::App(int argc, char **argv) :
}
App::~App()
xmrig::App::~App()
{
uv_tty_reset_mode();
@ -85,7 +87,7 @@ App::~App()
}
int App::exec()
int xmrig::App::exec()
{
if (m_controller->isDone()) {
return 0;
@ -139,7 +141,7 @@ int App::exec()
}
void App::onConsoleCommand(char command)
void xmrig::App::onConsoleCommand(char command)
{
switch (command) {
case 'h':
@ -174,7 +176,7 @@ void App::onConsoleCommand(char command)
}
void App::close()
void xmrig::App::close()
{
m_controller->network()->stop();
Workers::stop();
@ -183,12 +185,12 @@ void App::close()
}
void App::release()
void xmrig::App::release()
{
}
void App::onSignal(uv_signal_t *handle, int signum)
void xmrig::App::onSignal(uv_signal_t *handle, int signum)
{
switch (signum)
{

View file

@ -5,7 +5,9 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -21,8 +23,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __APP_H__
#define __APP_H__
#ifndef XMRIG_APP_H
#define XMRIG_APP_H
#include <uv.h>
@ -34,19 +36,20 @@
class Console;
class Httpd;
class Network;
class Options;
namespace xmrig {
class Controller;
}
class Controller;
class Process;
class App : public IConsoleListener
{
public:
App(int argc, char **argv);
~App();
App(Process *process);
~App() override;
int exec();
@ -71,4 +74,7 @@ private:
};
#endif /* __APP_H__ */
} /* namespace xmrig */
#endif /* XMRIG_APP_H */

View file

@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -34,7 +35,7 @@
#include "core/Controller.h"
void App::background()
void xmrig::App::background()
{
signal(SIGPIPE, SIG_IGN);

View file

@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -31,7 +32,7 @@
#include "core/Config.h"
void App::background()
void xmrig::App::background()
{
if (!m_controller->config()->isBackground()) {
return;

101
src/base/kernel/Process.cpp Normal file
View file

@ -0,0 +1,101 @@
/* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <uv.h>
#include <time.h>
#include "base/kernel/Process.h"
static size_t location(xmrig::Process::Location location, char *buf, size_t max)
{
using namespace xmrig;
size_t size = max;
if (location == Process::ExeLocation) {
return uv_exepath(buf, &size) < 0 ? 0 : size;
}
if (location == Process::CwdLocation) {
return uv_cwd(buf, &size) < 0 ? 0 : size;
}
return 0;
}
xmrig::Process::Process(int argc, char **argv) :
m_arguments(argc, argv)
{
srand(static_cast<unsigned int>(static_cast<uintptr_t>(time(nullptr)) ^ reinterpret_cast<uintptr_t>(this)));
}
xmrig::Process::~Process()
{
}
xmrig::String xmrig::Process::location(Location location, const char *fileName) const
{
constexpr const size_t max = 520;
char *buf = new char[max]();
size_t size = ::location(location, buf, max);
if (size == 0) {
delete [] buf;
return String();
}
if (fileName == nullptr) {
return buf;
}
if (location == ExeLocation) {
char *p = strrchr(buf, kDirSeparator);
if (p == nullptr) {
delete [] buf;
return String();
}
size = static_cast<size_t>(p - buf);
}
if ((size + strlen(fileName) + 2) >= max) {
delete [] buf;
return String();
}
buf[size] = kDirSeparator;
strcpy(buf + size + 1, fileName);
return buf;
}

64
src/base/kernel/Process.h Normal file
View file

@ -0,0 +1,64 @@
/* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef XMRIG_PROCESS_H
#define XMRIG_PROCESS_H
#include "base/tools/Arguments.h"
namespace xmrig {
class Process
{
public:
enum Location {
ExeLocation,
CwdLocation
};
# ifdef WIN32
constexpr const static char kDirSeparator = '\\';
# else
constexpr const static char kDirSeparator = '/';
# endif
Process(int argc, char **argv);
~Process();
String location(Location location, const char *fileName = nullptr) const;
inline const Arguments &arguments() const { return m_arguments; }
private:
Arguments m_arguments;
};
} /* namespace xmrig */
#endif /* XMRIG_PROCESS_H */

View file

@ -0,0 +1,76 @@
/* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <algorithm>
#include <uv.h>
#include "base/tools/Arguments.h"
xmrig::Arguments::Arguments(int argc, char **argv) :
m_argv(argv),
m_argc(argc)
{
uv_setup_args(argc, argv);
for (size_t i = 0; i < static_cast<size_t>(argc); ++i) {
add(argv[i]);
}
}
bool xmrig::Arguments::hasArg(const char *name) const
{
if (m_argc == 1) {
return false;
}
return std::find(m_data.begin() + 1, m_data.end(), name) != m_data.end();
}
void xmrig::Arguments::add(const char *arg)
{
if (arg == nullptr) {
return;
}
const size_t size = strlen(arg);
if (size > 4 && arg[0] == '-' && arg[1] == '-') {
const char *p = strstr(arg, "=");
if (p) {
const size_t keySize = static_cast<size_t>(p - arg);
m_data.push_back(String(arg, keySize));
m_data.push_back(arg + keySize + 1);
return;
}
}
m_data.push_back(arg);
}

View file

@ -0,0 +1,61 @@
/* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef XMRIG_ARGUMENTS_H
#define XMRIG_ARGUMENTS_H
#include <vector>
#include "base/tools/String.h"
namespace xmrig {
class Arguments
{
public:
Arguments(int argc, char **argv);
bool hasArg(const char *name) const;
inline char **argv() const { return m_argv; }
inline const std::vector<String> &data() const { return m_data; }
inline int argc() const { return m_argc; }
private:
void add(const char *arg);
char **m_argv;
int m_argc;
std::vector<String> m_data;
};
} /* namespace xmrig */
#endif /* XMRIG_ARGUMENTS_H */

View file

@ -5,8 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -36,40 +36,9 @@
#include "Platform.h"
char Platform::m_defaultConfigName[520] = { 0 };
xmrig::String Platform::m_userAgent;
const char *Platform::defaultConfigName()
{
size_t size = 520;
if (*m_defaultConfigName) {
return m_defaultConfigName;
}
if (uv_exepath(m_defaultConfigName, &size) < 0) {
return nullptr;
}
if (size < 500) {
# ifdef WIN32
char *p = strrchr(m_defaultConfigName, '\\');
# else
char *p = strrchr(m_defaultConfigName, '/');
# endif
if (p) {
strcpy(p + 1, "config.json");
return m_defaultConfigName;
}
}
*m_defaultConfigName = '\0';
return nullptr;
}
void Platform::init(const char *userAgent)
{
# ifndef XMRIG_NO_TLS

View file

@ -5,8 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -36,19 +36,17 @@ class Platform
{
public:
static bool setThreadAffinity(uint64_t cpu_id);
static const char *defaultConfigName();
static uint32_t setTimerResolution(uint32_t resolution);
static void init(const char *userAgent);
static void restoreTimerResolution();
static void setProcessPriority(int priority);
static void setThreadPriority(int priority);
static inline const char *userAgent() { return m_userAgent.data(); }
static inline const char *userAgent() { return m_userAgent; }
private:
static char *createUserAgent();
static char m_defaultConfigName[520];
static xmrig::String m_userAgent;
};

View file

@ -40,6 +40,7 @@
#include "base/io/Json.h"
#include "base/kernel/interfaces/IConfigListener.h"
#include "base/kernel/Process.h"
#include "common/config/ConfigLoader.h"
#include "common/config/ConfigWatcher.h"
#include "common/interfaces/IConfig.h"
@ -144,13 +145,15 @@ bool xmrig::ConfigLoader::reload(xmrig::IConfig *oldConfig, const char *json)
}
xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator *creator, IConfigListener *listener)
xmrig::IConfig *xmrig::ConfigLoader::load(Process *process, IConfigCreator *creator, IConfigListener *listener)
{
m_creator = creator;
m_listener = listener;
xmrig::IConfig *config = m_creator->create();
int key;
int argc = process->arguments().argc();
char **argv = process->arguments().argv();
while (1) {
key = getopt_long(argc, argv, short_options, options, nullptr);
@ -174,7 +177,7 @@ xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator
delete config;
config = m_creator->create();
loadFromFile(config, Platform::defaultConfigName());
loadFromFile(config, process->location(Process::ExeLocation, "config.json"));
}
if (!config->finalize()) {

View file

@ -42,6 +42,7 @@ class ConfigWatcher;
class IConfigCreator;
class IConfigListener;
class IConfig;
class Process;
class ConfigLoader
@ -51,7 +52,7 @@ public:
static bool loadFromJSON(IConfig *config, const char *json);
static bool loadFromJSON(IConfig *config, const rapidjson::Document &doc);
static bool reload(IConfig *oldConfig, const char *json);
static IConfig *load(int argc, char **argv, IConfigCreator *creator, IConfigListener *listener);
static IConfig *load(Process *process, IConfigCreator *creator, IConfigListener *listener);
static void release();
static inline bool isDone() { return m_done; }

View file

@ -139,9 +139,9 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const
}
xmrig::Config *xmrig::Config::load(int argc, char **argv, IConfigListener *listener)
xmrig::Config *xmrig::Config::load(Process *process, IConfigListener *listener)
{
return static_cast<Config*>(ConfigLoader::load(argc, argv, new ConfigCreator(), listener));
return static_cast<Config*>(ConfigLoader::load(process, new ConfigCreator(), listener));
}

View file

@ -35,16 +35,13 @@
#include "workers/CpuThread.h"
class Addr;
class Url;
namespace xmrig {
class ConfigLoader;
class IThread;
class IConfigListener;
class Process;
/**
@ -85,7 +82,7 @@ public:
inline int64_t affinity() const { return m_threads.mask; }
inline ThreadsMode threadsMode() const { return m_threads.mode; }
static Config *load(int argc, char **argv, IConfigListener *listener);
static Config *load(Process *process, IConfigListener *listener);
protected:
bool finalize() override;

View file

@ -46,8 +46,9 @@
class xmrig::ControllerPrivate
{
public:
inline ControllerPrivate() :
inline ControllerPrivate(Process *process) :
network(nullptr),
process(process),
config(nullptr)
{}
@ -60,13 +61,14 @@ public:
Network *network;
Process *process;
std::vector<xmrig::IControllerListener *> listeners;
xmrig::Config *config;
};
xmrig::Controller::Controller()
: d_ptr(new ControllerPrivate())
xmrig::Controller::Controller(Process *process)
: d_ptr(new ControllerPrivate(process))
{
}
@ -99,11 +101,11 @@ xmrig::Config *xmrig::Controller::config() const
}
int xmrig::Controller::init(int argc, char **argv)
int xmrig::Controller::init()
{
Cpu::init();
d_ptr->config = xmrig::Config::load(argc, argv, this);
d_ptr->config = xmrig::Config::load(d_ptr->process, this);
if (!d_ptr->config) {
return 1;
}

View file

@ -39,18 +39,19 @@ namespace xmrig {
class Config;
class ControllerPrivate;
class IControllerListener;
class Process;
class Controller : public IConfigListener
{
public:
Controller();
Controller(Process *process);
~Controller() override;
bool isDone() const;
bool isReady() const;
Config *config() const;
int init(int argc, char **argv);
int init();
Network *network() const;
void addListener(IControllerListener *listener);

View file

@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com>
*
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
* 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
@ -22,10 +23,13 @@
*/
#include "App.h"
#include "base/kernel/Process.h"
int main(int argc, char **argv) {
App app(argc, argv);
xmrig::Process process(argc, argv);
xmrig::App app(&process);
return app.exec();
}