From e6e1c1f34ab264404469ee6bdd7d31635f6f5b3a 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 3d25ea2f1b..40f19be733 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);