From 008a61a544e16d20595731f614b2fbc1d20f793e Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Thu, 27 Apr 2023 15:52:44 +0100 Subject: REFCOUNT: Add support for querying refcount Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/20765) --- include/internal/refcount.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/include/internal/refcount.h b/include/internal/refcount.h index 8674ab3664..fbfe25bd0b 100644 --- a/include/internal/refcount.h +++ b/include/internal/refcount.h @@ -53,6 +53,13 @@ static inline int CRYPTO_DOWN_REF(_Atomic int *val, int *ret, return 1; } +static inline int CRYPTO_GET_REF(_Atomic int *val, int *ret, + ossl_unused void *lock) +{ + *ret = atomic_load_explicit(val, memory_order_relaxed); + return 1; +} + # elif defined(__GNUC__) && defined(__ATOMIC_RELAXED) && __GCC_ATOMIC_INT_LOCK_FREE > 0 # define HAVE_ATOMICS 1 @@ -73,6 +80,13 @@ static __inline__ int CRYPTO_DOWN_REF(int *val, int *ret, __atomic_thread_fence(__ATOMIC_ACQUIRE); return 1; } + +static __inline__ int CRYPTO_GET_REF(int *val, int *ret, ossl_unused void *lock) +{ + *ret = __atomic_load_n(val, __ATOMIC_RELAXED); + return 1; +} + # elif defined(__ICL) && defined(_WIN32) # define HAVE_ATOMICS 1 typedef volatile int CRYPTO_REF_COUNT; @@ -91,6 +105,13 @@ static __inline int CRYPTO_DOWN_REF(volatile int *val, int *ret, return 1; } +static __inline int CRYPTO_GET_REF(volatile int *val, int *ret, + ossl_unused void *lock) +{ + *ret = _InterlockedOr((void *)val, 0); + return 1; +} + # elif defined(_MSC_VER) && _MSC_VER>=1200 # define HAVE_ATOMICS 1 @@ -118,6 +139,14 @@ static __inline int CRYPTO_DOWN_REF(volatile int *val, int *ret, __dmb(_ARM_BARRIER_ISH); return 1; } + +static __inline int CRYPTO_GET_REF(volatile int *val, int *ret, + ossl_unused void *lock) +{ + *ret = _InterlockedOr_nf((void *)val, 0); + return 1; +} + # else # if !defined(_WIN32_WCE) # pragma intrinsic(_InterlockedExchangeAdd) @@ -144,6 +173,14 @@ static __inline int CRYPTO_DOWN_REF(volatile int *val, int *ret, *ret = _InterlockedExchangeAdd(val, -1) - 1; return 1; } + +static __inline int CRYPTO_GET_REF(volatile int *val, int *ret, + ossl_unused void *lock) +{ + *ret = _InterlockedExchangeAdd(val, 0); + return 1; +} + # endif # endif -- cgit v1.2.1