diff --git a/userspace/libhawk/exception.h b/userspace/libhawk/exception.h index e4f8f057..27793e7c 100644 --- a/userspace/libhawk/exception.h +++ b/userspace/libhawk/exception.h @@ -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 diff --git a/userspace/libhawk/library.cpp b/userspace/libhawk/library.cpp index 4d73534c..74398960 100644 --- a/userspace/libhawk/library.cpp +++ b/userspace/libhawk/library.cpp @@ -19,16 +19,41 @@ limitations under the License. #include -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(); +} diff --git a/userspace/libhawk/library.h b/userspace/libhawk/library.h index 3dd74222..9b3c7905 100644 --- a/userspace/libhawk/library.h +++ b/userspace/libhawk/library.h @@ -17,15 +17,22 @@ limitations under the License. #pragma once #include +#include + 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 m_library_handle; }; }; // namespace libhawk