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 LinuxDynamicLib(
const std::string& dynLibName,
42 int dlOpenMode = RTLD_NOW) :
43 _dynLibName(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 std::set<std::string>::const_iterator 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>;