#pragma once #include #include #include #include #include "IBackend.hpp" #include #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())); #else libBackend = dlopen((libName + ".so").c_str(), RTLD_LAZY); #endif if (!libBackend) { std::cerr << "WARNING: "<< m_backendName <<" cannot load backend library: " << dlerror() << std::endl; return; } #ifdef WIN32 fn_starterBackend = (func_t*) GetProcAddress(libBackend, "xmrstak_start_backend"); if (!fn_starterBackend) { std::cerr << "WARNING: backend plugin " << libName << " contains no entry 'xmrstak_start_backend'" << 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'" << std::endl; } #endif } std::vector* startBackend(uint32_t threadOffset, miner_work& pWork) { 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); } std::string m_backendName; typedef std::vector* (*starterBackend_t)(uint32_t threadOffset, miner_work& pWork); 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