15 #include <stk_util/diag/SlibDiagWriter.hpp> 17 #ifdef SIERRA_DLOPEN_ENABLED 28 std::ostringstream derived_name;
29 derived_name <<
"enum id " << derived_id;
30 return derived_name.str();
35 Registry::getRegistryMap()
58 slibout.m(Slib::LOG_PLUGIN) <<
"Registering " << name_pair.second
59 <<
" of type " <<
demangle(name_pair.first->name())
62 RegistryMap::const_iterator registry_entry = getRegistryMap().find(name_pair);
63 if (registry_entry != getRegistryMap().end() && (*registry_entry).second != func_ptr) {
64 std::ostringstream strout;
65 strout <<
"Function with signature " <<
demangle((*registry_entry).first.first->name())
66 <<
" and derived name '" << (*registry_entry).first.second
67 <<
"' already registered to create function at address " << (*registry_entry).second;
68 throw std::invalid_argument(strout.str());
70 getRegistryMap()[name_pair] = func_ptr;
78 void *creator_function =
getFuncPtr(name_pair);
80 return creator_function;
82 std::ostringstream strout;
84 strout <<
"User plugin creator function with base class '" <<
demangle(name_pair.first->name())
85 <<
"' and derived class name '" << name_pair.second
86 <<
"' not found in registry";
87 throw std::invalid_argument(strout.str());
96 void *creator_function =
getFuncPtr(name_pair);
98 return creator_function;
100 std::ostringstream strout;
101 strout <<
"User subroutine " << name_pair.second <<
"\n" 102 <<
" with signature " <<
demangle(name_pair.first->name()) <<
"\n" 103 <<
" not found in registry";
104 throw std::invalid_argument(strout.str());
114 if (creator_function)
115 return creator_function;
117 std::ostringstream strout;
118 strout <<
"Registry does not contain function with signature " <<
demangle(name_pair.first->name())
119 <<
" and derived name '" << name_pair.second <<
"'";
120 throw std::invalid_argument(strout.str());
129 RegistryMap::const_iterator registry_entry = getRegistryMap().find(name_pair);
130 return registry_entry == getRegistryMap().end() ? NULL : (*registry_entry).second;
134 std::vector<std::string>
136 const std::type_info & type)
const 138 std::vector<std::string> derived_names;
140 for (RegistryMap::const_iterator it = getRegistryMap().begin(); it != getRegistryMap().end(); ++it)
141 if (*(*it).first.first == type)
142 derived_names.push_back((*it).first.second);
144 return derived_names;
148 typedef void (*dl_register_t)();
152 const char * so_path,
153 const char * function_name)
155 #ifdef SIERRA_DLOPEN_ENABLED 157 void *dl = dlopen(so_path, RTLD_NOW);
159 throw std::runtime_error(dlerror());
163 std::string s = std::strlen(function_name) ? function_name :
"dl_register";
165 dl_register_t f = (dl_register_t) dlsym(dl, s.c_str());
167 s = s + SIERRA_FORTRAN_SUFFIX;
169 f = (dl_register_t) dlsym(dl, s.c_str());
173 slibout.m(Slib::LOG_PLUGIN) <<
"Executing dynamic library " << so_path <<
" function " << s <<
"()" <<
stk_classic::diag::dendl;
177 if (std::strlen(function_name)) {
178 std::ostringstream str;
179 str <<
"Registration function " << function_name <<
" not found in " << so_path;
180 throw std::runtime_error(str.str().c_str());
186 throw std::runtime_error(
"Dynamic linkage is not supported on this platform");
193 Registry::getsym<void *>(
196 #ifdef SIERRA_DLOPEN_ENABLED 198 void *dl = dlopen(NULL, RTLD_LAZY);
213 std::ostream & os)
const 215 for (RegistryMap::const_iterator it = getRegistryMap().begin(); it != getRegistryMap().end(); ++it)
216 os << (*it).first.second <<
" of type " <<
demangle((*it).first.first->name()) <<
" at " << (*it).second << std::endl;
225 if (
dout.shouldPrint()) {
228 for (RegistryMap::const_iterator it = getRegistryMap().begin(); it != getRegistryMap().end(); ++it)
239 type_info_func * type_id,
240 void * user_subroutine,
void SIERRA_FORTRAN() register_user_subroutine(type_info_func type_id, void *user_subroutine, const char *name, int name_length)
FORTRAN compatible user subprogram registration routine.
std::ostream & dout()
Diagnostic output stream.
std::pair< const std::type_info *, std::string > NamePair
Typedef NamePair is the derived class key.
static void registerDL(const char *so_path, const char *function_name=0)
Member function registerDL opens a dynamic library and optionally executes a "C" registration functio...
Writer & pop(Writer &dout)
Member function pop calls the Writer::pop manipulator.
const char * demangle(const char *symbol)
Function demangle returns the demangled C++ symbol from the mangled C++ symbol. The mangled named is ...
std::ostream & verbose_print(std::ostream &os) const
Member function dump dumps the registry.
void registerIt(const NamePair &name_pair, void *func_ptr)
Member function registerIt registers a name pair with a void pointer.
void * getPluginPtr(const NamePair &name_pair) const
Member function getPluginPtr find the function with the name pair specified.
Writer & dendl(Writer &dout)
Writer function dendl calls the Writer::dendl manipulator.
Class Writer implements a runtime selectable diagnostic output writer to aid in the development and d...
std::vector< std::string > getDerivedNames(const std::type_info &type) const
Member function getDerivedNames returns names assocaited with the function pointers of the specified ...
void * getFuncPtr(const NamePair &name_pair) const
Member function getFuncPtr returns the function pointer with the specfied <it>name_pair.
Registry * getFactoryPtr(const NamePair &name) const
Member function getFuncPtr returns the function pointer with the specfied <it>name_pair.
std::map< NamePair, void *, less_nocase > RegistryMap
Typedef RegistryMap is the registration map.
static Registry & rootInstance()
Member function rootInstance creates the singleton.
Writer & push(Writer &dout)
Function push calls the Writer::push manipulator.
void * getFunctionPtr(const NamePair &name_pair) const
Member function getFunctionPtr find the function with the name pair specified.