Thread

  1. Re: Trying out <stdatomic.h>

    Greg Burd <greg@burd.me> — 2025-11-23T15:22:47Z

    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