|
6 | 6 | #include "fastfetch.h" |
7 | 7 | #include "util/FFcheckmacros.h" |
8 | 8 |
|
9 | | -#if defined(_WIN32) //We don't force MSYS using LoadLibrary because dlopen also searches $LD_LIBRARY_PATH |
| 9 | +#if defined(_WIN32) |
10 | 10 | #include <libloaderapi.h> |
11 | 11 | #define FF_DLOPEN_FLAGS 0 |
12 | 12 | FF_C_NODISCARD static inline void* dlopen(const char* path, int mode) { FF_UNUSED(mode); return LoadLibraryA(path); } |
|
24 | 24 | #define FF_LIBRARY_EXTENSION ".so" |
25 | 25 | #endif |
26 | 26 |
|
| 27 | +static inline void ffLibraryUnload(void** handle) |
| 28 | +{ |
| 29 | + assert(handle); |
| 30 | + if (*handle) |
| 31 | + dlclose(*handle); |
| 32 | +} |
| 33 | + |
27 | 34 | #define FF_LIBRARY_SYMBOL(symbolName) \ |
28 | 35 | __typeof__(&symbolName) ff ## symbolName; |
29 | 36 |
|
30 | 37 | #define FF_LIBRARY_LOAD(libraryObjectName, userLibraryName, returnValue, ...) \ |
31 | | - void* libraryObjectName = ffLibraryLoad(userLibraryName, __VA_ARGS__, NULL);\ |
| 38 | + void* __attribute__((__cleanup__(ffLibraryUnload))) libraryObjectName = ffLibraryLoad(userLibraryName, __VA_ARGS__, NULL);\ |
32 | 39 | if(libraryObjectName == NULL) \ |
33 | 40 | return returnValue; |
34 | 41 |
|
35 | 42 | #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \ |
36 | 43 | symbolMapping = dlsym(library, #symbolName); \ |
37 | 44 | if(symbolMapping == NULL) \ |
38 | | - { \ |
39 | | - dlclose(library); \ |
40 | | - return returnValue; \ |
41 | | - } |
| 45 | + return returnValue; |
42 | 46 |
|
43 | 47 | #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, symbolMapping, symbolName, alternateName, returnValue) \ |
44 | 48 | symbolMapping = dlsym(library, #symbolName); \ |
45 | 49 | if(symbolMapping == NULL && !(symbolMapping = dlsym(library, #alternateName))) \ |
46 | | - { \ |
47 | | - dlclose(library); \ |
48 | | - return returnValue; \ |
49 | | - } |
| 50 | + return returnValue; |
50 | 51 |
|
51 | 52 | #define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \ |
52 | 53 | __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue); |
|
0 commit comments