8 #if defined(WIN32) && !defined(__CYGWIN__) 22 virtual std::string
LibName()
const = 0;
29 std::string mPathToLib;
30 std::string mAllocClassSymbol;
31 std::string mDeleteClassSymbol;
34 std::string pathToLib,
35 std::string allocClassSymbol =
"allocator",
36 std::string deleteClassSymbol =
"deleter"):
37 mPathToLib(
std::move(pathToLib)),
38 mAllocClassSymbol(
std::move(allocClassSymbol)),
39 mDeleteClassSymbol(
std::move(deleteClassSymbol)) {}
42 if (!(mHandle = LoadLibrary(mPathToLib.c_str()))) {
43 throw std::runtime_error(std::string{
"Cannot open and load "} + mPathToLib);
47 if (FreeLibrary(mHandle) == 0) {
48 throw std::runtime_error(std::string{
"Cannot close "} + mPathToLib);
52 using allocClass = T *(*)();
53 using deleteClass = void (*)(T *);
54 auto allocFunc =
reinterpret_cast<allocClass
>(dlsym(mHandle, mAllocClassSymbol.c_str()));
55 auto deleteFunc =
reinterpret_cast<deleteClass
>(dlsym(mHandle, mDeleteClassSymbol.c_str()));
56 if (!allocFunc || !deleteFunc) {
62 throw std::runtime_error(std::string{
"Cannot find allocator or deleter symbol in "} + mPathToLib);
64 return std::shared_ptr<T>(allocFunc(), [deleteFunc](T* p){deleteFunc(p);});
66 std::string
LibName()
const override {
72 class DLLoader:
public DLLoaderInterface<T> {
75 std::string mPathToLib;
76 std::string mAllocClassSymbol;
77 std::string mDeleteClassSymbol;
80 std::string pathToLib,
81 std::string allocClassSymbol =
"allocator",
82 std::string deleteClassSymbol =
"deleter"):
83 mPathToLib(
std::move(pathToLib)),
84 mAllocClassSymbol(
std::move(allocClassSymbol)),
85 mDeleteClassSymbol(
std::move(deleteClassSymbol)) {}
88 if (!(mHandle = dlopen(mPathToLib.c_str(), RTLD_NOW|RTLD_LAZY))) {
89 throw std::runtime_error(std::string{dlerror()});
93 if (dlclose(mHandle) != 0) {
94 throw std::runtime_error(std::string{dlerror()});
98 using allocClass = T *(*)();
99 using deleteClass = void (*)(T *);
100 auto allocFunc =
reinterpret_cast<allocClass
>(dlsym(mHandle, mAllocClassSymbol.c_str()));
101 auto deleteFunc =
reinterpret_cast<deleteClass
>(dlsym(mHandle, mDeleteClassSymbol.c_str()));
102 if (!allocFunc || !deleteFunc) {
105 throw std::runtime_error(std::string{dlerror()});
109 throw std::runtime_error(std::string{dlerror()});
111 return std::shared_ptr<T>(allocFunc(), [deleteFunc](T* p){deleteFunc(p);});
std::string LibName() const override
virtual void DLCloseLib()=0
DLLoader(std::string pathToLib, std::string allocClassSymbol="allocator", std::string deleteClassSymbol="deleter")
std::shared_ptr< T > DLGetInstance() override
virtual ~DLLoaderInterface()=default
void DLCloseLib() override
virtual std::shared_ptr< T > DLGetInstance()=0
virtual std::string LibName() const =0
void DLOpenLib() override
virtual void DLOpenLib()=0