NEURON
resolve.cpp
Go to the documentation of this file.
1 #include <dlfcn.h>
2 #include <sstream>
3 #include "../nrnmpi.h"
4 
5 namespace coreneuron {
6 // Those functions are part of a mechanism to dynamically load mpi or not
7 void mpi_manager_t::resolve_symbols(void* lib_handle) {
8  for (size_t i = 0; i < m_num_function_ptrs; ++i) {
9  auto* ptr = m_function_ptrs[i];
10  assert(!(*ptr));
11  ptr->resolve(lib_handle);
12  assert(*ptr);
13  }
14 }
15 
16 void mpi_function_base::resolve(void* lib_handle) {
17  dlerror();
18  void* ptr = dlsym(lib_handle, m_name);
19  const char* error = dlerror();
20  if (error) {
21  std::ostringstream oss;
22  oss << "Could not get symbol '" << m_name << "' from handle '" << lib_handle
23  << "': " << error;
24  throw std::runtime_error(oss.str());
25  }
26  assert(ptr);
27  m_fptr = ptr;
28 }
29 } // namespace coreneuron
#define i
Definition: md1redef.h:19
DLFCN_EXPORT char * dlerror(void)
Definition: dlfcn.c:548
DLFCN_NOINLINE DLFCN_EXPORT void * dlsym(void *handle, const char *name)
Definition: dlfcn.c:447
#define assert(ex)
Definition: hocassrt.h:24
error
Definition: extdef.h:3
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
void resolve(void *dlsym_handle)
Definition: resolve.cpp:16
std::size_t m_num_function_ptrs
Definition: nrnmpi.h:48
void resolve_symbols(void *dlsym_handle)
Definition: resolve.cpp:7
std::array< mpi_function_base *, max_mpi_functions > m_function_ptrs
Definition: nrnmpi.h:49