提交 94683b7a 编写于 作者: P Pauli

Add a CRYPTO_atomic_read call which allows an int variable to be read

in an atomic fashion.
Reviewed-by: NRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/4414)
上级 338ead0f
...@@ -125,6 +125,12 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) ...@@ -125,6 +125,12 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1; return 1;
} }
int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock)
{
*ret = *val;
return 1;
}
int openssl_init_fork_handlers(void) int openssl_init_fork_handlers(void)
{ {
return 0; return 0;
......
...@@ -169,6 +169,25 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) ...@@ -169,6 +169,25 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1; 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 # ifdef OPENSSL_SYS_UNIX
static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT; static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT;
......
...@@ -133,6 +133,12 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) ...@@ -133,6 +133,12 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1; 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) int openssl_init_fork_handlers(void)
{ {
return 0; return 0;
......
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
CRYPTO_THREAD_run_once, CRYPTO_THREAD_run_once,
CRYPTO_THREAD_lock_new, CRYPTO_THREAD_read_lock, CRYPTO_THREAD_write_lock, 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 =head1 SYNOPSIS
...@@ -20,6 +21,7 @@ CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add - OpenSSL threa ...@@ -20,6 +21,7 @@ CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add - OpenSSL threa
void CRYPTO_THREAD_lock_free(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_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock);
int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock);
=head1 DESCRIPTION =head1 DESCRIPTION
...@@ -74,6 +76,12 @@ operations are supported on the specific platform. Because of this, if a ...@@ -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 variable is modified by CRYPTO_atomic_add() then CRYPTO_atomic_add() must
be the only way that the variable is modified. 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 =back
=head1 RETURN VALUES =head1 RETURN VALUES
......
...@@ -74,6 +74,7 @@ int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); ...@@ -74,6 +74,7 @@ int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock);
void CRYPTO_THREAD_lock_free(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_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 * The following can be used to detect memory leaks in the library. If
......
...@@ -4398,3 +4398,4 @@ EVP_PKEY_meth_set_check 4341 1_1_1 EXIST::FUNCTION: ...@@ -4398,3 +4398,4 @@ 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_get_check 4342 1_1_1 EXIST::FUNCTION:
EVP_PKEY_meth_remove 4343 1_1_1 EXIST::FUNCTION: EVP_PKEY_meth_remove 4343 1_1_1 EXIST::FUNCTION:
OPENSSL_sk_reserve 4344 1_1_1 EXIST::FUNCTION: OPENSSL_sk_reserve 4344 1_1_1 EXIST::FUNCTION:
CRYPTO_atomic_read 4345 1_1_1 EXIST::FUNCTION:
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册