update: library management code

Signed-off-by: Lorenzo Fontana <lo@linux.com>
This commit is contained in:
Lorenzo Fontana
2020-12-18 19:05:38 +01:00
parent 4ccbd9d194
commit 24e2d175f0
3 changed files with 43 additions and 4 deletions

View File

@@ -34,4 +34,11 @@ class hawk_library_load_exception : public hawk_library_exception
hawk_library_load_exception(const std::string&library_name, const std::string&message):
hawk_library_exception("library loading error, library: " + library_name + " error: " + message) {}
};
class hawk_library_unload_exception : public hawk_library_exception
{
public:
hawk_library_unload_exception(const std::string&library_name, const std::string&message):
hawk_library_exception("library unloading error, library: " + library_name + " error: " + message) {}
};
} // namespace libhawk

View File

@@ -19,16 +19,41 @@ limitations under the License.
#include <dlfcn.h>
libhawk::library::library(const std::string &filename) : m_library_filename(filename) {};
libhawk::library::library(const std::string &filename):
m_library_filename(filename){};
bool libhawk::library::load()
{
void *handler = nullptr;
library_handle handler = nullptr;
handler = dlopen(m_library_filename.c_str(), RTLD_NOW);
if (!handler) {
if(!handler)
{
std::string errmsg(dlerror());
throw hawk_library_load_exception(m_library_filename, errmsg);
}
//todo(fntlnz): need to store the handler or anything to use the library?
m_library_handle.store(handler);
return (handler != nullptr);
}
bool libhawk::library::unload()
{
if(!m_library_handle.load())
{
return false;
}
library_handle handler = m_library_handle.load();
if(!dlclose(handler))
{
std::string errmsg(dlerror());
throw hawk_library_unload_exception(m_library_filename, errmsg);
return false;
}
m_library_handle.store(nullptr);
return true;
}
bool libhawk::library::is_loaded() const
{
return m_library_handle && m_library_handle.load();
}

View File

@@ -17,15 +17,22 @@ limitations under the License.
#pragma once
#include <string>
#include <atomic>
namespace libhawk
{
class library
{
public:
using library_handle = void *;
library(const std::string &filename);
bool load();
bool unload();
bool is_loaded() const;
~library();
private:
std::string m_library_filename;
std::atomic<library_handle> m_library_handle;
};
}; // namespace libhawk