diff options
-rw-r--r-- | configure.ac | 18 | ||||
-rw-r--r-- | src/idevice.c | 28 |
2 files changed, 36 insertions, 10 deletions
diff --git a/configure.ac b/configure.ac index ed9270c..cdd388b 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -83,6 +83,24 @@ case ${host_os} in | |||
83 | esac | 83 | esac |
84 | AM_CONDITIONAL(WIN32, test x$win32 = xtrue) | 84 | AM_CONDITIONAL(WIN32, test x$win32 = xtrue) |
85 | 85 | ||
86 | # Check if the C compiler supports __attribute__((constructor)) | ||
87 | AC_CACHE_CHECK([wether the C compiler supports constructor/destructor attributes], | ||
88 | ac_cv_attribute_constructor, [ | ||
89 | ac_cv_attribute_constructor=no | ||
90 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM( | ||
91 | [[ | ||
92 | static void __attribute__((constructor)) test_constructor(void) { | ||
93 | } | ||
94 | static void __attribute__((destructor)) test_destructor(void) { | ||
95 | } | ||
96 | ]], [])], | ||
97 | [ac_cv_attribute_constructor=yes] | ||
98 | )] | ||
99 | ) | ||
100 | if test "$ac_cv_attribute_constructor" = "yes"; then | ||
101 | AC_DEFINE(HAVE_ATTRIBUTE_CONSTRUCTOR, 1, [Define if the C compiler supports constructor/destructor attributes]) | ||
102 | fi | ||
103 | |||
86 | AC_CHECK_MEMBER(struct dirent.d_type, AC_DEFINE(HAVE_DIRENT_D_TYPE, 1, [define if struct dirent has member d_type]),, [#include <dirent.h>]) | 104 | AC_CHECK_MEMBER(struct dirent.d_type, AC_DEFINE(HAVE_DIRENT_D_TYPE, 1, [define if struct dirent has member d_type]),, [#include <dirent.h>]) |
87 | 105 | ||
88 | # Cython Python Bindings | 106 | # Cython Python Bindings |
diff --git a/src/idevice.c b/src/idevice.c index 4545bfa..6a03c5e 100644 --- a/src/idevice.c +++ b/src/idevice.c | |||
@@ -174,7 +174,23 @@ static void internal_idevice_deinit(void) | |||
174 | static thread_once_t init_once = THREAD_ONCE_INIT; | 174 | static thread_once_t init_once = THREAD_ONCE_INIT; |
175 | static thread_once_t deinit_once = THREAD_ONCE_INIT; | 175 | static thread_once_t deinit_once = THREAD_ONCE_INIT; |
176 | 176 | ||
177 | #ifdef WIN32 | 177 | #ifndef HAVE_ATTRIBUTE_CONSTRUCTOR |
178 | #if defined(__llvm__) || defined(__GNUC__) | ||
179 | #define HAVE_ATTRIBUTE_CONSTRUCTOR | ||
180 | #endif | ||
181 | #endif | ||
182 | |||
183 | #ifdef HAVE_ATTRIBUTE_CONSTRUCTOR | ||
184 | static void __attribute__((constructor)) libimobiledevice_initialize(void) | ||
185 | { | ||
186 | thread_once(&init_once, internal_idevice_init); | ||
187 | } | ||
188 | |||
189 | static void __attribute__((destructor)) libimobiledevice_deinitialize(void) | ||
190 | { | ||
191 | thread_once(&deinit_once, internal_idevice_deinit); | ||
192 | } | ||
193 | #elif defined(WIN32) | ||
178 | BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) | 194 | BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) |
179 | { | 195 | { |
180 | switch (dwReason) { | 196 | switch (dwReason) { |
@@ -190,15 +206,7 @@ BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) | |||
190 | return 1; | 206 | return 1; |
191 | } | 207 | } |
192 | #else | 208 | #else |
193 | static void __attribute__((constructor)) libimobiledevice_initialize(void) | 209 | #warning No compiler support for constructor/destructor attributes, some features might not be available. |
194 | { | ||
195 | thread_once(&init_once, internal_idevice_init); | ||
196 | } | ||
197 | |||
198 | static void __attribute__((destructor)) libimobiledevice_deinitialize(void) | ||
199 | { | ||
200 | thread_once(&deinit_once, internal_idevice_deinit); | ||
201 | } | ||
202 | #endif | 210 | #endif |
203 | 211 | ||
204 | static idevice_event_cb_t event_cb = NULL; | 212 | static idevice_event_cb_t event_cb = NULL; |