]> git.tdb.fi Git - libs/core.git/blob - source/core/unix/module.cpp
Add a class for loading and accessing modules at runtime
[libs/core.git] / source / core / unix / module.cpp
1 #include <dlfcn.h>
2 #include "module.h"
3 #include "module_private.h"
4 #include "systemerror.h"
5
6 using namespace std;
7
8 namespace Msp {
9
10 Module::Module(const string &name)
11 {
12         ModuleHandle handle = dlopen(name.c_str(), RTLD_NOW);
13         if(!handle)
14                 throw system_error("dlopen", dlerror());
15
16         priv = new Private;
17         priv->handle = handle;
18 }
19
20 Module::~Module()
21 {
22         dlclose(priv->handle);
23         delete priv;
24 }
25
26 void *Module::get_symbol(const string &name) const
27 {
28         dlerror();
29         void *result = dlsym(priv->handle, name.c_str());
30         if(!result)
31         {
32                 const char *err = dlerror();
33                 if(err)
34                         throw system_error("dlsym", err);
35         }
36
37         return result;
38 }
39
40 } // namespace Msp