Return result with more error information when opening a shared library fails.

This commit is contained in:
Patrick 2024-07-29 21:48:04 +02:00
parent a9a85aecdf
commit f6f77f6dc1
4 changed files with 29 additions and 8 deletions

View File

@ -61,6 +61,14 @@ public:
struct ResultError struct ResultError
{ {
std::string message; std::string message;
ResultError() : message("Unknown error") {}
ResultError(const ResultError&) = default;
ResultError(ResultError&&) noexcept = default;
ResultError(std::string msg) noexcept : message(std::move(msg)) {}
ResultError& operator=(const ResultError&) = default;
ResultError& operator=(ResultError&&) noexcept = default;
}; };
template<typename TSuccess> template<typename TSuccess>

View File

@ -39,11 +39,18 @@ namespace mijin
// public functions // public functions
// //
LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept Result<LibraryHandle> openSharedLibrary(std::string_view libraryFile) noexcept
{ {
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX #if MIJIN_TARGET_OS == MIJIN_OS_LINUX
dlerror();
const fs::path libraryPath = fs::absolute(libraryFile); const fs::path libraryPath = fs::absolute(libraryFile);
return {.data = dlopen(libraryPath.c_str(), RTLD_NOW)}; void* ptr = dlopen(libraryPath.c_str(), RTLD_NOW);
if (ptr == nullptr)
{
return ResultError(dlerror());
}
return LibraryHandle{.data = dlopen(libraryPath.c_str(), RTLD_NOW)};
#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS #elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
// TODO // TODO
(void) libraryFile; (void) libraryFile;

View File

@ -9,6 +9,7 @@
#include <string_view> #include <string_view>
#include <utility> #include <utility>
#include "../detect.hpp" #include "../detect.hpp"
#include "../types/result.hpp"
namespace mijin namespace mijin
{ {
@ -62,7 +63,7 @@ public:
constexpr operator bool() const noexcept { return static_cast<bool>(mHandle); } constexpr operator bool() const noexcept { return static_cast<bool>(mHandle); }
constexpr bool operator!() const noexcept { return !mHandle; } constexpr bool operator!() const noexcept { return !mHandle; }
[[nodiscard]] inline bool open(std::string_view libraryFile) noexcept; [[nodiscard]] inline Result<bool> open(std::string_view libraryFile) noexcept;
inline bool close() noexcept; inline bool close() noexcept;
[[nodiscard]] inline void* loadSymbol(const char* symbolName) noexcept; [[nodiscard]] inline void* loadSymbol(const char* symbolName) noexcept;
}; };
@ -71,7 +72,7 @@ public:
// public functions // public functions
// //
[[nodiscard]] LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept; [[nodiscard]] Result<LibraryHandle> openSharedLibrary(std::string_view libraryFile) noexcept;
bool closeSharedLibrary(const LibraryHandle library) noexcept; bool closeSharedLibrary(const LibraryHandle library) noexcept;
[[nodiscard]] void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept; [[nodiscard]] void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept;
void setCurrentThreadName(const char* threadName) noexcept; void setCurrentThreadName(const char* threadName) noexcept;
@ -83,11 +84,16 @@ SharedLibrary::~SharedLibrary() noexcept
close(); close();
} }
bool SharedLibrary::open(std::string_view libraryFile) noexcept Result<bool> SharedLibrary::open(std::string_view libraryFile) noexcept
{ {
close(); close();
mHandle = openSharedLibrary(libraryFile); Result<LibraryHandle> openResult = openSharedLibrary(libraryFile);
return static_cast<bool>(mHandle); if (openResult.isSuccess())
{
mHandle = openResult.getValue();
return true;
}
return ResultError(openResult.getError());
} }
bool SharedLibrary::close() noexcept bool SharedLibrary::close() noexcept

View File

@ -80,7 +80,7 @@ public:
Property(Property&&) noexcept = default; Property(Property&&) noexcept = default;
Property& operator=(Property&&) noexcept = default; Property& operator=(Property&&) noexcept = default;
PropertyProxy operator*() const noexcept { return PropertyProxy(this); } PropertyProxy operator*() noexcept { return PropertyProxy(this); }
std::remove_reference_t<TGet>* operator->() const noexcept { return &get(); } std::remove_reference_t<TGet>* operator->() const noexcept { return &get(); }
[[nodiscard]] TGet get() const noexcept [[nodiscard]] TGet get() const noexcept