On Mon, Nov 10, 2025, at 8:17 AM, Thomas Munro wrote: > Hi, > > Here is an experimental patch to try out standard C (and C++) atomics > to implement port/atomics.h, and also add more types and operations. > It's mostly just redirecting our names to the standard ones, except > for our barriers and slightly extended pg_atomic_flag, so there isn't > much left of the code. > > Here also is a semi-independent patch to implement storage/spin.h with > pg_atomic_flag. It keeps a small amount of the architecture-specific > magic, but moves it out to src/port/spin_delay.h. > > I'm not saying they're correct, performant or portable yet, that'll > require studying codegen and performance on a bunch of weird and > wonderful systems, but they at least passes basic testing on the usual > suspects and CI systems, except for Windows which needs a newer > toolchain so I haven't tried yet. It should hopefully just work™ on > VS 2022 (same version that provides <threads.h>, about which more > soon). > > All that being the case, it's not far enough along to be a serious > proposal, but I imagine others will be looking into things like this > since we pulled the trigger on C11 and I figured I might as well share > a basic working patch set to avoid duplicated effort... Hopefully it > works well enough to kick the tyres and try to find the difficult > problems, test it out on weird systems, etc etc. > > Attachments: > * v1-0001-Add-some-missing-include-limits.h.patch > * v1-0002-Redefine-port-atomics.h-on-top-of-stdatomic.h.patch > * v1-0003-Use-atomics-API-to-implement-spinlocks.patch > * v1-0004-Remove-configure-meson-checks-for-atomics.patch
Hello Thomas,
First off, thanks for working on this set of changes. I like your changes in
general, except for removing Solaris/Illumos (but I get it). ;-P
As mentioned on a separate thread about fixing ARM64 support when building with
MSVC on Win11 [1] I tried out this patch. The reply on that thread had an
issue with _mm_pause() in spin_delay(), it turns out we need to use __yield()
[2]. I went ahead and fixed that, so ignore that patch on the other thread
[1]. The new patch attached that layers on top of your work and supports that
platform, there was one minor change that was required:
#ifdef _MSC_VER
/*
* If using Visual C++ on Win64, inline assembly is unavailable. Use a
* _mm_pause intrinsic instead of rep nop. For ARM64, use the __yield()
* intrinsic which emits the YIELD instruction as a hint to the
processor.
*/
#if defined(_M_ARM64)
__yield();
#elif defined(_WIN64)
_mm_pause();
#else
/* See comment for gcc code. Same code, MASM syntax */
__asm rep nop;
#endif
#endif /* _MSC_VER */
Visual Studio 2026 (Community)
cl (msvc 19.50.35718 "Microsoft (R) C/C++ Optimizing Compiler Version
19.50.35718 for ARM64")
link 14.50.35718.0
tests are passing, best.
-greg
[1]
https://www.postgresql.org/message-id/3c576ad7-d2da-4137-b791-5821da7cc370%40app.fastmail.com
[2]
https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-180
v20251123-0001-WIP-ARM64-MSVC-stdatomic.patch
Description: Binary data
