summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Duncan Ogilvie2024-11-26 18:27:44 +0100
committerGravatar Duncan Ogilvie2024-11-26 18:27:44 +0100
commit7d3cc96077d859fcda6dfe2a6bd2b1eb589af66d (patch)
tree2b4725c7eb4557163510efee1d549e461073559b
parent2373fca9f98a718f3fb9d3cc0c109c21acf8ecf2 (diff)
downloadlibimobiledevice-glue-7d3cc96077d859fcda6dfe2a6bd2b1eb589af66d.tar.gz
libimobiledevice-glue-7d3cc96077d859fcda6dfe2a6bd2b1eb589af66d.tar.bz2
Switch to better initializer strategy
-rw-r--r--src/glue.c70
1 files changed, 27 insertions, 43 deletions
diff --git a/src/glue.c b/src/glue.c
index 2198285..8913f7f 100644
--- a/src/glue.c
+++ b/src/glue.c
@@ -29,55 +29,39 @@
#include "common.h"
#include "libimobiledevice-glue/thread.h"
-extern void term_colors_init();
-
-static void internal_glue_init(void)
-{
- term_colors_init();
-}
-
-static void internal_glue_deinit(void)
-{
-
-}
-
-static thread_once_t init_once = THREAD_ONCE_INIT;
-static thread_once_t deinit_once = THREAD_ONCE_INIT;
+// Reference: https://stackoverflow.com/a/2390626/1806760
+// Initializer/finalizer sample for MSVC and GCC/Clang.
+// 2010-2016 Joe Lowe. Released into the public domain.
-#ifndef HAVE_ATTRIBUTE_CONSTRUCTOR
- #if defined(__llvm__) || defined(__GNUC__)
- #define HAVE_ATTRIBUTE_CONSTRUCTOR
- #endif
+#ifdef __cplusplus
+ #define INITIALIZER(f) \
+ static void f(void); \
+ struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \
+ static void f(void)
+#elif defined(_MSC_VER)
+ #pragma section(".CRT$XCU",read)
+ #define INITIALIZER2_(f,p) \
+ static void f(void); \
+ __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \
+ __pragma(comment(linker,"/include:" p #f "_")) \
+ static void f(void)
+ #ifdef _WIN64
+ #define INITIALIZER(f) INITIALIZER2_(f,"")
+ #else
+ #define INITIALIZER(f) INITIALIZER2_(f,"_")
+ #endif
+#else
+ #define INITIALIZER(f) \
+ static void f(void) __attribute__((__constructor__)); \
+ static void f(void)
#endif
-#ifdef HAVE_ATTRIBUTE_CONSTRUCTOR
-static void __attribute__((constructor)) limd_glue_initialize(void)
-{
- thread_once(&init_once, internal_glue_init);
-}
+extern void term_colors_init();
-static void __attribute__((destructor)) limd_glue_deinitialize(void)
+INITIALIZER(internal_glue_init)
{
- thread_once(&deinit_once, internal_glue_deinit);
-}
-#elif defined(WIN32)
-BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
-{
- switch (dwReason) {
- case DLL_PROCESS_ATTACH:
- thread_once(&init_once, internal_glue_init);
- break;
- case DLL_PROCESS_DETACH:
- thread_once(&deinit_once, internal_glue_deinit);
- break;
- default:
- break;
- }
- return 1;
+ term_colors_init();
}
-#else
-#warning No compiler support for constructor/destructor attributes, some features might not be available.
-#endif
const char* libimobiledevice_glue_version()
{