[libcxx-commits] [libcxx] [libc++] Improve performance of std::atomic_flag on Windows (PR #163524)
Roger Sanders via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Oct 26 02:29:05 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"));
----------------
RogerSanders wrote:
Actually, I take it back - HMODULE is officially documented/codified as being the "base address of the module in memory". I knew it was, but thought that was an implementation detail. Turns out its codified (these days at least). More than that, HANDLE itself is defined as being of type PVOID, so it turns out you can use the std::unique_ptr wrapper trick with a guarantee of forwards compatibility.
https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types
https://github.com/llvm/llvm-project/pull/163524
More information about the libcxx-commits
mailing list