From 4cb29fbc2d20f20e9d605796b137b4b70363113a Mon Sep 17 00:00:00 2001 From: 0scar Date: Fri, 28 Jul 2023 16:32:58 +0200 Subject: Implement hotloading * This commit implements dltools.{c,h}: _A simple wrapper around libdl / dlfcn.h_ * Reload states when done initializing engine, if hotloading is enabled. * Adds general function types for state functions. --- src/dltools.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/dltools.c (limited to 'src/dltools.c') diff --git a/src/dltools.c b/src/dltools.c new file mode 100644 index 0000000..de7c83b --- /dev/null +++ b/src/dltools.c @@ -0,0 +1,62 @@ +#include +#include + +#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32) + /* include winapi */ +#else +#include +#endif + +#include +#include + +bool +dynamic_library_close(void* shared_library) { +#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32) + return true; +#else + return dlclose(shared_library) == 0; +#endif +} + +void* +dynamic_library_open(const char *library_path) { +#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32) + return NULL; +#else + return dlopen(library_path, RTLD_NOW); +#endif +} + +char* dynamic_library_get_error(void) { +#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32) + return "unsupported on windows"; +#else + return dlerror(); +#endif +} + +void* +dynamic_library_reload(void* shared_library, const char *library_path) { + void* library_address = NULL; + if (!dynamic_library_close(shared_library)) { + ERROR("Failed to close shared library: %s", dynamic_library_get_error()); + ERROR("Reloading dynamic library failed."); + return library_address; + } + if ((library_address = dynamic_library_open(library_path)) == NULL) { + ERROR("Failed to open shared library: %s", dynamic_library_get_error()); + ERROR("Reloading dynamic library %s failed.", library_path); + } + return library_address; +} + + +void* +dynamic_library_get_symbol(void *restrict shared_library, const char *symbol) { +#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32) + return NULL; +#else + return dlsym(shared_library, symbol); +#endif +} -- cgit v1.3