diff --git a/src/liboncilla/BackendFactory.cpp b/src/liboncilla/BackendFactory.cpp index e064a60..bda3e32 100644 --- a/src/liboncilla/BackendFactory.cpp +++ b/src/liboncilla/BackendFactory.cpp @@ -1,97 +1,100 @@ /** * \file BackendFactory.cpp * * \date Jun 21, 2012 * \author Alexandre Tuleu */ #include "BackendFactory.h" #include #include namespace rci { namespace oncilla { BackendFactory & BackendFactory::Instance(){ static BackendFactory * s_rci_oncilla_backend_factory = new BackendFactory(); return *s_rci_oncilla_backend_factory; } void BackendFactory::RegisterBackend(Priority p, EntryPtr e){ EntryByPriority::const_iterator fi = d_entries.find(p); if(fi != d_entries.end()){ return; } d_entries.insert(std::make_pair(p,e)); } BackendFactory::EntryPtr BackendFactory::HighestPriorityBackend(){ LoadExternalBackend(); EntryByPriority::const_reverse_iterator fi = d_entries.rbegin(); if (fi == d_entries.rend()){ return 0; } return fi->second; } void BackendFactory::LoadExternalBackend(){ for(SetOfBackendName::const_iterator n = d_unloaded.begin(); n != d_unloaded.end(); ++n){ #ifndef NDEBUG std::cerr << "Looking for module '" << *n << "' : " << std::flush; #endif char * error; void * module_handle = dlopen(n->c_str(),RTLD_NOW); if((error = dlerror()) != NULL ){ #ifndef NDEBUG std::cerr << std::endl << " got an error : '" << error << "'" << std::endl; +#else + std::cerr << "Got an error while trying to open module '" << *n + << "' : " << error << std::endl; #endif continue; } #ifndef NDEBUG std::cerr << " found." << std::endl; #endif liboncilla_backend_entry_fct entry = (liboncilla_backend_entry_fct) dlsym(module_handle,"liboncilla_webots_backend_entry"); if((error = dlerror()) != NULL){ throw std::runtime_error("Could not find 'liboncilla_webots_backend_entry' symbol in '" + (*n) + "'."); } (*entry)(); d_loaded.insert(std::make_pair(*n,module_handle)); } d_unloaded.clear(); } void BackendFactory::AddAdditionalBackend(const std::string& name){ ListOfLoadedBackend::const_iterator fi = d_loaded.find(name); if( fi != d_loaded.end()){ return; } d_unloaded.insert(name); } BackendFactory::BackendFactory(){ d_unloaded.insert("liboncilla-webots.so"); d_unloaded.insert("liboncilla-hw.so"); } BackendFactory::~BackendFactory(){ for(ListOfLoadedBackend::iterator b = d_loaded.begin(); b != d_loaded.end(); ++b) { char * error; dlclose(b->second); if( (error = dlerror()) != NULL){ std::cerr << "Could not unload module '" << b->first << "' : " << std::endl << " error : '" << error << "'." << std::endl; } } } } /* namespace oncilla */ } /* namespace rci */