From 1beca67688189f6542c7d08233c28e8fab73dba7 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 24 Aug 2016 09:14:44 +0200 Subject: CRYPTO_atomic_add(): check that the object is lock free If not, fall back to our own code, using the given mutex Reviewed-by: Andy Polyakov --- crypto/threads_pthread.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'crypto/threads_pthread.c') diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 9f4ae76bf8..5cc48afb16 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -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; } -- cgit v1.2.1