From f9f04e4b2eca85d93c6ad0c0a4367196aa0877e0 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 13 Aug 2019 02:38:10 +0700 Subject: [PATCH] More flexible API handling for mining backends. --- src/backend/common/interfaces/IBackend.h | 2 + src/backend/cpu/CpuBackend.cpp | 72 +++++++++++++++--------- src/backend/cpu/CpuBackend.h | 3 +- src/core/Miner.cpp | 25 ++------ 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/backend/common/interfaces/IBackend.h b/src/backend/common/interfaces/IBackend.h index 2ec8bf04..91f3e634 100644 --- a/src/backend/common/interfaces/IBackend.h +++ b/src/backend/common/interfaces/IBackend.h @@ -37,6 +37,7 @@ namespace xmrig { class Algorithm; class Hashrate; +class IApiRequest; class IWorker; class Job; class String; @@ -61,6 +62,7 @@ public: # ifdef XMRIG_FEATURE_API virtual rapidjson::Value toJSON(rapidjson::Document &doc) const = 0; + virtual void handleRequest(IApiRequest &request) = 0; # endif }; diff --git a/src/backend/cpu/CpuBackend.cpp b/src/backend/cpu/CpuBackend.cpp index 77baeaf6..d8aaa2b1 100644 --- a/src/backend/cpu/CpuBackend.cpp +++ b/src/backend/cpu/CpuBackend.cpp @@ -43,6 +43,11 @@ #include "rapidjson/document.h" +#ifdef XMRIG_FEATURE_API +# include "base/api/interfaces/IApiRequest.h" +#endif + + namespace xmrig { @@ -117,6 +122,38 @@ public: } + rapidjson::Value hugePages(int version, rapidjson::Document &doc) + { + std::pair pages(0, 0); + + # ifdef XMRIG_ALGO_RANDOMX + if (algo.family() == Algorithm::RANDOM_X) { + pages = Rx::hugePages(); + } + # endif + + mutex.lock(); + + pages.first += status.hugePages; + pages.second += status.pages; + + mutex.unlock(); + + rapidjson::Value hugepages; + + if (version > 1) { + hugepages.SetArray(); + hugepages.PushBack(pages.first, doc.GetAllocator()); + hugepages.PushBack(pages.second, doc.GetAllocator()); + } + else { + hugepages = pages.first == pages.second; + } + + return hugepages; + } + + Algorithm algo; Controller *controller; LaunchStatus status; @@ -143,25 +180,6 @@ xmrig::CpuBackend::~CpuBackend() } -std::pair xmrig::CpuBackend::hugePages() const -{ - std::pair pages(0, 0); - -# ifdef XMRIG_ALGO_RANDOMX - if (d_ptr->algo.family() == Algorithm::RANDOM_X) { - pages = Rx::hugePages(); - } -# endif - - std::lock_guard lock(d_ptr->mutex); - - pages.first += d_ptr->status.hugePages; - pages.second += d_ptr->status.pages; - - return pages; -} - - bool xmrig::CpuBackend::isEnabled() const { return d_ptr->controller->config()->cpu().isEnabled(); @@ -319,13 +337,7 @@ rapidjson::Value xmrig::CpuBackend::toJSON(rapidjson::Document &doc) const out.AddMember("asm", false, allocator); # endif - const auto pages = hugePages(); - - rapidjson::Value hugepages(rapidjson::kArrayType); - hugepages.PushBack(pages.first, allocator); - hugepages.PushBack(pages.second, allocator); - - out.AddMember("hugepages", hugepages, allocator); + out.AddMember("hugepages", d_ptr->hugePages(2, doc), allocator); out.AddMember("memory", static_cast(d_ptr->algo.isValid() ? (d_ptr->ways() * d_ptr->algo.l3()) : 0), allocator); if (d_ptr->threads.empty() || !hashrate()) { @@ -357,4 +369,12 @@ rapidjson::Value xmrig::CpuBackend::toJSON(rapidjson::Document &doc) const return out; } + + +void xmrig::CpuBackend::handleRequest(IApiRequest &request) +{ + if (request.type() == IApiRequest::REQ_SUMMARY) { + request.reply().AddMember("hugepages", d_ptr->hugePages(request.version(), request.doc()), request.doc().GetAllocator()); + } +} #endif diff --git a/src/backend/cpu/CpuBackend.h b/src/backend/cpu/CpuBackend.h index 2b907840..9d6d85ac 100644 --- a/src/backend/cpu/CpuBackend.h +++ b/src/backend/cpu/CpuBackend.h @@ -46,8 +46,6 @@ public: CpuBackend(Controller *controller); ~CpuBackend() override; - std::pair hugePages() const; - protected: bool isEnabled() const override; bool isEnabled(const Algorithm &algorithm) const override; @@ -63,6 +61,7 @@ protected: # ifdef XMRIG_FEATURE_API rapidjson::Value toJSON(rapidjson::Document &doc) const override; + void handleRequest(IApiRequest &request) override; # endif private: diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 26a5d7e7..84bce1f9 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -135,7 +135,7 @@ public: # ifdef XMRIG_FEATURE_API - void getMiner(rapidjson::Value &reply, rapidjson::Document &doc, int version) const + void getMiner(rapidjson::Value &reply, rapidjson::Document &doc, int) const { using namespace rapidjson; auto &allocator = doc.GetAllocator(); @@ -144,25 +144,6 @@ public: reply.AddMember("kind", APP_KIND, allocator); reply.AddMember("ua", StringRef(Platform::userAgent()), allocator); reply.AddMember("cpu", Cpu::toJSON(doc), allocator); - - Value hugepages; - - if (!backends.empty() && backends.front()->type() == "cpu") { - const auto pages = static_cast(backends.front())->hugePages(); - if (version > 1) { - hugepages.SetArray(); - hugepages.PushBack(pages.first, allocator); - hugepages.PushBack(pages.second, allocator); - } - else { - hugepages = pages.first == pages.second; - } - } - else { - hugepages = false; - } - - reply.AddMember("hugepages", hugepages, allocator); reply.AddMember("donate_level", controller->config()->pools().donateLevel(), allocator); Value algo(kArrayType); @@ -489,5 +470,9 @@ void xmrig::Miner::onRequest(IApiRequest &request) setEnabled(true); } } + + for (IBackend *backend : d_ptr->backends) { + backend->handleRequest(request); + } } #endif