From c3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 7 May 2020 08:37:51 -0400 Subject: fmt: disable use of stdatomic on AIX XL C and old GCC C11 is apparently too new for these systems. Fixes #55. --- src/lib9/fmt/fmt.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/lib9/fmt') diff --git a/src/lib9/fmt/fmt.c b/src/lib9/fmt/fmt.c index a86482c3..fdfff65d 100644 --- a/src/lib9/fmt/fmt.c +++ b/src/lib9/fmt/fmt.c @@ -1,7 +1,28 @@ /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include + +/* + * 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 +#endif + #include "plan9.h" #include "fmt.h" #include "fmtdef.h" -- cgit v1.2.3 From bd6f12068b28ba7eb96a3cd495e2201c852682b7 Mon Sep 17 00:00:00 2001 From: Kurt H Maier Date: Thu, 7 May 2020 17:55:15 -0700 Subject: fmt: adjust GCC version check atomics were added in GCC 4.9: https://gcc.gnu.org/gcc-4.9/changes.html --- src/lib9/fmt/fmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib9/fmt') diff --git a/src/lib9/fmt/fmt.c b/src/lib9/fmt/fmt.c index fdfff65d..47b186a4 100644 --- a/src/lib9/fmt/fmt.c +++ b/src/lib9/fmt/fmt.c @@ -10,10 +10,10 @@ * 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). + * RHEL is using an old GCC (atomics were added in GCC 4.9). * AIX is using its own IBM compiler (XL C). */ -#if __IBMC__ || !__clang__ && __GNUC__ && (__GNUC__ < 4 || (__GNUC__==4 && __GNUC_MINOR__<8)) +#if __IBMC__ || !__clang__ && __GNUC__ && (__GNUC__ < 4 || (__GNUC__==4 && __GNUC_MINOR__<9)) #warning not using C11 stdatomic on legacy system #define _Atomic volatile #define atomic_load(x) (*(x)) -- cgit v1.2.3