summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Horman <nhorman@openssl.org>2024-03-29 11:39:12 -0400
committerTomas Mraz <tomas@openssl.org>2024-04-11 10:42:49 +0200
commit7a0d43798598401e85389e1b1d55efb44e52ba08 (patch)
treea075ce5ecf20e075bea2e4321042c5a8bf4f6b2d
parente661fbc55e270bbffb9725af7483631c8895b7eb (diff)
Add locking to atomic operations in rw/rcu tests
I neglected to add locks to the calls to CRYPTO_atomic_add in these test, which on newer compilers is fine, as atomic operations are defined. However on older compilers the __ATOMIC_ACQ_REL definition is missing causing these function to be implemented using an rwlock, which when NULL causes the locks to fail. Fix this my creating the lock and using them appropriately Fixes #24000 Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Dale <ppzgs1@gmail.com> (Merged from https://github.com/openssl/openssl/pull/24001) (cherry picked from commit 5f8b812931e5da24df08913c05ff8e4f4494f014)
-rw-r--r--test/threadstest.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/test/threadstest.c b/test/threadstest.c
index 66223b0fc3..74bac08be4 100644
--- a/test/threadstest.c
+++ b/test/threadstest.c
@@ -111,6 +111,7 @@ static int rwwriter2_iterations = 0;
static int *rwwriter_ptr = NULL;
static int rw_torture_result = 1;
static CRYPTO_RWLOCK *rwtorturelock = NULL;
+static CRYPTO_RWLOCK *atomiclock = NULL;
static void rwwriter_fn(int id, int *iterations)
{
@@ -150,7 +151,7 @@ static void rwwriter1_fn(void)
TEST_info("Starting writer1");
rwwriter_fn(1, &rwwriter1_iterations);
- CRYPTO_atomic_add(&rwwriter1_done, 1, &local, NULL);
+ CRYPTO_atomic_add(&rwwriter1_done, 1, &local, atomiclock);
}
static void rwwriter2_fn(void)
@@ -159,7 +160,7 @@ static void rwwriter2_fn(void)
TEST_info("Starting writer 2");
rwwriter_fn(2, &rwwriter2_iterations);
- CRYPTO_atomic_add(&rwwriter2_done, 1, &local, NULL);
+ CRYPTO_atomic_add(&rwwriter2_done, 1, &local, atomiclock);
}
static void rwreader_fn(int *iterations)
@@ -174,8 +175,8 @@ static void rwreader_fn(int *iterations)
abort();
while (lw1 != 1 || lw2 != 1) {
- CRYPTO_atomic_add(&rwwriter1_done, 0, &lw1, NULL);
- CRYPTO_atomic_add(&rwwriter2_done, 0, &lw2, NULL);
+ CRYPTO_atomic_add(&rwwriter1_done, 0, &lw1, atomiclock);
+ CRYPTO_atomic_add(&rwwriter2_done, 0, &lw2, atomiclock);
count++;
if (rwwriter_ptr != NULL && old > *rwwriter_ptr) {
@@ -223,6 +224,7 @@ static int _torture_rw(void)
struct timeval dtime;
rwtorturelock = CRYPTO_THREAD_lock_new();
+ atomiclock = CRYPTO_THREAD_lock_new();
rwwriter1_iterations = 0;
rwwriter2_iterations = 0;
rwreader1_iterations = 0;
@@ -264,6 +266,7 @@ static int _torture_rw(void)
ret = 1;
out:
CRYPTO_THREAD_lock_free(rwtorturelock);
+ CRYPTO_THREAD_lock_free(atomiclock);
rwtorturelock = NULL;
return ret;
}
@@ -336,7 +339,7 @@ static void writer1_fn(void)
TEST_info("Starting writer1");
writer_fn(1, &writer1_iterations);
- CRYPTO_atomic_add(&writer1_done, 1, &local, NULL);
+ CRYPTO_atomic_add(&writer1_done, 1, &local, atomiclock);
}
static void writer2_fn(void)
@@ -345,7 +348,7 @@ static void writer2_fn(void)
TEST_info("Starting writer2");
writer_fn(2, &writer2_iterations);
- CRYPTO_atomic_add(&writer2_done, 1, &local, NULL);
+ CRYPTO_atomic_add(&writer2_done, 1, &local, atomiclock);
}
static void reader_fn(int *iterations)
@@ -358,8 +361,8 @@ static void reader_fn(int *iterations)
int lw2 = 0;
while (lw1 != 1 || lw2 != 1) {
- CRYPTO_atomic_add(&writer1_done, 0, &lw1, NULL);
- CRYPTO_atomic_add(&writer2_done, 0, &lw2, NULL);
+ CRYPTO_atomic_add(&writer1_done, 0, &lw1, atomiclock);
+ CRYPTO_atomic_add(&writer2_done, 0, &lw2, atomiclock);
count++;
ossl_rcu_read_lock(rcu_lock);
valp = ossl_rcu_deref(&writer_ptr);
@@ -403,6 +406,7 @@ static int _torture_rcu(void)
double tottime;
double avr, avw;
+ atomiclock = CRYPTO_THREAD_lock_new();
memset(&writer1, 0, sizeof(thread_t));
memset(&writer2, 0, sizeof(thread_t));
memset(&reader1, 0, sizeof(thread_t));
@@ -443,6 +447,7 @@ static int _torture_rcu(void)
TEST_info("Average write time %e/write", avw);
ossl_rcu_lock_free(rcu_lock);
+ CRYPTO_THREAD_lock_free(atomiclock);
if (!TEST_int_eq(rcu_torture_result, 1))
return 0;