Commit 1beca676 authored by Richard Levitte's avatar Richard Levitte Committed by Matt Caswell
Browse files

CRYPTO_atomic_add(): check that the object is lock free



If not, fall back to our own code, using the given mutex

Reviewed-by: default avatarAndy Polyakov <appro@openssl.org>
parent 11fc6c76
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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)
    if (__atomic_is_lock_free(sizeof(*val), val)) {
        *ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
# else
        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;
}