Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F62514240
BackendFactory.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, May 13, 17:52
Size
2 KB
Mime Type
text/x-c
Expires
Wed, May 15, 17:52 (2 d)
Engine
blob
Format
Raw Data
Handle
17657273
Attached To
R6622 liboncilla
BackendFactory.cpp
View Options
/**
* \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
Log In to Comment