Don't use __ATOMIC_ACQ_REL on older compilers
Older compilers don't always support __ATOMIC_ACQ_REL, use a lock where they don't Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de> (Merged from https://github.com/openssl/openssl/pull/26747)
This commit is contained in:
parent
afc64c240f
commit
7d284560a0
2 changed files with 17 additions and 13 deletions
|
@ -90,7 +90,6 @@ __tsan_mutex_post_lock((x), 0, 0)
|
|||
* fallback function names.
|
||||
*/
|
||||
typedef void *pvoid;
|
||||
typedef struct rcu_cb_item *prcu_cb_item;
|
||||
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) && !defined(BROKEN_CLANG_ATOMICS) \
|
||||
&& !defined(USE_ATOMIC_FALLBACKS)
|
||||
|
@ -193,7 +192,6 @@ IMPL_fallback_atomic_store(pvoid)
|
|||
return ret; \
|
||||
}
|
||||
IMPL_fallback_atomic_exchange_n(uint64_t)
|
||||
IMPL_fallback_atomic_exchange_n(prcu_cb_item)
|
||||
|
||||
# define ATOMIC_EXCHANGE_N(t, p, v, o) fallback_atomic_exchange_n_##t(p, v)
|
||||
|
||||
|
@ -583,6 +581,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: This call assumes its made under the protection of
|
||||
* ossl_rcu_write_lock
|
||||
*/
|
||||
int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
|
||||
{
|
||||
struct rcu_cb_item *new =
|
||||
|
@ -593,13 +595,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
|
|||
|
||||
new->data = data;
|
||||
new->fn = cb;
|
||||
/*
|
||||
* Use __ATOMIC_ACQ_REL here to indicate that any prior writes to this
|
||||
* list are visible to us prior to reading, and publish the new value
|
||||
* immediately
|
||||
*/
|
||||
new->next = ATOMIC_EXCHANGE_N(prcu_cb_item, &lock->cb_items, new,
|
||||
__ATOMIC_ACQ_REL);
|
||||
|
||||
new->next = lock->cb_items;
|
||||
lock->cb_items = new;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -365,8 +365,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
|
|||
struct rcu_cb_item *cb_items, *tmpcb;
|
||||
|
||||
/* before we do anything else, lets grab the cb list */
|
||||
cb_items = InterlockedExchangePointer((void * volatile *)&lock->cb_items,
|
||||
NULL);
|
||||
ossl_crypto_mutex_lock(lock->write_lock);
|
||||
cb_items = lock->cb_items;
|
||||
lock->cb_items = NULL;
|
||||
ossl_crypto_mutex_unlock(lock->write_lock);
|
||||
|
||||
qp = update_qp(lock, &curr_id);
|
||||
|
||||
|
@ -399,6 +401,9 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
|
|||
|
||||
}
|
||||
|
||||
/*
|
||||
* Note, must be called under the protection of ossl_rcu_write_lock
|
||||
*/
|
||||
int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
|
||||
{
|
||||
struct rcu_cb_item *new;
|
||||
|
@ -409,8 +414,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
|
|||
new->data = data;
|
||||
new->fn = cb;
|
||||
|
||||
new->next = InterlockedExchangePointer((void * volatile *)&lock->cb_items,
|
||||
new);
|
||||
new->next = lock->cb_items;
|
||||
lock->cb_items = new;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue