diff options
author | psychocrypt <psychocrypt@users.noreply.github.com> | 2017-10-01 00:36:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-01 00:36:33 +0200 |
commit | 4e5e98a095ed0ec038b9ea5421407b630bda273d (patch) | |
tree | 85c1401542a888b9d48255342095c8b6952d71bf /xmrstak/backend/plugin.hpp | |
parent | 0afbc279e0db816dbb9d4d623929e2faf8108451 (diff) | |
parent | 2c8d64abfa1c989f260dd4fcaa5c6d7707a5f668 (diff) | |
download | xmr-stak-4e5e98a095ed0ec038b9ea5421407b630bda273d.zip xmr-stak-4e5e98a095ed0ec038b9ea5421407b630bda273d.tar.gz |
Merge pull request #1 from psychocrypt/topic-restructure11
refactor xmr-stak
Diffstat (limited to 'xmrstak/backend/plugin.hpp')
-rw-r--r-- | xmrstak/backend/plugin.hpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/xmrstak/backend/plugin.hpp b/xmrstak/backend/plugin.hpp new file mode 100644 index 0000000..ff7c9d8 --- /dev/null +++ b/xmrstak/backend/plugin.hpp @@ -0,0 +1,99 @@ +#pragma once + +#include "xmrstak/misc/environment.hpp" +#include "xmrstak/params.hpp" + +#include <thread> +#include <atomic> +#include <vector> +#include <string> +#include "iBackend.hpp" +#include <iostream> + +#ifndef USE_PRECOMPILED_HEADERS +# ifdef WIN32 +# include <direct.h> +# include <windows.h> +# else +# include <sys/types.h> +# include <dlfcn.h> +# endif +# include <iostream> +#endif + +namespace xmrstak +{ + +struct plugin +{ + + plugin(const std::string backendName, const std::string libName) : fn_starterBackend(nullptr), m_backendName(backendName) + { +#ifdef WIN32 + libBackend = LoadLibrary(TEXT((libName + ".dll").c_str())); + if(!libBackend) + { + std::cerr << "WARNING: "<< m_backendName <<" cannot load backend library: " << (libName + ".dll") << std::endl; + return; + } +#else + libBackend = dlopen((params::inst().executablePrefix + "/lib" + libName + ".so").c_str(), RTLD_LAZY); + if(!libBackend) + { + std::cerr << "WARNING: "<< m_backendName <<" cannot load backend library: " << dlerror() << std::endl; + return; + } +#endif + +#ifdef WIN32 + fn_starterBackend = (starterBackend_t) GetProcAddress(libBackend, "xmrstak_start_backend"); + if (!fn_starterBackend) + { + std::cerr << "WARNING: backend plugin " << libName << " contains no entry 'xmrstak_start_backend': " <<GetLastError()<< std::endl; + } +#else + // reset last error + dlerror(); + fn_starterBackend = (starterBackend_t) dlsym(libBackend, "xmrstak_start_backend"); + const char* dlsym_error = dlerror(); + if(dlsym_error) + { + std::cerr << "WARNING: backend plugin " << libName << " contains no entry 'xmrstak_start_backend': " << dlsym_error << std::endl; + } +#endif + } + + std::vector<iBackend*>* startBackend(uint32_t threadOffset, miner_work& pWork, environment& env) + { + if(fn_starterBackend == nullptr) + { + std::vector<iBackend*>* pvThreads = new std::vector<iBackend*>(); + std::cerr << "WARNING: " << m_backendName << " Backend disabled"<< std::endl; + return pvThreads; + } + + return fn_starterBackend(threadOffset, pWork, env); + } + + std::string m_backendName; + + typedef std::vector<iBackend*>* (*starterBackend_t)(uint32_t threadOffset, miner_work& pWork, environment& env); + + starterBackend_t fn_starterBackend; + +#ifdef WIN32 + HINSTANCE libBackend; +#else + void *libBackend; +#endif + +/* \todo add unload to destructor and change usage of plugin that libs keeped open until the miner endss +#ifdef WIN32 + FreeLibrary(libBackend); +#else + dlclose(libBackend); +#endif + * */ +}; + +} // namepsace xmrstak |