From 9f446bdad7b60487d1c696c3ca5d10fbb01b8030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 30 Jun 2026 18:46:03 +0800 Subject: [PATCH] Common (Library): adds fast path for loading only one lib --- src/common/impl/library.c | 8 ++++---- src/common/library.h | 12 +++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/common/impl/library.c b/src/common/impl/library.c index 6f96e968b..c16e0b11d 100644 --- a/src/common/impl/library.c +++ b/src/common/impl/library.c @@ -27,7 +27,7 @@ #endif #endif -static void* libraryLoad(const char* path, int maxVersion) { +void* ffLibraryLoadSingle(const char* path, int maxVersion) { void* result = dlopen(path, FF_DLOPEN_FLAGS); #if _WIN32 @@ -81,8 +81,8 @@ static void* libraryLoad(const char* path, int maxVersion) { return result; } -void* ffLibraryLoad(const char* path, int maxVersion, ...) { - void* result = libraryLoad(path, maxVersion); +void* ffLibraryLoadMulti(const char* path, int maxVersion, ...) { + void* result = ffLibraryLoadSingle(path, maxVersion); if (!result) { va_list defaultNames; @@ -95,7 +95,7 @@ void* ffLibraryLoad(const char* path, int maxVersion, ...) { } int maxVersionRest = va_arg(defaultNames, int); - result = libraryLoad(pathRest, maxVersionRest); + result = ffLibraryLoadSingle(pathRest, maxVersionRest); } while (!result); va_end(defaultNames); diff --git a/src/common/library.h b/src/common/library.h index 97500ac9e..a584fbfc8 100644 --- a/src/common/library.h +++ b/src/common/library.h @@ -35,9 +35,10 @@ static inline void ffLibraryUnload(void** handle) { #define FF_LIBRARY_SYMBOL(symbolName) \ __typeof__(&symbolName) ff##symbolName; - #define FF_LIBRARY_LOAD(libraryObjectName, returnValue, ...) \ - void* FF_A_CLEANUP(ffLibraryUnload) libraryObjectName = ffLibraryLoad(__VA_ARGS__, NULL); \ - if (libraryObjectName == NULL) \ + #define FF_LIBRARY_LOAD(libraryObjectName, returnValue, libraryFileName, maxVersion, ...) \ + void* FF_A_CLEANUP(ffLibraryUnload) libraryObjectName = ffLibraryLoadSingle(libraryFileName, maxVersion); \ + __VA_OPT__(if (__builtin_expect(libraryObjectName == NULL, false)) libraryObjectName = ffLibraryLoadMulti(__VA_ARGS__, NULL);) \ + if (__builtin_expect(libraryObjectName == NULL, false)) \ return returnValue; #define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \ @@ -45,7 +46,7 @@ static inline void ffLibraryUnload(void** handle) { #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \ symbolMapping = (__typeof__(&symbolName)) dlsym(library, #symbolName); \ - if (symbolMapping == NULL) \ + if (__builtin_expect(symbolMapping == NULL, false)) \ return returnValue; #define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \ @@ -66,7 +67,8 @@ static inline void ffLibraryUnload(void** handle) { #define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \ FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff##symbolName, symbolName, returnValue); -void* ffLibraryLoad(const char* path, int maxVersion, ...); +void* ffLibraryLoadSingle(const char* path, int maxVersion); +void* ffLibraryLoadMulti(const char* path, int maxVersion, ...); #else