From 9c14c09962c43f11bb4eb4538904f81386f16b15 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 28 Jan 2024 15:53:41 -0600 Subject: [PATCH] Add explicit stdatomic config setting for #1374 There was some hacky workaround code for development versions of TCC that interfered with other compilers and technically was not legal c99. --- src/conf/janetconf.h | 1 + src/core/abstract.c | 2 -- src/core/capi.c | 13 +++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/conf/janetconf.h b/src/conf/janetconf.h index 7110e5c3..66177838 100644 --- a/src/conf/janetconf.h +++ b/src/conf/janetconf.h @@ -54,6 +54,7 @@ /* #define JANET_NO_INTERPRETER_INTERRUPT */ /* #define JANET_NO_IPV6 */ /* #define JANET_NO_CRYPTORAND */ +/* #define JANET_USE_STDATOMIC */ /* Custom vm allocator support */ /* #include */ diff --git a/src/core/abstract.c b/src/core/abstract.c index 407e9ced..5c0631b1 100644 --- a/src/core/abstract.c +++ b/src/core/abstract.c @@ -31,8 +31,6 @@ #ifdef JANET_EV #ifdef JANET_WINDOWS #include -#else -#include #endif #endif diff --git a/src/core/capi.c b/src/core/capi.c index 0f82910b..166f2c5e 100644 --- a/src/core/capi.c +++ b/src/core/capi.c @@ -35,6 +35,13 @@ #endif #endif +#ifdef JANET_USE_STDATOMIC +#include +/* We don't need stdatomic on most compilers since we use compiler builtins for atomic operations. + * Some (TCC), explicitly require using stdatomic.h and don't have any exposed builtins (that I know of). + * For TCC and similar compilers, one would need -std=c11 or similar then to get access. */ +#endif + JANET_NO_RETURN static void janet_top_level_signal(const char *msg) { #ifdef JANET_TOP_LEVEL_SIGNAL JANET_TOP_LEVEL_SIGNAL(msg); @@ -496,6 +503,8 @@ void *janet_optabstract(const Janet *argv, int32_t argc, int32_t n, const JanetA JanetAtomicInt janet_atomic_inc(JanetAtomicInt volatile *x) { #ifdef JANET_WINDOWS return InterlockedIncrement(x); +#elif defined(JANET_USE_STDATOMIC) + return atomic_fetch_add_explicit(x, 1, memory_order_relaxed) + 1; #else return __atomic_add_fetch(x, 1, __ATOMIC_RELAXED); #endif @@ -504,6 +513,8 @@ JanetAtomicInt janet_atomic_inc(JanetAtomicInt volatile *x) { JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x) { #ifdef JANET_WINDOWS return InterlockedDecrement(x); +#elif defined(JANET_USE_STDATOMIC) + return atomic_fetch_add_explicit(x, -1, memory_order_acq_rel) - 1; #else return __atomic_add_fetch(x, -1, __ATOMIC_ACQ_REL); #endif @@ -512,6 +523,8 @@ JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x) { JanetAtomicInt janet_atomic_load(JanetAtomicInt volatile *x) { #ifdef JANET_WINDOWS return InterlockedOr(x, 0); +#elif defined(JANET_USE_STDATOMIC) + return atomic_load_explicit(x, memory_order_acquire); #else return __atomic_load_n(x, __ATOMIC_ACQUIRE); #endif