From 805904fe295efa5f480b067d8c60777675ea7368 Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Fri, 21 Apr 2023 12:24:53 +0000 Subject: atomics: Disentangle 32bit and 64bit atomics configuration. Allow for --enable-nonportable-atomics=upto32bit to disable 64bit atomic builtins while still allowing for 32bit ones. yes/no still enables/disables both (if available in the first place..). By default (no --enable-nonportable-atomics setting), generic 64bit atomics are forced for 32bit CPUs/systems, until we figure out how to properly align apr_uint64_t (at least i[56]86 CPUs which could work with 64bit builtins actually don't if the data is not 64bit aligned, assuming the same for other 32bit CPUs is safer). git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1909321 13f79535-47bb-0310-9956-ffa450edef68 --- atomic/netware/apr_atomic.c | 2 +- atomic/os390/atomic.c | 2 +- atomic/unix/ia32.c | 2 +- atomic/unix/mutex64.c | 2 +- atomic/unix/ppc.c | 2 +- atomic/unix/s390.c | 2 +- atomic/unix/solaris.c | 2 +- atomic/win32/apr_atomic.c | 2 +- configure.in | 29 ++++++++++++++++++++--------- include/arch/unix/apr_arch_atomic.h | 20 +++++++++----------- 10 files changed, 37 insertions(+), 28 deletions(-) diff --git a/atomic/netware/apr_atomic.c b/atomic/netware/apr_atomic.c index d4168edf1..3df3a04d7 100644 --- a/atomic/netware/apr_atomic.c +++ b/atomic/netware/apr_atomic.c @@ -20,7 +20,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *pool) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/os390/atomic.c b/atomic/os390/atomic.c index f7318aee9..6aed0196e 100644 --- a/atomic/os390/atomic.c +++ b/atomic/os390/atomic.c @@ -20,7 +20,7 @@ apr_status_t apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/unix/ia32.c b/atomic/unix/ia32.c index df23d823e..22036983b 100644 --- a/atomic/unix/ia32.c +++ b/atomic/unix/ia32.c @@ -20,7 +20,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/unix/mutex64.c b/atomic/unix/mutex64.c index a6a7ceb0b..4ea4d8fc8 100644 --- a/atomic/unix/mutex64.c +++ b/atomic/unix/mutex64.c @@ -17,7 +17,7 @@ #include "apr_arch_atomic.h" #include "apr_thread_mutex.h" -#if defined(USE_ATOMICS_GENERIC) || defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) #include diff --git a/atomic/unix/ppc.c b/atomic/unix/ppc.c index ffba3c27a..513c6013e 100644 --- a/atomic/unix/ppc.c +++ b/atomic/unix/ppc.c @@ -26,7 +26,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/unix/s390.c b/atomic/unix/s390.c index d20de5987..663a9ce52 100644 --- a/atomic/unix/s390.c +++ b/atomic/unix/s390.c @@ -20,7 +20,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/unix/solaris.c b/atomic/unix/solaris.c index 4a2e1b8ad..5fc55ba6c 100644 --- a/atomic/unix/solaris.c +++ b/atomic/unix/solaris.c @@ -22,7 +22,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/atomic/win32/apr_atomic.c b/atomic/win32/apr_atomic.c index 3bd42f7f5..c349ad97f 100644 --- a/atomic/win32/apr_atomic.c +++ b/atomic/win32/apr_atomic.c @@ -18,7 +18,7 @@ APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { -#if defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) return apr__atomic_generic64_init(p); #else return APR_SUCCESS; diff --git a/configure.in b/configure.in index ea9a9337a..8edcb0845 100644 --- a/configure.in +++ b/configure.in @@ -836,21 +836,28 @@ void main(void) fi fi +force_generic_atomics=no +force_generic_atomics64=no +AC_CHECK_SIZEOF(void*, 4) +if test "x$ac_cv_sizeof_voidp" = "x"; then + force_generic_atomics64=yes +elif test $ac_cv_sizeof_voidp -lt 8; then + force_generic_atomics64=yes +fi AC_ARG_ENABLE(nonportable-atomics, [ --enable-nonportable-atomics Use optimized atomic code which may produce nonportable binaries], -[if test $enableval = yes; then - force_generic_atomics=no - else +[if test "$enableval" = "upto32bit"; then + force_generic_atomics64=yes + elif test "$enableval" != "yes"; then force_generic_atomics=yes fi ], -[force_generic_atomics=no -case $host_cpu in - i[[34]]86) force_generic_atomics=yes;; +[case $host_cpu in + i[[34]]86) + force_generic_atomics=yes + ;; i[[56]]86) - if test $has_atomic_builtins != yes; then - force_generic_atomics=yes - fi + force_generic_atomics64=yes ;; *) case $host in *solaris2.10*) @@ -871,6 +878,10 @@ if test $force_generic_atomics = yes; then AC_DEFINE([USE_ATOMICS_GENERIC], 1, [Define if use of generic atomics is requested]) fi +if test $force_generic_atomics = yes -o $force_generic_atomics64 = yes; then + AC_DEFINE([USE_ATOMICS_GENERIC64], 1, + [Define if use of 64bit generic atomics is requested]) +fi AC_SUBST(proc_mutex_is_global) AC_SUBST(eolstr) diff --git a/include/arch/unix/apr_arch_atomic.h b/include/arch/unix/apr_arch_atomic.h index ce771ad9c..a443b9dd1 100644 --- a/include/arch/unix/apr_arch_atomic.h +++ b/include/arch/unix/apr_arch_atomic.h @@ -23,37 +23,35 @@ #include "apr_atomic.h" #if defined(USE_ATOMICS_GENERIC) -/* noop */ + /* noop */ #elif HAVE_ATOMIC_BUILTINS # define USE_ATOMICS_BUILTINS -# if HAVE_ATOMIC_BUILTINS64 -# define USE_ATOMICS_BUILTINS64 -# else -# define NEED_ATOMICS_GENERIC64 -# endif #elif defined(SOLARIS2) && SOLARIS2 >= 10 # define USE_ATOMICS_SOLARIS -# define NEED_ATOMICS_GENERIC64 #elif defined(__GNUC__) && defined(__STRICT_ANSI__) /* force use of generic atomics if building e.g. with -std=c89, which * doesn't allow inline asm */ # define USE_ATOMICS_GENERIC #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) # define USE_ATOMICS_IA32 -# define NEED_ATOMICS_GENERIC64 #elif defined(__GNUC__) && (defined(__powerpc__) \ || defined(__PPC__) \ || defined(__ppc__)) # define USE_ATOMICS_PPC -# define NEED_ATOMICS_GENERIC64 #elif defined(__GNUC__) && (defined(__s390__) || defined(__s390x__)) # define USE_ATOMICS_S390 -# define NEED_ATOMICS_GENERIC64 #else # define USE_ATOMICS_GENERIC #endif -#if defined(USE_ATOMICS_GENERIC) || defined (NEED_ATOMICS_GENERIC64) +#if defined(USE_ATOMICS_GENERIC64) + /* noop */ +#elif HAVE_ATOMIC_BUILTINS64 +# define USE_ATOMICS_BUILTINS64 +#else +# define USE_ATOMICS_GENERIC64 +#endif +#if defined(USE_ATOMICS_GENERIC64) apr_status_t apr__atomic_generic64_init(apr_pool_t *p); #endif -- cgit v1.2.1