CRYPTO_atomic_add(): check that the object is lock free
authorRichard Levitte <levitte@openssl.org>
Wed, 24 Aug 2016 07:14:44 +0000 (09:14 +0200)
committerMatt Caswell <matt@openssl.org>
Wed, 24 Aug 2016 13:37:48 +0000 (14:37 +0100)
If not, fall back to our own code, using the given mutex

Reviewed-by: Andy Polyakov <appro@openssl.org>
crypto/threads_pthread.c

index 9f4ae76..5cc48af 100644 (file)
@@ -110,8 +110,11 @@ int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b)
 int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
 {
 # if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
-    *ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
-# else
+    if (__atomic_is_lock_free(sizeof(*val), val)) {
+        *ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
+        return 1;
+    }
+# endif
     if (!CRYPTO_THREAD_write_lock(lock))
         return 0;
 
@@ -120,7 +123,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
 
     if (!CRYPTO_THREAD_unlock(lock))
         return 0;
-# endif
 
     return 1;
 }