]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
REFCOUNT: Add support for querying refcount
authorHugo Landau <hlandau@openssl.org>
Thu, 27 Apr 2023 14:52:44 +0000 (15:52 +0100)
committerHugo Landau <hlandau@openssl.org>
Fri, 12 May 2023 13:47:14 +0000 (14:47 +0100)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20765)

include/internal/refcount.h

index 8674ab3664e1878eff2d68cce856babeb9f18301..fbfe25bd0b3c2f8406278e621df429e8bc257c02 100644 (file)
@@ -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