summaryrefslogtreecommitdiffhomepage
path: root/dev/CompilerKit/utils
diff options
context:
space:
mode:
Diffstat (limited to 'dev/CompilerKit/utils')
-rw-r--r--dev/CompilerKit/utils/DylibHelpers.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/dev/CompilerKit/utils/DylibHelpers.h b/dev/CompilerKit/utils/DylibHelpers.h
index 1ae7c03..31e0b68 100644
--- a/dev/CompilerKit/utils/DylibHelpers.h
+++ b/dev/CompilerKit/utils/DylibHelpers.h
@@ -7,7 +7,57 @@
#pragma once
#include <CompilerKit/Defines.h>
+#include <mutex>
#include <dlfcn.h>
+struct CompilerKitDylibTraits;
+
typedef Int32 (*CompilerKitEntrypoint)(Int32 argc, Char const* argv[]);
typedef VoidPtr CompilerKitDylib;
+
+struct CompilerKitDylibTraits final {
+ CompilerKitDylib fDylib{nullptr};
+ CompilerKitEntrypoint fEntrypoint{nullptr};
+ std::mutex fMutex;
+
+ CompilerKitDylibTraits& operator()(const Char* path, const Char* fEntrypoint) {
+ std::lock_guard<std::mutex> lock(this->fMutex);
+
+ if (!path || !fEntrypoint) return *this;
+
+ if (this->fDylib) {
+ dlclose(this->fDylib);
+ this->fDylib = nullptr;
+ }
+
+ this->fDylib = dlopen(path, RTLD_LAZY);
+
+ if (!this->fDylib) {
+ return *this;
+ }
+
+ this->fEntrypoint = (CompilerKitEntrypoint)dlsym(this->fDylib, fEntrypoint);
+
+ if (!this->fEntrypoint) {
+ dlclose(this->fDylib);
+ this->fDylib = nullptr;
+
+ return *this;
+ }
+
+ return *this;
+ }
+
+ NECTI_COPY_DELETE(CompilerKitDylibTraits);
+
+ CompilerKitDylibTraits() = default;
+
+ ~CompilerKitDylibTraits() {
+ if (this->fDylib) {
+ dlclose(this->fDylib);
+ this->fDylib = nullptr;
+ }
+
+ this->fEntrypoint = nullptr;
+ }
+};