#pragma once #include #include #include #include #include "IBackend.hpp" #include #include "../Environment.hpp" #ifndef USE_PRECOMPILED_HEADERS #ifdef WIN32 #include #include #else #include #include #endif #include #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((std::string("./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': " <* startBackend(uint32_t threadOffset, miner_work& pWork, Environment& env) { if(fn_starterBackend == nullptr) { std::vector* pvThreads = new std::vector(); std::cerr << "WARNING: " << m_backendName << " Backend disabled"<< std::endl; return pvThreads; } return fn_starterBackend(threadOffset, pWork, env); } std::string m_backendName; typedef std::vector* (*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