X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fthreads_pthread.c;h=5cc48afb16f2f484b066da12a0398353d7cbba0e;hp=6f5e812d97ac4bebdbda904650c64b5254df03e7;hb=e72040c1dcd61d6669762a60924b8fa3a48c37fc;hpb=b1322259d93cf6b6286f9febcd468b6a9f577d91 diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 6f5e812d97..5cc48afb16 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -109,9 +109,12 @@ 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) { -#ifdef __ATOMIC_RELAXED - *ret = __atomic_add_fetch(val, amount, __ATOMIC_RELAXED); -#else +# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL) + 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; }