diff --git a/CMakeLists.txt b/CMakeLists.txt index e91fae3c..801b33bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ set(HEADERS src/workers/Handle.h src/workers/SingleWorker.h src/workers/Worker.h + src/workers/Workers.h src/version.h ) @@ -50,6 +51,7 @@ set(SOURCES src/workers/Handle.cpp src/workers/SingleWorker.cpp src/workers/Worker.cpp + src/workers/Workers.cpp src/xmrig.cpp ) @@ -95,7 +97,7 @@ endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -Wall -fno-exceptions") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes -Wall -fno-exceptions") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes -Wall -fno-exceptions -fno-rtti") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -s -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2") #set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -gdwarf-2") #set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fprofile-generate") diff --git a/src/App.cpp b/src/App.cpp index 943690ec..1a4f6d06 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -35,8 +35,7 @@ #include "Options.h" #include "Summary.h" #include "version.h" -#include "workers/Handle.h" -#include "workers/SingleWorker.h" +#include "workers/Workers.h" @@ -75,7 +74,7 @@ App::exec() Mem::allocate(m_options->algo(), m_options->threads(), m_options->doubleHash()); Summary::print(); - startWorders(); + Workers::start(m_options->threads()); m_network->connect(); @@ -84,23 +83,3 @@ App::exec() return r; } - - -void App::startWorders() -{ - for (int i = 0; i < m_options->threads(); ++i) { - Handle *handle = new Handle(i); - m_workers.push_back(handle); - handle->start(App::onWorkerStarted); - } -} - - -void *App::onWorkerStarted(void *arg) -{ - auto handle = static_cast(arg); - IWorker *worker = new SingleWorker(handle); - worker->start(); - - return nullptr; -} diff --git a/src/App.h b/src/App.h index 25d91890..b2d5e5f0 100644 --- a/src/App.h +++ b/src/App.h @@ -25,10 +25,6 @@ #define __APP_H__ -#include - - -class Handle; class Network; class Options; @@ -42,13 +38,8 @@ public: int exec(); private: - void startWorders(); - - static void* onWorkerStarted(void *arg); - Network *m_network; Options *m_options; - std::vector m_workers; }; diff --git a/src/workers/Handle.cpp b/src/workers/Handle.cpp index 6c1f5553..527b5d6d 100644 --- a/src/workers/Handle.cpp +++ b/src/workers/Handle.cpp @@ -35,5 +35,4 @@ Handle::Handle(int id) : void Handle::start(void *(*callback) (void *)) { pthread_create(&m_thread, nullptr, callback, this); -// m_thread = std::thread([]() {}); } diff --git a/src/workers/SingleWorker.cpp b/src/workers/SingleWorker.cpp index d9a8f8a6..95eb4157 100644 --- a/src/workers/SingleWorker.cpp +++ b/src/workers/SingleWorker.cpp @@ -22,10 +22,13 @@ */ +#include #include + #include "Console.h" #include "workers/SingleWorker.h" +#include "workers/Workers.h" SingleWorker::SingleWorker(Handle *handle) @@ -33,3 +36,9 @@ SingleWorker::SingleWorker(Handle *handle) { LOG_WARN("SingleWorker %d", pthread_self()); } + + +void SingleWorker::start() +{ +// Workers::submit(); +} diff --git a/src/workers/SingleWorker.h b/src/workers/SingleWorker.h index 830c6f39..1c569d97 100644 --- a/src/workers/SingleWorker.h +++ b/src/workers/SingleWorker.h @@ -35,6 +35,8 @@ class SingleWorker : public Worker { public: SingleWorker(Handle *handle); + + void start() override; }; diff --git a/src/workers/Worker.cpp b/src/workers/Worker.cpp index 3e42d1bd..24f275e9 100644 --- a/src/workers/Worker.cpp +++ b/src/workers/Worker.cpp @@ -40,9 +40,3 @@ Worker::Worker(Handle *handle) : Worker::~Worker() { } - - -void Worker::start() -{ - -} diff --git a/src/workers/Worker.h b/src/workers/Worker.h index c24fa573..e68534ae 100644 --- a/src/workers/Worker.h +++ b/src/workers/Worker.h @@ -38,8 +38,6 @@ public: Worker(Handle *handle); ~Worker(); - void start() override; - protected: cryptonight_ctx *m_ctx; Handle *m_handle; diff --git a/src/workers/Workers.cpp b/src/workers/Workers.cpp new file mode 100644 index 00000000..004d49b6 --- /dev/null +++ b/src/workers/Workers.cpp @@ -0,0 +1,72 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2016-2017 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 . + */ + + +#include + + +#include "Console.h" +#include "workers/Handle.h" +#include "workers/SingleWorker.h" +#include "workers/Workers.h" + + +std::vector Workers::m_workers; +uv_async_t Workers::m_async; + + +void Workers::start(int threads) +{ + LOG_NOTICE("start %d", pthread_self()); + + uv_async_init(uv_default_loop(), &m_async, Workers::onResult); + + for (int i = 0; i < threads; ++i) { + Handle *handle = new Handle(i); + m_workers.push_back(handle); + handle->start(Workers::onReady); + } +} + + +void Workers::submit() +{ + uv_async_send(&m_async); +} + + + +void *Workers::onReady(void *arg) +{ + auto handle = static_cast(arg); + IWorker *worker = new SingleWorker(handle); + worker->start(); + + return nullptr; +} + + + +void Workers::onResult(uv_async_t *handle) +{ +} diff --git a/src/workers/Workers.h b/src/workers/Workers.h new file mode 100644 index 00000000..48485770 --- /dev/null +++ b/src/workers/Workers.h @@ -0,0 +1,50 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2016-2017 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 __WORKERS_H__ +#define __WORKERS_H__ + + +#include +#include + + +class Handle; + + +class Workers +{ +public: + static void start(int threads); + static void submit(); + +private: + static void *onReady(void *arg); + static void onResult(uv_async_t *handle); + + static std::vector m_workers; + static uv_async_t m_async; +}; + + +#endif /* __WORKERS_H__ */