diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ac3ae5a9..04fccdc12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,12 +28,13 @@ set(HEADERS src/net/Job.h src/net/JobResult.h src/net/Network.h - src/net/SubmitResult.h - src/net/Url.h src/net/strategies/DonateStrategy.h src/net/strategies/FailoverStrategy.h src/net/strategies/SinglePoolStrategy.h + src/net/SubmitResult.h + src/net/Url.h src/Options.h + src/Platform.h src/Summary.h src/version.h src/workers/DoubleWorker.h @@ -73,6 +74,7 @@ set(SOURCES src/net/strategies/SinglePoolStrategy.cpp src/net/Url.cpp src/Options.cpp + src/Platform.cpp src/Summary.cpp src/workers/DoubleWorker.cpp src/workers/Handle.cpp @@ -100,7 +102,7 @@ if (WIN32) src/App_win.cpp src/Cpu_win.cpp src/Mem_win.cpp - src/net/Network_win.cpp + src/Platform_win.cpp ) add_definitions(/DWIN32) @@ -110,14 +112,14 @@ elseif (APPLE) src/App_unix.cpp src/Cpu_mac.cpp src/Mem_unix.cpp - src/net/Network_mac.cpp + src/Platform_mac.cpp ) else() set(SOURCES_OS src/App_unix.cpp src/Cpu_unix.cpp src/Mem_unix.cpp - src/net/Network_unix.cpp + src/Platform_unix.cpp ) set(EXTRA_LIBS pthread) diff --git a/src/App.cpp b/src/App.cpp index de6f2785d..e4af60bfd 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -36,6 +36,7 @@ #include "Mem.h" #include "net/Network.h" #include "Options.h" +#include "Platform.h" #include "Summary.h" #include "version.h" #include "workers/Workers.h" @@ -80,6 +81,8 @@ App::App(int argc, char **argv) : } # endif + Platform::init(); + m_network = new Network(m_options); uv_signal_init(uv_default_loop(), &m_signal); @@ -120,10 +123,11 @@ int App::exec() uv_loop_close(uv_default_loop()); uv_tty_reset_mode(); - free(m_network); - free(m_options); + delete m_network; + Options::release(); Mem::release(); + Platform::release(); return r; } diff --git a/src/Options.h b/src/Options.h index 7a6a7339f..3735fca06 100644 --- a/src/Options.h +++ b/src/Options.h @@ -69,6 +69,8 @@ public: inline int threads() const { return m_threads; } inline int64_t affinity() const { return m_affinity; } + inline static void release() { delete m_self; } + const char *algoName() const; private: diff --git a/src/Platform.cpp b/src/Platform.cpp new file mode 100644 index 000000000..aa0c57060 --- /dev/null +++ b/src/Platform.cpp @@ -0,0 +1,28 @@ +/* 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 2016-2017 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 "Platform.h" + + +char *Platform::m_userAgent = nullptr; diff --git a/src/Platform.h b/src/Platform.h new file mode 100644 index 000000000..cc798fcab --- /dev/null +++ b/src/Platform.h @@ -0,0 +1,41 @@ +/* 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 2016-2017 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 __PLATFORM_H__ +#define __PLATFORM_H__ + + +class Platform +{ +public: + static void init(); + static void release(); + + static inline const char *userAgent() { return m_userAgent; } + +private: + static char *m_userAgent; +}; + + +#endif /* __PLATFORM_H__ */ diff --git a/src/net/Network_mac.cpp b/src/Platform_mac.cpp similarity index 85% rename from src/net/Network_mac.cpp rename to src/Platform_mac.cpp index c3c42a3e5..a25d1ac11 100644 --- a/src/net/Network_mac.cpp +++ b/src/Platform_mac.cpp @@ -23,17 +23,32 @@ #include <stdlib.h> +#include <uv.h> -#include "net/Network.h" + +#include "Platform.h" #include "version.h" -char *Network::userAgent() +static inline char *createUserAgent() { const size_t max = 128; - char *buf = static_cast<char*>(malloc(max)); + char *buf = new char[max]; snprintf(buf, max, "%s/%s (Macintosh; Intel Mac OS X) libuv/%s clang/%d.%d.%d", APP_NAME, APP_VERSION, uv_version_string(), __clang_major__, __clang_minor__, __clang_patchlevel__); return buf; } + + +void Platform::init() +{ + m_userAgent = createUserAgent(); +} + + +void Platform::release() +{ + delete [] m_userAgent; +} + diff --git a/src/net/Network_unix.cpp b/src/Platform_unix.cpp similarity index 87% rename from src/net/Network_unix.cpp rename to src/Platform_unix.cpp index 546d1b8a2..6da3a197a 100644 --- a/src/net/Network_unix.cpp +++ b/src/Platform_unix.cpp @@ -23,17 +23,18 @@ #include <stdlib.h> +#include <uv.h> -#include "net/Network.h" +#include "Platform.h" #include "version.h" -char *Network::userAgent() +static inline char *createUserAgent() { const size_t max = 128; - char *buf = static_cast<char*>(malloc(max)); + char *buf = new char[max]; int length = snprintf(buf, max, "%s/%s (Linux ", APP_NAME, APP_VERSION); # if defined(__x86_64__) @@ -48,3 +49,16 @@ char *Network::userAgent() return buf; } + + +void Platform::init() +{ + m_userAgent = createUserAgent(); +} + + +void Platform::release() +{ + delete [] m_userAgent; +} + diff --git a/src/net/Network_win.cpp b/src/Platform_win.cpp similarity index 90% rename from src/net/Network_win.cpp rename to src/Platform_win.cpp index 6ae5e3223..7fbe0c8c3 100644 --- a/src/net/Network_win.cpp +++ b/src/Platform_win.cpp @@ -24,9 +24,10 @@ #include <winsock2.h> #include <windows.h> +#include <uv.h> -#include "net/Network.h" +#include "Platform.h" #include "version.h" @@ -48,12 +49,12 @@ static inline OSVERSIONINFOEX winOsVersion() } -char *Network::userAgent() +static inline char *createUserAgent() { const auto osver = winOsVersion(); - const size_t max = 128; + const size_t max = 160; - char *buf = static_cast<char*>(malloc(max)); + char *buf = new char[max]; int length = snprintf(buf, max, "%s/%s (Windows NT %lu.%lu", APP_NAME, APP_VERSION, osver.dwMajorVersion, osver.dwMinorVersion); # if defined(__x86_64__) || defined(_M_AMD64) @@ -70,3 +71,16 @@ char *Network::userAgent() return buf; } + + +void Platform::init() +{ + m_userAgent = createUserAgent(); +} + + +void Platform::release() +{ + delete [] m_userAgent; +} + diff --git a/src/net/Network.cpp b/src/net/Network.cpp index 04ce2ae7d..d732c7748 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -38,6 +38,7 @@ #include "net/strategies/SinglePoolStrategy.h" #include "net/Url.h" #include "Options.h" +#include "Platform.h" #include "workers/Workers.h" @@ -50,19 +51,18 @@ Network::Network(const Options *options) : srand(time(0) ^ (uintptr_t) this); Workers::setListener(this); - m_agent = userAgent(); const std::vector<Url*> &pools = options->pools(); if (pools.size() > 1) { - m_strategy = new FailoverStrategy(pools, m_agent, this); + m_strategy = new FailoverStrategy(pools, Platform::userAgent(), this); } else { - m_strategy = new SinglePoolStrategy(pools.front(), m_agent, this); + m_strategy = new SinglePoolStrategy(pools.front(), Platform::userAgent(), this); } if (m_options->donateLevel() > 0) { - m_donate = new DonateStrategy(m_agent, this); + m_donate = new DonateStrategy(Platform::userAgent(), this); } m_timer.data = this; @@ -74,7 +74,6 @@ Network::Network(const Options *options) : Network::~Network() { - free(m_agent); } diff --git a/src/net/Network.h b/src/net/Network.h index ba1982e12..33806f634 100644 --- a/src/net/Network.h +++ b/src/net/Network.h @@ -47,8 +47,6 @@ public: void connect(); void stop(); - static char *userAgent(); - protected: void onActive(Client *client) override; void onJob(Client *client, const Job &job) override; @@ -64,7 +62,6 @@ private: static void onTick(uv_timer_t *handle); - char *m_agent; const Options *m_options; IStrategy *m_donate; IStrategy *m_strategy;