tfmt: disable use of stdatomic on AIX XL C and old GCC - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de
 (DIR) parent acffdcb6eed3385e1566c0ac86fb6b4bc130664b
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Thu,  7 May 2020 08:37:51 -0400
       
       fmt: disable use of stdatomic on AIX XL C and old GCC
       
       C11 is apparently too new for these systems.
       
       Fixes #55.
       
       Diffstat:
         M src/lib9/fmt/fmt.c                  |      21 +++++++++++++++++++++
       
       1 file changed, 21 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/lib9/fmt/fmt.c b/src/lib9/fmt/fmt.c
       t@@ -1,7 +1,28 @@
        /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
        #include <stdarg.h>
        #include <string.h>
       +
       +/*
       + * As of 2020, older systems like RHEL 6 and AIX still do not have C11 atomics.
       + * On those systems, make the code use volatile int accesses and hope for the best.
       + * (Most uses of fmtinstall are not actually racing with calls to print that lookup
       + * formats. The code used volatile here for years without too many problems,
       + * even though that's technically racy. A mutex is not OK, because we want to
       + * be able to call print from signal handlers.)
       + *
       + * RHEL is using an old GCC (atomics were added in GCC 4.8).
       + * AIX is using its own IBM compiler (XL C).
       + */
       +#if __IBMC__ || !__clang__ && __GNUC__ && (__GNUC__ < 4 || (__GNUC__==4 && __GNUC_MINOR__<8))
       +#warning not using C11 stdatomic on legacy system
       +#define _Atomic volatile
       +#define atomic_load(x) (*(x))
       +#define atomic_store(x, y) (*(x)=(y))
       +#define ATOMIC_VAR_INIT(x) (x)
       +#else
        #include <stdatomic.h>
       +#endif
       +
        #include "plan9.h"
        #include "fmt.h"
        #include "fmtdef.h"