[libcxx-commits] [libcxx] [libc++] Improve performance of std::atomic_flag on Windows (PR #163524)
Martin Storsjö via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Oct 26 02:43:49 PDT 2025
================
@@ -101,6 +105,46 @@ 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
+__libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {
+ // WaitOnAddress was added in Windows 8 (build 9200)
+ static auto wait_on_address = reinterpret_cast<BOOL(WINAPI*)(volatile void*, PVOID, SIZE_T, DWORD)>(
+ GetProcAddress(GetModuleHandleW(L"api-ms-win-core-synch-l1-2-0.dll"), "WaitOnAddress"));
----------------
mstorsjo wrote:
Can't we do just `GetModuleHandleW(L"kernel32.dll")` as well? If the symbol surprisingly wouldn't be found there, we'd still fall back gracefully on the slower implementation. That would avoid requiring the extra cleanup here, which blows up the complexity of the dynamic loading a bit here.
In the preexisting case in `src/chrono.cpp`, that's exactly what we do...
Then secondly, _if_ `GetModuleHandleW` returns `NULL`, I think it may be considered safe to pass that to `GetProcAddress`, although I'm not sure if any documentation specifically guarantees it?
https://github.com/llvm/llvm-project/pull/163524
More information about the libcxx-commits
mailing list