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; |
