added functions to load/unload modules
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
#include "stk.h"
|
#include "stk.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void *platform_load_library(const char *path);
|
||||||
|
void platform_unload_library(void *handle);
|
||||||
|
void *platform_get_symbol(void *handle, const char *symbol);
|
||||||
|
|
||||||
typedef void (*stk_module_func)(void);
|
typedef void (*stk_module_func)(void);
|
||||||
|
|
||||||
static void **stk_handles = NULL;
|
static void **stk_handles = NULL;
|
||||||
@@ -10,3 +14,49 @@ static stk_module_func *stk_shutdowns = NULL;
|
|||||||
static size_t module_count = 0;
|
static size_t module_count = 0;
|
||||||
|
|
||||||
size_t stk_module_count(void) { return module_count; }
|
size_t stk_module_count(void) { return module_count; }
|
||||||
|
|
||||||
|
static int stk_module_load(const char *path)
|
||||||
|
{
|
||||||
|
void *handle;
|
||||||
|
stk_module_func init_func;
|
||||||
|
stk_module_func shutdown_func;
|
||||||
|
|
||||||
|
handle = platform_load_library(path);
|
||||||
|
if (!handle)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
init_func =
|
||||||
|
(stk_module_func)platform_get_symbol(handle, "stk_module_init");
|
||||||
|
shutdown_func =
|
||||||
|
(stk_module_func)platform_get_symbol(handle, "stk_module_shutdown");
|
||||||
|
|
||||||
|
if (!init_func || !shutdown_func) {
|
||||||
|
platform_unload_library(handle);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
stk_handles[module_count] = handle;
|
||||||
|
stk_inits[module_count] = init_func;
|
||||||
|
stk_shutdowns[module_count] = shutdown_func;
|
||||||
|
|
||||||
|
init_func();
|
||||||
|
|
||||||
|
++module_count;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stk_module_unload(size_t index)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
stk_shutdowns[index]();
|
||||||
|
platform_unload_library(stk_handles[index]);
|
||||||
|
|
||||||
|
for (i = index; i < module_count - 1; ++i) {
|
||||||
|
stk_handles[i] = stk_handles[i + 1];
|
||||||
|
stk_inits[i] = stk_inits[i + 1];
|
||||||
|
stk_shutdowns[i] = stk_shutdowns[i + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
--module_count;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user