From d370683de524720f43fafb41a1f59529aa29fbf6 Mon Sep 17 00:00:00 2001 From: Dario Rexin Date: Fri, 18 Nov 2022 14:01:37 -0800 Subject: [PATCH] Ensure libdispatch is always initialized before CoreFoundation This has been causing async functions to not return when using static linking. rdar://96642321 --- CoreFoundation/Base.subproj/CFRuntime.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CoreFoundation/Base.subproj/CFRuntime.c b/CoreFoundation/Base.subproj/CFRuntime.c index 17a3ca827c..1bfdf97fd6 100644 --- a/CoreFoundation/Base.subproj/CFRuntime.c +++ b/CoreFoundation/Base.subproj/CFRuntime.c @@ -1171,10 +1171,20 @@ CF_EXPORT CF_PRIVATE os_unfair_recursive_lock CFPlugInGlobalDataLock; +#if __HAS_DISPATCH__ +extern void libdispatch_init(); +#endif + void __CFInitialize(void) { if (!__CFInitialized && !__CFInitializing) { __CFInitializing = 1; +#if __HAS_DISPATCH__ + // libdispatch has to be initialized before CoreFoundation, so to avoid + // issues with static initializer ordering, we are doing it explicitly. + libdispatch_init(); +#endif + // This is a no-op on Darwin, but is needed on Linux and Windows. _CFPerformDynamicInitOfOSRecursiveLock(&CFPlugInGlobalDataLock);