cOMS/platform/linux/Library.cpp

82 lines
1.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Jingga
*
* @copyright Jingga
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
#ifndef TOS_PLATFORM_LINUX_LIBRARY_C
#define TOS_PLATFORM_LINUX_LIBRARY_C
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "../../stdlib/Types.h"
#include "../../utils/StringUtils.h"
#include "../../system/Library.h"
#include "UtilsLinux.h"
inline
bool library_load(Library* lib)
{
char dst[PATH_MAX];
str_concat_new(dst, lib->dir, lib->dst);
// In debug mode, we create a copy at runtime, so we can recompile & reload it
#if DEBUG || INTERNAL
char src[PATH_MAX];
size_t dst_len = str_length(dst);
memcpy(src, dst, dst_len + 1);
str_insert(dst, dst_len - (sizeof(".so") - 1), "_temp");
lib->last_load = file_last_modified(src);
file_copy(src, dst);
#endif
// Unload any previous instance of the library if its already loaded
if (lib->handle) {
dlclose(lib->handle);
lib->handle = NULL;
usleep(100000); // 100 ms
}
// @question we might want RTLD_NOW?
lib->handle = dlopen(dst, RTLD_LAZY);
if (!lib->handle) {
lib->is_valid = false;
return lib->is_valid;
}
lib->is_valid = true;
for (int32 c = 0; c < lib->function_count; ++c) {
void* function = dlsym(lib->handle, lib->function_names[c]);
if (function) {
lib->functions[c] = function;
} else {
lib->is_valid = false;
}
}
return lib->is_valid;
}
inline
void library_unload(Library* lib)
{
if (lib->handle) {
dlclose(lib->handle);
lib->handle = NULL;
}
for (int32 c = 0; c < lib->function_count; ++c) {
lib->functions[c] = NULL;
}
}
#endif