summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorVladimir Kotal <Vladimir.Kotal@Oracle.COM>2019-06-21 10:31:05 +0200
committerMatt Caswell <matt@openssl.org>2019-08-09 13:16:41 +0100
commitd6dda392c10a9297b5009339a4656ec5bf53399b (patch)
treea11160b9d9bf512b0b4f96d4b86dbb5d15cc15a5 /crypto
parentac5a61caf87652733545e9c2a9219e5986b6a35a (diff)
use native atomic increment function on Solaris
Reviewed-by: Paul Dale <paul.dale@oracle.com> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/9215)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/threads_pthread.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c
index 0d351ca6fa..c3fd2411db 100644
--- a/crypto/threads_pthread.c
+++ b/crypto/threads_pthread.c
@@ -10,6 +10,10 @@
#include <openssl/crypto.h>
#include "internal/cryptlib.h"
+#if defined(__sun)
+# include <atomic.h>
+#endif
+
#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) && !defined(OPENSSL_SYS_WINDOWS)
# ifdef PTHREAD_RWLOCK_INITIALIZER
@@ -162,6 +166,12 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
*ret = __atomic_add_fetch(val, amount, __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_add_int_nv((volatile unsigned int *)val, amount);
+ return 1;
+ }
# endif
if (!CRYPTO_THREAD_write_lock(lock))
return 0;