mirror of
https://github.com/openssl/openssl.git
synced 2024-12-15 04:53:52 +08:00
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 <appro@openssl.org>
This commit is contained in:
parent
11fc6c7611
commit
1beca67688
@ -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)
|
int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
|
||||||
{
|
{
|
||||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
|
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
|
||||||
|
if (__atomic_is_lock_free(sizeof(*val), val)) {
|
||||||
*ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
|
*ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
|
||||||
# else
|
return 1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
if (!CRYPTO_THREAD_write_lock(lock))
|
if (!CRYPTO_THREAD_write_lock(lock))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -120,7 +123,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
|
|||||||
|
|
||||||
if (!CRYPTO_THREAD_unlock(lock))
|
if (!CRYPTO_THREAD_unlock(lock))
|
||||||
return 0;
|
return 0;
|
||||||
# endif
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user