Loading crypto/threads_none.c +6 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,12 @@ 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 openssl_init_fork_handlers(void) { return 0; Loading crypto/threads_pthread.c +19 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,25 @@ 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_write_lock(lock)) return 0; *ret = *val; if (!CRYPTO_THREAD_unlock(lock)) return 0; return 1; } # ifdef OPENSSL_SYS_UNIX static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT; Loading crypto/threads_win.c +6 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,12 @@ 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) { InterlockedCompareExchange(val, 0, 0); return 1; } int openssl_init_fork_handlers(void) { return 0; Loading doc/man3/CRYPTO_THREAD_run_once.pod +9 −1 Original line number Diff line number Diff line Loading @@ -4,7 +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 - OpenSSL thread support CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add, CRYPTO_atomic_read - OpenSSL thread support =head1 SYNOPSIS Loading @@ -20,6 +21,7 @@ CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add - OpenSSL threa 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); =head1 DESCRIPTION Loading Loading @@ -74,6 +76,12 @@ 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<val> and returns the result of the operation in B<ret>. B<lock> will be locked, unless atomic operations are supported on the specific platform. =back =head1 RETURN VALUES Loading include/openssl/crypto.h +1 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ 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); /* * The following can be used to detect memory leaks in the library. If Loading Loading
crypto/threads_none.c +6 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,12 @@ 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 openssl_init_fork_handlers(void) { return 0; Loading
crypto/threads_pthread.c +19 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,25 @@ 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_write_lock(lock)) return 0; *ret = *val; if (!CRYPTO_THREAD_unlock(lock)) return 0; return 1; } # ifdef OPENSSL_SYS_UNIX static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT; Loading
crypto/threads_win.c +6 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,12 @@ 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) { InterlockedCompareExchange(val, 0, 0); return 1; } int openssl_init_fork_handlers(void) { return 0; Loading
doc/man3/CRYPTO_THREAD_run_once.pod +9 −1 Original line number Diff line number Diff line Loading @@ -4,7 +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 - OpenSSL thread support CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add, CRYPTO_atomic_read - OpenSSL thread support =head1 SYNOPSIS Loading @@ -20,6 +21,7 @@ CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add - OpenSSL threa 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); =head1 DESCRIPTION Loading Loading @@ -74,6 +76,12 @@ 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<val> and returns the result of the operation in B<ret>. B<lock> will be locked, unless atomic operations are supported on the specific platform. =back =head1 RETURN VALUES Loading
include/openssl/crypto.h +1 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ 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); /* * The following can be used to detect memory leaks in the library. If Loading