[libcxx-commits] [libcxx] [libc++] Improve performance of std::atomic_flag on Windows (PR #163524)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Nov 4 04:13:26 PST 2025
================
@@ -101,6 +106,70 @@ static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const vo
_umtx_op(const_cast<__cxx_atomic_contention_t*>(__ptr), UMTX_OP_WAKE, __notify_one ? 1 : INT_MAX, nullptr, nullptr);
}
+#elif defined(_WIN32)
+
+static void* win32_get_synch_api_function(const char* function_name) {
+ // Attempt to load the API set. Note that as per the Microsoft STL implementation, we assume this API is already
+ // loaded and accessible. While this isn't explicitly guaranteed by publicly available Win32 API documentation, it is
+ // true in practice, and may be guaranteed by internal documentation not released publicly. In any case the fact that
+ // the Microsoft STL made this assumption is reasonable basis to say that we can too. The alternative to this would be
+ // to use LoadLibrary, but then leak the module handle. We can't call FreeLibrary, as this would have to be triggered
+ // by a global static destructor, which would hang off DllMain, and calling FreeLibrary from DllMain is explicitly
+ // mentioned as not being allowed:
+ // https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain
+ // Given the range of bad options here, we have chosen to mirror what Microsoft did, as it seems fair to assume that
+ // Microsoft will guarantee compatibility for us, as we are exposed to the same conditions as all existing Windows
+ // apps using the Microsoft STL VS2015/2017/2019/2022 runtimes, where Windows 7 support has not been excluded at
+ // compile time.
+ static auto module_handle = GetModuleHandleW(L"api-ms-win-core-synch-l1-2-0.dll");
+ if (module_handle == nullptr) {
+ return nullptr;
+ }
+
+ // Attempt to locate the function in the API and return the result to the caller. Note that the NULL return from this
+ // method is documented as being interchangeable with nullptr.
+ // https://devblogs.microsoft.com/oldnewthing/20180307-00/?p=98175
+ return GetProcAddress(module_handle.get(), function_name);
----------------
Alcaro wrote:
This isn't a unique_ptr anymore, so this .get() doesn't belong.
https://github.com/llvm/llvm-project/pull/163524
More information about the libcxx-commits
mailing list