On 2026-08-11 11:00, Bruno Haible wrote:
I think we're not far from the point where we can bump the
minimum requirement from C99 to C11, and assume _Atomic (at least for small
types).

The "small types" part is a big deal. More generally, the exact set of 
assumptions is important here.

As I understand it, MSVC doesn't support _Atomic unless you use the 
/experimental:c11atomics option (which has been "experimental" for years!), and 
even then it still defines __STDC_NO_ATOMICS__ (which means ordinary portable code won't 
use _Atomic), and even then it supports only lock-free atomic types up to 64 bits.

Also, as I discovered when fixing hamt.h, for ease of header portability between C 
and C++, it's not enough for an implementation to support the _Atomic type qualifier 
(e.g., 'char *_Atomic p;') as that doesn't work in C++; it should also support the 
_Atomic type specifier (e.g., '_Atomic (char *) p;'). However, the latter syntax 
wasn't added to C++ until C++23, which it's too early to assume yet (and even then 
one must #include <atomic>). Although we could try to backport _Atomic(T) to 
older C++ versions, that might be tricky to do correctly as strictly speaking, it 
would rely on undefined behavior in C++20 and earlier. In gnulib/lib/hamt.h I instead 
invented and used GL_HAMT_ATOMIC, as I didn't want to assume C++23 when compiling 
with C++. Not an entirely satisfactory solution but there it is.




_Atomic is supported in
   - gcc >= 4.9
   - clang >= 4
   - MSVC since 2026 [1],
   - Fil-C (for small types only [2])
but
   - requires a special compiler option with Sun C: -xatomic=studio,

With Oracle Developer Studio 12.6 (the only Sun C that supports C11 _Atomic) 
there's another issue: if you compile with -xatomic=studio, the resulting 
programs are dynamically linked to 
.../developerstudio12.6/lib/compilers/atomic/libstatomic.so.1 even if they 
never use _Atomic. So there would be a benefit to compiling modules and linking 
programs with -xatomic=studio only when needed. Unfortunately Gnulib doesn't 
really support that.

Also, as mentioned above, it's not just Sun C that needs special flags. With MSVC you 
need /experimental:c11atomics. With 32-bit Clang you might need -latomic; at least, 
that's the case for Clang 22.1.8 (Fedora 22.1.8-4.fc44) when I compile with "clang 
-march=i386 -m32". There are similar issues with recent GCC in some distros. Almost 
surely there are similar problems with other compilers.

All in all, it appears that Gnulib is quite a way away from being able to use 
_Atomic(T) easily in portable code. Maybe 10 or 15 years from now; or maybe 
even earlier if someone puts in the time to make it work, but not today, and 
certainly not if you really need _Atomic to work rather than merely want a best 
effort.


Come to think of it, should we remove the hamt module from Gnulib?

I think we should keep it, because
   - It's a general-purpose module.
   - It's well documented [4].
   - As you have just shown, we can use it as a "guinea pig" module for _Atomic
     support, going forward.
I doubt whether hamt is a good guinea pig. Nobody uses it. If the changes I 
just made to it are incorrect, likely nobody will care. I found problems with 
it only because I was doing global code inspection, not because I was actually 
testing it. And most of the problems I found (see examples above) I did not fix.

Part of the issue with hamt is that it might work in a multithreaded system, 
and it might not. The _Atomic stuff is optional, after all, and hamt builds 
just fine if it knows _Atomic is not supported, and if so it'll almost always 
work, but sometimes it won't. Not exactly a recipe for confidence.

Another thought: if hamt is general-purpose, why doesn't Guile use it? Does 
Guile have special needs that hamt doesn't satisfy? If so, wouldn't it be 
better to extend hamt to support Guile?

Without a real use, the hamt code is pretty much just an orphan time-sink, as 
far as I can see.

Reply via email to