Update to LibConf system, added loading of dynamic libraries (only Linux for now) and some more fixes.

This commit is contained in:
Patrick 2023-05-31 23:41:22 +02:00
parent da781b87f2
commit 920e83d4da
7 changed files with 106 additions and 52 deletions

29
LibConf Normal file
View File

@ -0,0 +1,29 @@
Import('env')
mijin_sources = Split("""
source/mijin/async/coroutine.cpp
source/mijin/debug/symbol_info.cpp
source/mijin/io/stream.cpp
source/mijin/memory/data_pool.cpp
source/mijin/util/os.cpp
source/mijin/types/name.cpp
source/mijin/virtual_filesystem/filesystem.cpp
source/mijin/virtual_filesystem/stacked.cpp
""")
env.UnityStaticLibrary(
target = env['LIB_DIR'] + '/mijin_sekiei',
source = mijin_sources
)
LIB_CONFIG = {
'CPPPATH': [env.Dir('source')],
'CPPDEFINES': [],
'LIBS': ['mijin_sekiei']
}
if env['BUILD_TYPE'] == 'debug':
LIB_CONFIG['CPPDEFINES'].extend(['MIJIN_DEBUG=1', 'MIJIN_CHECKED_ITERATORS=1'])
Return('LIB_CONFIG')

View File

@ -1,24 +0,0 @@
Import('env')
mijin_sources = Split("""
async/coroutine.cpp
debug/symbol_info.cpp
io/stream.cpp
memory/data_pool.cpp
util/os.cpp
types/name.cpp
virtual_filesystem/filesystem.cpp
virtual_filesystem/stacked.cpp
""")
env.UnityStaticLibrary(
target = env['LIB_DIR'] + '/mijin_sekiei',
source = mijin_sources
)
LIB_CONFIG = {
'LIBS': ['mijin_sekiei']
}
Return('LIB_CONFIG')

View File

@ -110,7 +110,7 @@ inline void Signal<TArgs...>::emit(TArgs&&... args) noexcept
// invoke all handlers
for (RegisteredHandler& handler : handlers_)
{
handler.callable(forward<TArgs>(args)...);
handler.callable(std::forward<TArgs>(args)...);
}
// remove any oneshot

View File

@ -52,7 +52,7 @@ public:
#if MIJIN_BOXED_OBJECT_DEBUG
~BoxedObject()
{
MIJIN_ASSERT(!constructed, "BoxedObject::~BoxedObject(): Object has not been destroy prior to destructor!")
MIJIN_ASSERT(!constructed, "BoxedObject::~BoxedObject(): Object has not been destroyed prior to destructor!")
}
#endif
@ -179,7 +179,7 @@ template<typename T>
T& BoxedObjectIterator<T>::operator*() const
{
#if MIJIN_CHECKED_ITERATORS
MIJIN_ASSERT(box_ >= start_ && box < end_, "BoxedObjectIterator::operator->(): Attempt to dereference out-of-range iterator.");
MIJIN_ASSERT(box_ >= start_ && box_ < end_, "BoxedObjectIterator::operator->(): Attempt to dereference out-of-range iterator.");
#endif
return box_->get();
}

View File

@ -6,13 +6,7 @@
#include <cstdio>
#include <cstdlib>
namespace mijin
{
//
// public defines
//
#include <source_location>
#if MIJIN_DEBUG
#ifdef _WIN32
@ -25,9 +19,19 @@ extern "C" __declspec(dllimport) void __stdcall DebugBreak();
#define MIJIN_TRAP() raise(SIGTRAP)
#define MIJIN_FUNC() "" // TODO: __PRETTY_FUNCTION__ is not working for some reason -.-
#endif // !_WIN32
#endif // MIJIN_DEBUG
#define MIJIN_DO_RAISE_ERROR(msg, func, file, line) \
switch (mijin::handleError(msg, func, file, line)) \
namespace mijin
{
//
// public defines
//
#if MIJIN_DEBUG
#define MIJIN_DO_RAISE_ERROR(msg, source_loc) \
switch (mijin::handleError(msg, source_loc)) \
{ \
case mijin::ErrorHandling::CONTINUE: \
break; \
@ -41,7 +45,7 @@ switch (mijin::handleError(msg, func, file, line)) \
#define MIJIN_RAISE_ERROR(msg, func, file, line) MIJIN_DO_RAISE_ERROR(msg, func, file, line)
#define MIJIN_ERROR(msg) \
MIJIN_RAISE_ERROR(msg, MIJIN_FUNC(), __FILE__, __LINE__)
MIJIN_DO_RAISE_ERROR(msg, std::source_location::current())
#define MIJIN_FATAL(msg) \
MIJIN_ERROR(msg) \
@ -129,13 +133,11 @@ constexpr AssertionResult handleAssert(const char* /* condition */,
ErrorHandling handleError(const char* message, const char* function,
const char* file, int line) noexcept;
#else
inline ErrorHandling handleError(const char* message, const char* function,
const char* file, int line) noexcept
inline ErrorHandling handleError(const char* message, const std::source_location& location) noexcept
{
std::puts(message);
std::printf("Function: %s\n", function);
std::printf("File: %s\n", file);
std::printf("Line: %d\n", line);
std::printf("Function: %s\n", location.function_name());
std::printf("Location: %s:%d:%d\n", location.file_name(), location.line(), location.column());
(void) std::fflush(stdout);
return ErrorHandling::TRAP;
}

View File

@ -1,14 +1,18 @@
#include "os.hpp"
#include <filesystem>
#include "../detect.hpp"
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
#include <dlfcn.h>
#include <pthread.h>
#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
// TODO
#endif
namespace fs = std::filesystem;
namespace mijin
{
@ -36,7 +40,24 @@ namespace mijin
// public functions
//
void setCurrentThreadName(const char* threadName)
LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept
{
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
const fs::path libraryPath = fs::absolute(libraryFile);
return {.data = dlopen(libraryPath.c_str(), RTLD_NOW)};
#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
#endif
}
void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept
{
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
return dlsym(library.data, symbolName);
#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
#endif
}
void setCurrentThreadName(const char* threadName) noexcept
{
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
pthread_setname_np(pthread_self(), threadName);
@ -44,4 +65,15 @@ void setCurrentThreadName(const char* threadName)
#endif
}
[[nodiscard]] std::string makeLibraryFilename(std::string_view libraryName) noexcept
{
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
return "lib" + std::string(libraryName) + ".so";
#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
return std::string(libraryName) + ".dll";
#else
#endif
}
} // namespace mijin

View File

@ -4,6 +4,9 @@
#if !defined(MIJIN_UTIL_OS_HPP_INCLUDED)
#define MIJIN_UTIL_OS_HPP_INCLUDED 1
#include <string>
#include <string_view>
namespace mijin
{
@ -19,11 +22,23 @@ namespace mijin
// public types
//
struct LibraryHandle
{
void* data = nullptr;
constexpr operator bool() const noexcept { return data != nullptr; }
constexpr bool operator!() const noexcept { return data == nullptr; }
};
//
// public functions
//
void setCurrentThreadName(const char* threadName);
[[nodiscard]] LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept;
[[nodiscard]] void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept;
void setCurrentThreadName(const char* threadName) noexcept;
[[nodiscard]] std::string makeLibraryFilename(std::string_view libraryName) noexcept;
} // namespace mijin