/* XMRig * Copyright (c) 2018 Lee Clagett * Copyright (c) 2018-2019 tevador * Copyright (c) 2018-2021 SChernykh * Copyright (c) 2016-2021 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_RX_QUEUE_H #define XMRIG_RX_QUEUE_H #include "base/kernel/interfaces/IAsyncListener.h" #include "base/tools/Object.h" #include "crypto/common/HugePagesInfo.h" #include "crypto/rx/RxConfig.h" #include "crypto/rx/RxSeed.h" #include #include #include namespace xmrig { class IRxListener; class IRxStorage; class RxDataset; class RxQueueItem { public: RxQueueItem(const RxSeed &seed, const std::vector &nodeset, uint32_t threads, bool hugePages, bool oneGbPages, RxConfig::Mode mode, int priority) : hugePages(hugePages), oneGbPages(oneGbPages), priority(priority), mode(mode), seed(seed), nodeset(nodeset), threads(threads) {} const bool hugePages; const bool oneGbPages; const int priority; const RxConfig::Mode mode; const RxSeed seed; const std::vector nodeset; const uint32_t threads; }; class RxQueue : public IAsyncListener { public: XMRIG_DISABLE_COPY_MOVE(RxQueue); RxQueue(IRxListener *listener); ~RxQueue() override; HugePagesInfo hugePages(); RxDataset *dataset(const Job &job, uint32_t nodeId); template bool isReady(const T &seed); void enqueue(const RxSeed &seed, const std::vector &nodeset, uint32_t threads, bool hugePages, bool oneGbPages, RxConfig::Mode mode, int priority); protected: inline void onAsync() override { onReady(); } private: enum State { STATE_IDLE, STATE_PENDING, STATE_SHUTDOWN }; template bool isReadyUnsafe(const T &seed) const; void backgroundInit(); void onReady(); IRxListener *m_listener = nullptr; IRxStorage *m_storage = nullptr; RxSeed m_seed; State m_state = STATE_IDLE; std::condition_variable m_cv; std::mutex m_mutex; std::shared_ptr m_async; std::thread m_thread; std::vector m_queue; }; } /* namespace xmrig */ #endif /* XMRIG_RX_QUEUE_H */