@ -185,7 +185,7 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1 ;
}
# endif
if ( ! CRYPTO_THREAD_write_lock ( lock ) )
if ( lock = = NULL | | ! CRYPTO_THREAD_write_lock ( lock ) )
return 0 ;
* val + = amount ;
@ -197,6 +197,54 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1 ;
}
int CRYPTO_atomic_or ( uint64_t * val , uint64_t op , uint64_t * ret ,
CRYPTO_RWLOCK * lock )
{
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
if ( __atomic_is_lock_free ( sizeof ( * val ) , val ) ) {
* ret = __atomic_or_fetch ( val , op , __ATOMIC_ACQ_REL ) ;
return 1 ;
}
# elif defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
/* This will work for all future Solaris versions. */
if ( ret ! = NULL ) {
* ret = atomic_or_64_nv ( val , op ) ;
return 1 ;
}
# endif
if ( lock = = NULL | | ! CRYPTO_THREAD_write_lock ( lock ) )
return 0 ;
* val | = op ;
* ret = * val ;
if ( ! CRYPTO_THREAD_unlock ( lock ) )
return 0 ;
return 1 ;
}
int CRYPTO_atomic_load ( uint64_t * val , uint64_t * 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 ;
}
# elif defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
/* This will work for all future Solaris versions. */
if ( ret ! = NULL ) {
* ret = atomic_or_64_nv ( val , 0 ) ;
return 1 ;
}
# endif
if ( lock = = NULL | | ! CRYPTO_THREAD_read_lock ( lock ) )
return 0 ;
* ret = * val ;
if ( ! CRYPTO_THREAD_unlock ( lock ) )
return 0 ;
return 1 ;
}
# ifndef FIPS_MODULE
# ifdef OPENSSL_SYS_UNIX