diff options
author | Neil Horman <nhorman@openssl.org> | 2024-03-08 11:58:07 -0500 |
---|---|---|
committer | Pauli <ppzgs1@gmail.com> | 2024-04-24 12:03:03 +1000 |
commit | 7e45ac6891ade57cb0141402745d144c4ce342cb (patch) | |
tree | 674f533e5a639320afa6e15cd847c6818b5ef0e6 /doc | |
parent | f39a86281883bd7ff0b3791ed203756d055c001b (diff) | |
download | openssl-7e45ac6891ade57cb0141402745d144c4ce342cb.tar.gz |
Add CRYPTO_atomic_store api
Generally we can get away with just using CRYPTO_atomic_load to do
stores by reversing the source and target variables, but doing so
creates a problem for the thread sanitizer as CRYPTO_atomic_load hard
codes an __ATOMIC_ACQUIRE constraint, which confuses tsan into thinking
that loads and stores aren't properly ordered, leading to RAW/WAR
hazzards getting reported. Instead create a CRYPTO_atomic_store api
that is identical to the load variant, save for the fact that the value
is a unit64_t rather than a pointer that gets stored using an
__ATOMIC_RELEASE constraint, satisfying tsan.
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23671)
Diffstat (limited to 'doc')
-rw-r--r-- | doc/man3/CRYPTO_THREAD_run_once.pod | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/doc/man3/CRYPTO_THREAD_run_once.pod b/doc/man3/CRYPTO_THREAD_run_once.pod index 470b741c10..3658a39278 100644 --- a/doc/man3/CRYPTO_THREAD_run_once.pod +++ b/doc/man3/CRYPTO_THREAD_run_once.pod @@ -5,7 +5,7 @@ CRYPTO_THREAD_run_once, CRYPTO_THREAD_lock_new, CRYPTO_THREAD_read_lock, CRYPTO_THREAD_write_lock, CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, -CRYPTO_atomic_add, CRYPTO_atomic_or, CRYPTO_atomic_load, +CRYPTO_atomic_add, CRYPTO_atomic_or, CRYPTO_atomic_load, CRYPTO_atomic_store, CRYPTO_atomic_load_int, OSSL_set_max_threads, OSSL_get_max_threads, OSSL_get_thread_support_flags, OSSL_THREAD_SUPPORT_FLAG_THREAD_POOL, @@ -28,6 +28,7 @@ OSSL_THREAD_SUPPORT_FLAG_DEFAULT_SPAWN - OpenSSL thread support int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret, CRYPTO_RWLOCK *lock); int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock); + int CRYPTO_atomic_store(uint64_t *dst, uint64_t val, CRYPTO_RWLOCK *lock); int CRYPTO_atomic_load_int(int *val, int *ret, CRYPTO_RWLOCK *lock); int OSSL_set_max_threads(OSSL_LIB_CTX *ctx, uint64_t max_threads); @@ -112,6 +113,12 @@ NULL, then the function will fail. =item * +CRYPTO_atomic_store() atomically stores the contents of I<val> into I<*dst>. +I<lock> will be locked, unless atomic operations are supported on the specific +plaform. + +=item * + CRYPTO_atomic_load_int() works identically to CRYPTO_atomic_load() but operates on an I<int> value instead of a I<uint64_t> value. |