aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2020-05-07 08:37:51 -0400
committerRuss Cox <rsc@swtch.com>2020-05-07 20:17:53 -0400
commitc3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de (patch)
treec63431d8bc4630f03299a4000ae96007dceff833 /src
parentacffdcb6eed3385e1566c0ac86fb6b4bc130664b (diff)
downloadplan9port-c3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de.tar.gz
plan9port-c3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de.tar.bz2
plan9port-c3c9c7b6ae7c6a8bf9c6d040d3af89e020fd92de.zip
fmt: disable use of stdatomic on AIX XL C and old GCC
C11 is apparently too new for these systems. Fixes #55.
Diffstat (limited to 'src')
-rw-r--r--src/lib9/fmt/fmt.c21
1 files changed, 21 insertions, 0 deletions
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 <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"