Page MenuHomec4science

BackendFactory.cpp
No OneTemporary

File Metadata

Created
Mon, May 13, 17:52

BackendFactory.cpp

/**
* \file BackendFactory.cpp
*
* \date Jun 21, 2012
* \author Alexandre Tuleu
*/
#include "BackendFactory.h"
#include <dlfcn.h>
#include <stdexcept>
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 */

Event Timeline