X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fthreads_pthread.c;h=151013e47044d6188e6a529c2f424bfd1eabf4af;hb=a3b0d466930ec45bc3ddf4c9e853d73d37783f44;hp=72ea83892bbe66ca7fe725d4c006d74c1c385d55;hpb=cb4b54c23b95e4638d643eb349d8d8dfa1cc2fd3;p=openssl.git diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 72ea83892b..151013e470 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -11,8 +11,13 @@ #if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) && !defined(OPENSSL_SYS_WINDOWS) +# ifdef PTHREAD_RWLOCK_INITIALIZER +# define USE_RWLOCK +# endif + CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void) { +# ifdef USE_RWLOCK CRYPTO_RWLOCK *lock = OPENSSL_zalloc(sizeof(pthread_rwlock_t)); if (lock == NULL) return NULL; @@ -21,30 +26,62 @@ CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void) OPENSSL_free(lock); return NULL; } +# else + pthread_mutexattr_t attr; + CRYPTO_RWLOCK *lock = OPENSSL_zalloc(sizeof(pthread_mutex_t)); + if (lock == NULL) + return NULL; + + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + + if (pthread_mutex_init(lock, &attr) != 0) { + pthread_mutexattr_destroy(&attr); + OPENSSL_free(lock); + return NULL; + } + + pthread_mutexattr_destroy(&attr); +# endif return lock; } int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock) { +# ifdef USE_RWLOCK if (pthread_rwlock_rdlock(lock) != 0) return 0; +# else + if (pthread_mutex_lock(lock) != 0) + return 0; +# endif return 1; } int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock) { +# ifdef USE_RWLOCK if (pthread_rwlock_wrlock(lock) != 0) return 0; +# else + if (pthread_mutex_lock(lock) != 0) + return 0; +# endif return 1; } int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock) { +# ifdef USE_RWLOCK if (pthread_rwlock_unlock(lock) != 0) return 0; +# else + if (pthread_mutex_unlock(lock) != 0) + return 0; +# endif return 1; } @@ -54,7 +91,11 @@ void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock) if (lock == NULL) return; +# ifdef USE_RWLOCK pthread_rwlock_destroy(lock); +# else + pthread_mutex_destroy(lock); +# endif OPENSSL_free(lock); return; @@ -109,9 +150,12 @@ int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b) int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) { -# if defined(__GNUC__) && defined(__ATOMIC_RELAXED) - *ret = __atomic_add_fetch(val, amount, __ATOMIC_RELAXED); -# else +# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL) + if (__atomic_is_lock_free(sizeof(*val), val)) { + *ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL); + return 1; + } +# endif if (!CRYPTO_THREAD_write_lock(lock)) return 0; @@ -120,7 +164,6 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) if (!CRYPTO_THREAD_unlock(lock)) return 0; -# endif return 1; }