diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-27 14:21:46 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-27 14:21:46 +0200 |
commit | 49652b9e2882a1c3cd5203ea91f90cdd32a090e9 (patch) | |
tree | 81bedb0a0eda97edfab1d34cc93035780b7bbb74 /mmss/protocol.cpp | |
parent | a7ccec3fefe1c01cf238a3c0931459a54c2ff3a3 (diff) | |
download | gmrf-49652b9e2882a1c3cd5203ea91f90cdd32a090e9.tar gmrf-49652b9e2882a1c3cd5203ea91f90cdd32a090e9.zip |
Some changes in memory management
Diffstat (limited to 'mmss/protocol.cpp')
-rw-r--r-- | mmss/protocol.cpp | 19 |
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)); } } |