diff --git a/src/backend/cpu/Cpu.cpp b/src/backend/cpu/Cpu.cpp index 4d9effce..5d095e68 100644 --- a/src/backend/cpu/Cpu.cpp +++ b/src/backend/cpu/Cpu.cpp @@ -23,7 +23,7 @@ */ -#include +#include #include "backend/cpu/Cpu.h" @@ -44,7 +44,15 @@ static xmrig::ICpuInfo *cpuInfo = nullptr; xmrig::ICpuInfo *xmrig::Cpu::info() { - assert(cpuInfo != nullptr); + if (cpuInfo == nullptr) { +# if defined(XMRIG_FEATURE_HWLOC) + cpuInfo = new HwlocCpuInfo(); +# elif defined(XMRIG_FEATURE_LIBCPUID) + cpuInfo = new AdvancedCpuInfo(); +# else + cpuInfo = new BasicCpuInfo(); +# endif + } return cpuInfo; } @@ -62,7 +70,7 @@ rapidjson::Value xmrig::Cpu::toJSON(rapidjson::Document &doc) cpu.AddMember("brand", StringRef(i->brand()), allocator); cpu.AddMember("aes", i->hasAES(), allocator); cpu.AddMember("avx2", i->hasAVX2(), allocator); - cpu.AddMember("x64", i->isX64(), allocator); + cpu.AddMember("x64", ICpuInfo::isX64(), allocator); cpu.AddMember("l2", static_cast(i->L2()), allocator); cpu.AddMember("l3", static_cast(i->L3()), allocator); cpu.AddMember("cores", static_cast(i->cores()), allocator); @@ -81,20 +89,6 @@ rapidjson::Value xmrig::Cpu::toJSON(rapidjson::Document &doc) } -void xmrig::Cpu::init() -{ - assert(cpuInfo == nullptr); - -# if defined(XMRIG_FEATURE_HWLOC) - cpuInfo = new HwlocCpuInfo(); -# elif defined(XMRIG_FEATURE_LIBCPUID) - cpuInfo = new AdvancedCpuInfo(); -# else - cpuInfo = new BasicCpuInfo(); -# endif -} - - void xmrig::Cpu::release() { assert(cpuInfo != nullptr); diff --git a/src/backend/cpu/Cpu.h b/src/backend/cpu/Cpu.h index bece97d3..a8dd1f3a 100644 --- a/src/backend/cpu/Cpu.h +++ b/src/backend/cpu/Cpu.h @@ -37,7 +37,6 @@ class Cpu public: static ICpuInfo *info(); static rapidjson::Value toJSON(rapidjson::Document &doc); - static void init(); static void release(); inline static Assembly::Id assembly(Assembly::Id hint) { return hint == Assembly::AUTO ? Cpu::info()->assembly() : hint; } diff --git a/src/base/kernel/Entry.cpp b/src/base/kernel/Entry.cpp index 605f8e20..1d1b7eb8 100644 --- a/src/base/kernel/Entry.cpp +++ b/src/base/kernel/Entry.cpp @@ -23,7 +23,7 @@ */ -#include +#include #include @@ -161,7 +161,7 @@ int xmrig::Entry::exec(const Process &process, Id id) { switch (id) { case Usage: - printf(usage); + printf("%s\n", usage().c_str()); return 0; case Version: diff --git a/src/base/kernel/config/BaseTransform.cpp b/src/base/kernel/config/BaseTransform.cpp index 12e7d848..a10960a4 100644 --- a/src/base/kernel/config/BaseTransform.cpp +++ b/src/base/kernel/config/BaseTransform.cpp @@ -23,7 +23,7 @@ */ -#include +#include #ifdef _MSC_VER @@ -50,12 +50,7 @@ static const char *kApi = "api"; static const char *kHttp = "http"; static const char *kPools = "pools"; -} - - -xmrig::BaseTransform::BaseTransform() -{ -} +} // namespace xmrig void xmrig::BaseTransform::load(JsonChain &chain, Process *process, IConfigTransform &transform) @@ -68,7 +63,7 @@ void xmrig::BaseTransform::load(JsonChain &chain, Process *process, IConfigTrans Document doc(kObjectType); - while (1) { + while (true) { key = getopt_long(argc, argv, short_options, options, nullptr); if (key < 0) { break; @@ -226,8 +221,10 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b case IConfig::TlsKey: /* --tls */ return add(doc, kPools, "tls", enable); +# ifdef XMRIG_FEATURE_HTTP case IConfig::DaemonKey: /* --daemon */ return add(doc, kPools, "daemon", enable); +# endif # ifndef XMRIG_PROXY_PROJECT case IConfig::NicehashKey: /* --nicehash */ @@ -273,8 +270,10 @@ void xmrig::BaseTransform::transformUint64(rapidjson::Document &doc, int key, ui case IConfig::PrintTimeKey: /* --print-time */ return set(doc, "print-time", arg); +# ifdef XMRIG_FEATURE_HTTP case IConfig::DaemonPollKey: /* --daemon-poll-interval */ return add(doc, kPools, "daemon-poll-interval", arg); +# endif default: break; diff --git a/src/base/kernel/config/BaseTransform.h b/src/base/kernel/config/BaseTransform.h index 02b28c12..5fa0c8c5 100644 --- a/src/base/kernel/config/BaseTransform.h +++ b/src/base/kernel/config/BaseTransform.h @@ -44,8 +44,6 @@ class Process; class BaseTransform : public IConfigTransform { public: - BaseTransform(); - static void load(JsonChain &chain, Process *process, IConfigTransform &transform); protected: diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h index 86b8067c..0569a3d1 100644 --- a/src/base/kernel/interfaces/IConfig.h +++ b/src/base/kernel/interfaces/IConfig.h @@ -78,6 +78,7 @@ public: PrintTimeKey = 1007, // xmrig cpu + CPUKey = 1024, AVKey = 'v', CPUAffinityKey = 1020, DryRunKey = 5000, diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 848396a7..80381e32 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -46,7 +46,6 @@ xmrig::Controller::~Controller() int xmrig::Controller::init() { - Cpu::init(); Base::init(); m_network = new Network(this); diff --git a/src/core/config/ConfigTransform.cpp b/src/core/config/ConfigTransform.cpp index ce0d324c..f11fe930 100644 --- a/src/core/config/ConfigTransform.cpp +++ b/src/core/config/ConfigTransform.cpp @@ -80,12 +80,7 @@ static inline bool isHwAes(uint64_t av) } -} - - -xmrig::ConfigTransform::ConfigTransform() : BaseTransform() -{ -} +} // namespace xmrig void xmrig::ConfigTransform::finalize(rapidjson::Document &doc) @@ -131,7 +126,7 @@ void xmrig::ConfigTransform::transform(rapidjson::Document &doc, int key, const return transformUint64(doc, key, p ? strtoull(p, nullptr, 16) : strtoull(arg, nullptr, 10)); } -# ifndef XMRIG_NO_ASM +# ifdef XMRIG_FEATURE_ASM case IConfig::AssemblyKey: /* --asm */ return set(doc, kCpu, "asm", arg); # endif diff --git a/src/core/config/ConfigTransform.h b/src/core/config/ConfigTransform.h index 440a7169..7ec3cdec 100644 --- a/src/core/config/ConfigTransform.h +++ b/src/core/config/ConfigTransform.h @@ -34,9 +34,6 @@ namespace xmrig { class ConfigTransform : public BaseTransform { -public: - ConfigTransform(); - protected: void finalize(rapidjson::Document &doc) override; void transform(rapidjson::Document &doc, int key, const char *arg) override; diff --git a/src/core/config/Config_platform.h b/src/core/config/Config_platform.h index b7415f4d..a10f3c16 100644 --- a/src/core/config/Config_platform.h +++ b/src/core/config/Config_platform.h @@ -45,6 +45,7 @@ static const char short_options[] = "a:c:kBp:Px:r:R:s:t:T:o:u:O:v:l:S"; static const option options[] = { { "algo", 1, nullptr, IConfig::AlgorithmKey }, +# ifdef XMRIG_FEATURE_HTTP { "api-worker-id", 1, nullptr, IConfig::ApiWorkerIdKey }, { "api-id", 1, nullptr, IConfig::ApiIdKey }, { "http-enabled", 0, nullptr, IConfig::HttpEnabledKey }, @@ -52,6 +53,9 @@ static const option options[] = { { "http-access-token", 1, nullptr, IConfig::HttpAccessTokenKey }, { "http-port", 1, nullptr, IConfig::HttpPort }, { "http-no-restricted", 0, nullptr, IConfig::HttpRestrictedKey }, + { "daemon", 0, nullptr, IConfig::DaemonKey }, + { "daemon-poll-interval", 1, nullptr, IConfig::DaemonPollKey }, +# endif { "av", 1, nullptr, IConfig::AVKey }, { "background", 0, nullptr, IConfig::BackgroundKey }, { "config", 1, nullptr, IConfig::ConfigKey }, @@ -76,13 +80,17 @@ static const option options[] = { { "user-agent", 1, nullptr, IConfig::UserAgentKey }, { "userpass", 1, nullptr, IConfig::UserpassKey }, { "rig-id", 1, nullptr, IConfig::RigIdKey }, +# ifdef XMRIG_FEATURE_TLS { "tls", 0, nullptr, IConfig::TlsKey }, { "tls-fingerprint", 1, nullptr, IConfig::FingerprintKey }, +# endif +# ifdef XMRIG_FEATURE_ASM { "asm", 1, nullptr, IConfig::AssemblyKey }, - { "daemon", 0, nullptr, IConfig::DaemonKey }, - { "daemon-poll-interval", 1, nullptr, IConfig::DaemonPollKey }, +# endif +# ifdef XMRIG_ALGO_RANDOMX { "randomx-init", 1, nullptr, IConfig::RandomXInitKey }, { "randomx-no-numa", 0, nullptr, IConfig::RandomXNumaKey }, +# endif { nullptr, 0, nullptr, 0 } }; diff --git a/src/core/config/usage.h b/src/core/config/usage.h index b41ec6db..34998bce 100644 --- a/src/core/config/usage.h +++ b/src/core/config/usage.h @@ -29,99 +29,95 @@ #include "version.h" +#include + + namespace xmrig { -static char const usage[] = "\ -Usage: " APP_ID " [OPTIONS]\n\ -Options:\n\ - -a, --algo=ALGO specify the algorithm to use\n\ - cn/r, cn/2, cn/1, cn/0, cn/double, cn/half, cn/fast,\n\ - cn/rwz, cn/zls, cn/xao, cn/rto" -#ifdef XMRIG_ALGO_CN_GPU -", cn/gpu,\n" -#else -",\n" -#endif -#ifdef XMRIG_ALGO_CN_LITE -"\ - cn-lite/1,\n" -#endif -#ifdef XMRIG_ALGO_CN_HEAVY -"\ - cn-heavy/xhv, cn-heavy/tube, cn-heavy/0,\n" -#endif -#ifdef XMRIG_ALGO_CN_PICO -"\ - cn-pico,\n" -#endif -#ifdef XMRIG_ALGO_RANDOMX -"\ - rx/wow, rx/loki\n" -#endif -"\ - -o, --url=URL URL of mining server\n\ - -O, --userpass=U:P username:password pair for mining server\n\ - -u, --user=USERNAME username for mining server\n\ - -p, --pass=PASSWORD password for mining server\n\ - --rig-id=ID rig identifier for pool-side statistics (needs pool support)\n\ - -t, --threads=N number of miner threads\n\ - -v, --av=N algorithm variation, 0 auto select\n\ - -k, --keepalive send keepalived packet for prevent timeout (needs pool support)\n\ - --nicehash enable nicehash.com support\n" -#ifdef XMRIG_FEATURE_TLS -"\ - --tls enable SSL/TLS support (needs pool support)\n\ - --tls-fingerprint=F pool TLS certificate fingerprint, if set enable strict certificate pinning\n" -#endif -#ifdef XMRIG_FEATURE_HTTP -"\ - --daemon use daemon RPC instead of pool for solo mining\n\ - --daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)\n" -#endif -"\ - -r, --retries=N number of times to retry before switch to backup server (default: 5)\n\ - -R, --retry-pause=N time to pause between retries (default: 5)\n\ - --cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1\n\ - --cpu-priority set process priority (0 idle, 2 normal to 5 highest)\n\ - --no-huge-pages disable huge pages support\n\ - --no-color disable colored output\n\ - --donate-level=N donate level, default 5%% (5 minutes in 100 minutes)\n\ - --user-agent set custom user-agent string for pool\n\ - -B, --background run the miner in the background\n\ - -c, --config=FILE load a JSON-format configuration file\n\ - -l, --log-file=FILE log all output to a file\n" -# ifdef HAVE_SYSLOG_H -"\ - -S, --syslog use system log for output messages\n" -# endif -"\ - --asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer.\n\ - --print-time=N print hashrate report every N seconds\n" -#ifdef XMRIG_FEATURE_HTTP -"\ - --api-worker-id=ID custom worker-id for API\n\ - --api-id=ID custom instance ID for API\n\ - --http-enabled enable HTTP API\n\ - --http-host=HOST bind host for HTTP API (default: 127.0.0.1)\n\ - --http-port=N bind port for HTTP API\n\ - --http-access-token=T access token for HTTP API\n\ - --http-no-restricted enable full remote access to HTTP API (only if access token set)\n" -#endif -#ifdef XMRIG_ALGO_RANDOMX -"\ - --randomx-init=N threads count to initialize RandomX dataset\n\ - --randomx-no-numa disable NUMA support for RandomX\n" -#endif -#ifdef XMRIG_FEATURE_HWLOC -"\ - --export-topology export hwloc topology to a XML file and exit\n" -#endif -"\ - --dry-run test configuration and exit\n\ - -h, --help display this help and exit\n\ - -V, --version output version information and exit\n\ -"; +static inline const std::string &usage() +{ + static std::string u; + + if (!u.empty()) { + return u; + } + + u += "Usage: " APP_ID " [OPTIONS]\n\nNetwork:\n"; + u += " -o, --url=URL URL of mining server\n"; + u += " -a, --algo=ALGO mining algorithm https://xmrig.com/docs/algorithms\n"; + u += " -u, --user=USERNAME username for mining server\n"; + u += " -p, --pass=PASSWORD password for mining server\n"; + u += " -O, --userpass=U:P username:password pair for mining server\n"; + u += " -k, --keepalive send keepalived packet for prevent timeout (needs pool support)\n"; + u += " --nicehash enable nicehash.com support\n"; + u += " --rig-id=ID rig identifier for pool-side statistics (needs pool support)\n"; + +# ifdef XMRIG_FEATURE_TLS + u += " --tls enable SSL/TLS support (needs pool support)\n"; + u += " --tls-fingerprint=HEX pool TLS certificate fingerprint for strict certificate pinning\n"; +# endif + +# ifdef XMRIG_FEATURE_HTTP + u += " --daemon use daemon RPC instead of pool for solo mining\n"; + u += " --daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)\n"; +# endif + + u += " -r, --retries=N number of times to retry before switch to backup server (default: 5)\n"; + u += " -R, --retry-pause=N time to pause between retries (default: 5)\n"; + u += " --user-agent set custom user-agent string for pool\n"; + u += " --donate-level=N donate level, default 5%% (5 minutes in 100 minutes)\n"; + u += " --donate-over-proxy=N control donate over xmrig-proxy feature\n"; + + u += "\nCPU backend:\n"; + + u += " -t, --threads=N number of CPU threads\n"; + u += " -v, --av=N algorithm variation, 0 auto select\n"; + u += " --cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1\n"; + u += " --cpu-priority set process priority (0 idle, 2 normal to 5 highest)\n"; + u += " --no-huge-pages disable huge pages support\n"; + u += " --asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer\n"; + +# ifdef XMRIG_ALGO_RANDOMX + u += " --randomx-init=N threads count to initialize RandomX dataset\n"; + u += " --randomx-no-numa disable NUMA support for RandomX\n"; +# endif + +# ifdef XMRIG_FEATURE_HTTP + u += "\nAPI:\n"; + u += " --api-worker-id=ID custom worker-id for API\n"; + u += " --api-id=ID custom instance ID for API\n"; + u += " --http-enabled enable HTTP API\n"; + u += " --http-host=HOST bind host for HTTP API (default: 127.0.0.1)\n"; + u += " --http-port=N bind port for HTTP API\n"; + u += " --http-access-token=T access token for HTTP API\n"; + u += " --http-no-restricted enable full remote access to HTTP API (only if access token set)\n"; +# endif + + u += "\nLogging:\n"; + +# ifdef HAVE_SYSLOG_H + u += " -S, --syslog use system log for output messages\n"; +# endif + + u += " -l, --log-file=FILE log all output to a file\n"; + u += " --print-time=N print hashrate report every N seconds\n"; + u += " --no-color disable colored output\n"; + + u += "\nMisc:\n"; + + u += " -c, --config=FILE load a JSON-format configuration file\n"; + u += " -B, --background run the miner in the background\n"; + u += " -V, --version output version information and exit\n"; + u += " -h, --help display this help and exit\n"; + u += " --dry-run test configuration and exit\n"; + +# ifdef XMRIG_FEATURE_HWLOC + u += " --export-topology export hwloc topology to a XML file and exit\n"; +# endif + + return u; +} } /* namespace xmrig */