1 #ifndef CPPAD_CG_LINUX_DYNAMICLIB_INCLUDED
2 #define CPPAD_CG_LINUX_DYNAMICLIB_INCLUDED
18 #if CPPAD_CG_SYSTEM_LINUX
33 class LinuxDynamicLib :
public DynamicLib<Base> {
35 const std::string _dynLibName;
38 std::set<LinuxDynamicLibModel<Base>*> _models;
41 explicit LinuxDynamicLib(std::string dynLibName,
42 int dlOpenMode = RTLD_NOW) :
43 _dynLibName(std::move(dynLibName)),
44 _dynLibHandle(nullptr) {
47 if (_dynLibName[0] ==
'/') {
49 }
else if (!(_dynLibName[0] ==
'.' && _dynLibName[1] ==
'/') &&
50 !(_dynLibName[0] ==
'.' && _dynLibName[1] ==
'.')) {
51 path =
"./" + _dynLibName;
57 _dynLibHandle = dlopen(path.c_str(), dlOpenMode);
58 CPPADCG_ASSERT_KNOWN(_dynLibHandle !=
nullptr, (
"Failed to dynamically load library '" + _dynLibName +
"': " + dlerror()).c_str())
64 LinuxDynamicLib(const LinuxDynamicLib&) = delete;
65 LinuxDynamicLib& operator=(const LinuxDynamicLib&) = delete;
67 virtual std::unique_ptr<LinuxDynamicLibModel<Base>> modelLinuxDyn(const std::
string& modelName) {
68 std::unique_ptr<LinuxDynamicLibModel<Base>> m;
69 auto it = this->_modelNames.find(modelName);
70 if (it == this->_modelNames.end()) {
73 m.reset(
new LinuxDynamicLibModel<Base> (
this, modelName));
74 _models.insert(m.get());
78 std::unique_ptr<FunctorGenericModel<Base>> modelFunctor(
const std::string& modelName)
override final {
79 return std::unique_ptr<FunctorGenericModel<Base>>(modelLinuxDyn(modelName).release());
82 void* loadFunction(
const std::string& functionName,
bool required =
true)
override {
83 void* functor = dlsym(_dynLibHandle, functionName.c_str());
86 char *err = dlerror();
88 throw CGException(
"Failed to load function '", functionName,
"': ", err);
94 virtual ~LinuxDynamicLib() {
95 for (LinuxDynamicLibModel<Base>* model : _models) {
96 model->modelLibraryClosed();
99 if (_dynLibHandle !=
nullptr) {
100 if(this->_onClose !=
nullptr) {
104 dlclose(_dynLibHandle);
105 _dynLibHandle =
nullptr;
111 virtual void destroyed(LinuxDynamicLibModel<Base>* model) {
112 _models.erase(model);
115 friend class LinuxDynamicLibModel<Base>;