summaryrefslogtreecommitdiffstats
path: root/mmss/protocol.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-07-27 14:21:46 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-07-27 14:21:46 +0200
commit49652b9e2882a1c3cd5203ea91f90cdd32a090e9 (patch)
tree81bedb0a0eda97edfab1d34cc93035780b7bbb74 /mmss/protocol.cpp
parenta7ccec3fefe1c01cf238a3c0931459a54c2ff3a3 (diff)
downloadgmrf-49652b9e2882a1c3cd5203ea91f90cdd32a090e9.tar
gmrf-49652b9e2882a1c3cd5203ea91f90cdd32a090e9.zip
Some changes in memory management
Diffstat (limited to 'mmss/protocol.cpp')
-rw-r--r--mmss/protocol.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/mmss/protocol.cpp b/mmss/protocol.cpp
index 3bbfeb1..246b136 100644
--- a/mmss/protocol.cpp
+++ b/mmss/protocol.cpp
@@ -32,11 +32,22 @@
namespace MMSS {
-const protocol_t* load_protocol(const char *module) {
+class dlcloser {
+private:
+ void *handle;
+
+public:
+ dlcloser(void *handle0) : handle(handle0) {}
+ void operator()(const protocol_t *ptr) const {
+ ::dlclose(handle);
+ }
+};
+
+std::shared_ptr<const protocol_t> load_protocol(const char *module) {
void *handle = ::dlopen(module, RTLD_NOW);
if (!handle) {
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
- return NULL;
+ return std::shared_ptr<const protocol_t>();
}
::dlerror();
@@ -44,12 +55,12 @@ const protocol_t* load_protocol(const char *module) {
if (!proto) {
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
::dlclose(handle);
- return NULL;
+ return std::shared_ptr<const protocol_t>();
}
std::fprintf(stderr, "loaded protocol `%s' version %s\n", proto->get_name(), proto->get_version());
- return proto;
+ return std::shared_ptr<const protocol_t>(proto, dlcloser(handle));
}
}