From d2b863643d94704abd9840519cfc54d22d0481fe Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Mon, 13 Aug 2018 22:53:14 +0200 Subject: [PATCH] crypto/threads_*: remove CRYPTO_atomic_{read|write}. CRYPTO_atomic_read was added with intention to read statistics counters, but readings are effectively indistinguishable from regular load (even in non-lock-free case). This is because you can get out-dated value in both cases. CRYPTO_atomic_write was added for symmetry and was never used. Reviewed-by: Kurt Roeckx (Merged from https://github.com/openssl/openssl/pull/6883) --- crypto/threads_none.c | 12 --------- crypto/threads_pthread.c | 38 ----------------------------- crypto/threads_win.c | 12 --------- doc/man3/CRYPTO_THREAD_run_once.pod | 17 ++----------- include/openssl/crypto.h | 2 -- util/libcrypto.num | 2 -- 6 files changed, 2 insertions(+), 81 deletions(-) diff --git a/crypto/threads_none.c b/crypto/threads_none.c index ab6db8e36b..4b1940ae44 100644 --- a/crypto/threads_none.c +++ b/crypto/threads_none.c @@ -128,18 +128,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } -int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock) -{ - *ret = *val; - return 1; -} - -int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock) -{ - *val = n; - return 1; -} - int openssl_init_fork_handlers(void) { return 0; diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 8d30e1c69f..5a59779ebb 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -175,44 +175,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } -int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock) -{ -# if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) - if (__atomic_is_lock_free(sizeof(*val), val)) { - __atomic_load(val, ret, __ATOMIC_ACQUIRE); - return 1; - } -# endif - if (!CRYPTO_THREAD_read_lock(lock)) - return 0; - - *ret = *val; - - if (!CRYPTO_THREAD_unlock(lock)) - return 0; - - return 1; -} - -int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock) -{ -# if defined(__GNUC__) && defined(__ATOMIC_RELEASE) - if (__atomic_is_lock_free(sizeof(*val), val)) { - __atomic_store(val, &n, __ATOMIC_RELEASE); - return 1; - } -# endif - if (!CRYPTO_THREAD_write_lock(lock)) - return 0; - - *val = n; - - if (!CRYPTO_THREAD_unlock(lock)) - return 0; - - return 1; -} - # ifdef OPENSSL_SYS_UNIX static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT; diff --git a/crypto/threads_win.c b/crypto/threads_win.c index 7fdbc1f67f..d8fdfb74f5 100644 --- a/crypto/threads_win.c +++ b/crypto/threads_win.c @@ -155,18 +155,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } -int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock) -{ - *ret = InterlockedCompareExchange(val, 0, 0); - return 1; -} - -int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock) -{ - InterlockedExchange(val, n); - return 1; -} - int openssl_init_fork_handlers(void) { return 0; diff --git a/doc/man3/CRYPTO_THREAD_run_once.pod b/doc/man3/CRYPTO_THREAD_run_once.pod index a290278b70..3277613193 100644 --- a/doc/man3/CRYPTO_THREAD_run_once.pod +++ b/doc/man3/CRYPTO_THREAD_run_once.pod @@ -4,8 +4,8 @@ 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_read, CRYPTO_atomic_write - OpenSSL thread support +CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, +CRYPTO_atomic_add - OpenSSL thread support =head1 SYNOPSIS @@ -21,8 +21,6 @@ CRYPTO_atomic_read, CRYPTO_atomic_write - OpenSSL thread support void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); - int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock); - int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock); =head1 DESCRIPTION @@ -77,17 +75,6 @@ operations are supported on the specific platform. Because of this, if a variable is modified by CRYPTO_atomic_add() then CRYPTO_atomic_add() must be the only way that the variable is modified. -=item * - -CRYPTO_atomic_read() atomically reads B and returns the result of -the operation in B. B will be locked, unless atomic operations -are supported on the specific platform. - -=item * - -CRYPTO_atomic_write() atomically writes B to B. B will be -locked, unless atomic operations are supported on the specific platform. - =back =head1 RETURN VALUES diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h index c2ad65e044..7e50b1bf46 100644 --- a/include/openssl/crypto.h +++ b/include/openssl/crypto.h @@ -73,8 +73,6 @@ int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); -int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock); -int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock); /* * The following can be used to detect memory leaks in the library. If diff --git a/util/libcrypto.num b/util/libcrypto.num index ed8a8f0127..d69a6dcf68 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -4396,8 +4396,6 @@ EVP_PKEY_meth_set_check 4341 1_1_1 EXIST::FUNCTION: EVP_PKEY_meth_get_check 4342 1_1_1 EXIST::FUNCTION: EVP_PKEY_meth_remove 4343 1_1_1 EXIST::FUNCTION: OPENSSL_sk_reserve 4344 1_1_1 EXIST::FUNCTION: -CRYPTO_atomic_read 4345 1_1_1 EXIST::FUNCTION: -CRYPTO_atomic_write 4346 1_1_1 EXIST::FUNCTION: EVP_PKEY_set1_engine 4347 1_1_0g EXIST::FUNCTION:ENGINE DH_new_by_nid 4348 1_1_1 EXIST::FUNCTION:DH DH_get_nid 4349 1_1_1 EXIST::FUNCTION:DH -- 2.25.1