17 CDynamicLoading::TDLHandleMap CDynamicLoading::m_tOpenLibs;
18 const std::string CDynamicLoading::DEFAULT_PLUGIN_PATH = ARGOS_INSTALL_PREFIX
"/lib/argos3/";
33 std::string& str_msg) {
36 str_msg = str_lib +
": ";
40 std::string strLibWExt = str_lib +
"." + ARGOS_SHARED_LIBRARY_EXTENSION;
41 tHandle = ::dlopen(strLibWExt.c_str(), RTLD_GLOBAL | RTLD_LAZY);
42 str_msg +=
"\n" + strLibWExt +
": ";
50 strLibWExt = str_lib +
"." + ARGOS_MODULE_LIBRARY_EXTENSION;
51 tHandle = ::dlopen(strLibWExt.c_str(), RTLD_GLOBAL | RTLD_LAZY);
52 str_msg +=
"\n" + strLibWExt +
": ";
69 if(str_lib[0] ==
'/') {
74 TDLHandleMap::iterator it = m_tOpenLibs.find(str_lib);
75 if(it != m_tOpenLibs.end()) {
77 return m_tOpenLibs[str_lib];
80 std::string strLoadedLib = str_lib;
82 tHandle = LoadLibraryTryingExtensions(strLoadedLib, strMsg);
86 <<
"\" even after trying to add extensions for shared library ("
87 << ARGOS_SHARED_LIBRARY_EXTENSION
88 <<
") and module library ("
89 << ARGOS_MODULE_LIBRARY_EXTENSION
95 m_tOpenLibs[strLoadedLib] = tHandle;
96 LOG <<
"[INFO] Loaded library \"" << strLoadedLib <<
"\"" << std::endl;
105 std::string strLibPath;
107 std::string strPluginPath =
".:" + DEFAULT_PLUGIN_PATH;
109 if(::getenv(
"ARGOS_PLUGIN_PATH") != NULL) {
111 strPluginPath = std::string(::getenv(
"ARGOS_PLUGIN_PATH")) +
":" + strPluginPath;
114 if(strPluginPath[strPluginPath.length()-1] !=
':') {
115 strPluginPath.append(
":");
121 std::istringstream issPluginPath(strPluginPath);
122 std::string strDir, strMsg;
123 while(std::getline(issPluginPath, strDir,
':')) {
125 if(strDir[strDir.length()-1] !=
'/') {
128 strLibPath = strDir + str_lib;
130 TDLHandleMap::iterator it = m_tOpenLibs.find(strLibPath);
131 if(it != m_tOpenLibs.end()) {
133 return m_tOpenLibs[strLibPath];
136 tHandle = LoadLibraryTryingExtensions(strLibPath, strMsg);
137 if(tHandle != NULL) {
139 m_tOpenLibs[strLibPath] = tHandle;
140 LOG <<
"[INFO] Loaded library \"" << strLibPath <<
"\"" << std::endl;
148 <<
"\" even after trying to add extensions for shared library ("
149 << ARGOS_SHARED_LIBRARY_EXTENSION
150 <<
") and module library ("
151 << ARGOS_MODULE_LIBRARY_EXTENSION
162 TDLHandleMap::iterator it = m_tOpenLibs.find(str_lib);
163 if(it != m_tOpenLibs.end()) {
164 if(::dlclose(it->second) != 0) {
165 LOGERR <<
"[WARNING] Can't unload library \""
176 <<
"\": library does not appear to have been loaded.");
185 std::string strLibPath;
187 std::string strPluginPath = DEFAULT_PLUGIN_PATH;
189 if(::getenv(
"ARGOS_PLUGIN_PATH") != NULL) {
191 strPluginPath = std::string(::getenv(
"ARGOS_PLUGIN_PATH")) +
":" + strPluginPath;
194 if(strPluginPath[strPluginPath.length()-1] !=
':') {
195 strPluginPath.append(
":");
202 struct dirent* ptDirData;
204 std::istringstream issPluginPath(strPluginPath);
206 while(std::getline(issPluginPath, strDir,
':')) {
208 if(strDir[strDir.length()-1] !=
'/') {
212 ptDir = ::opendir(strDir.c_str());
215 while((ptDirData = ::readdir(ptDir)) != NULL) {
217 if(strlen(ptDirData->d_name) > strlen(ARGOS_SHARED_LIBRARY_EXTENSION) &&
218 std::string(ptDirData->d_name).rfind(
"." ARGOS_SHARED_LIBRARY_EXTENSION) +
219 strlen(ARGOS_SHARED_LIBRARY_EXTENSION) + 1 == strlen(ptDirData->d_name)) {
223 if(strcmp(ARGOS_SHARED_LIBRARY_EXTENSION, ARGOS_MODULE_LIBRARY_EXTENSION) != 0) {
224 if(strlen(ptDirData->d_name) > strlen(ARGOS_MODULE_LIBRARY_EXTENSION) &&
225 std::string(ptDirData->d_name).rfind(
"." ARGOS_MODULE_LIBRARY_EXTENSION) +
226 strlen(ARGOS_MODULE_LIBRARY_EXTENSION) + 1 == strlen(ptDirData->d_name)) {
237 LOGERR <<
"[WARNING] Error opening directory \""
251 for(TDLHandleMap::iterator it = m_tOpenLibs.begin();
252 it != m_tOpenLibs.end();
CARGoSLog LOG(std::cout, SLogColor(ARGOS_LOG_ATTRIBUTE_BRIGHT, ARGOS_LOG_COLOR_GREEN))
#define THROW_ARGOSEXCEPTION(message)
This macro throws an ARGoS exception with the passed message.
CARGoSLog LOGERR(std::cerr, SLogColor(ARGOS_LOG_ATTRIBUTE_BRIGHT, ARGOS_LOG_COLOR_RED))
static void LoadAllLibraries()
Loads all the dynamic libraries in the current ARGOS_PLUGIN_PATH.
void * TDLHandle
The handle to a loaded library.
static void UnloadLibrary(const std::string &str_lib)
Unloads a dynamic library.
The namespace containing all the ARGoS related code.
static TDLHandle LoadLibrary(const std::string &str_lib)
Loads a dynamic library.
static void UnloadAllLibraries()
Unloads all the dynamic libraries.