]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
test: threads: replace test_thread_noreturn
authorČestmír Kalina <ckalina@redhat.com>
Fri, 21 Oct 2022 09:08:24 +0000 (11:08 +0200)
committerTomas Mraz <tomas@openssl.org>
Fri, 21 Oct 2022 10:44:56 +0000 (12:44 +0200)
While POSIX threads are cancellable and may be asynchronously cancelled,
their cancellation is not guaranteed by the POSIX standard.

test_thread_noreturn, which simulates a long-running possibly
unresponsive thread:

THREAD #1 THREAD #2
LOCK L1
SPAWN #2
LOCK L1

On MacOS, cancelling such thread only queues cancellation request, but
the following pthread_join hangs.

Replace this implementation by an unbounded sequence of sleeps instead.

Signed-off-by: Čestmír Kalina <ckalina@redhat.com>
Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19433)

test/threadstest.c

index 6ddb4bf96c1512965c210c80877eb8ab4d8918c0..cd1277082cc87c91f45f032d0f55fdd418e56c8f 100644 (file)
@@ -787,13 +787,13 @@ static uint32_t test_thread_native_fn(void *data)
 
 static uint32_t test_thread_noreturn(void *data)
 {
-    CRYPTO_MUTEX *lock = (uint32_t*) data;
-
-    /* lock is assumed to be locked */
-    ossl_crypto_mutex_lock(lock);
+    while (1) {
+       OSSL_sleep(1000);
+    }
 
     /* unreachable */
     OPENSSL_die("test_thread_noreturn", __FILE__, __LINE__);
+
     return 0;
 }
 
@@ -801,11 +801,9 @@ static uint32_t test_thread_noreturn(void *data)
 
 static int test_thread_native(void)
 {
-    int testval = 0;
     uint32_t retval;
     uint32_t local;
     CRYPTO_THREAD *t;
-    CRYPTO_MUTEX *lock;
 
     /* thread spawn, join and termination */
 
@@ -845,28 +843,15 @@ static int test_thread_native(void)
 
     /* termination of a long running thread */
 
-    lock = ossl_crypto_mutex_new();
-    if (!TEST_ptr(lock))
-        return 0;
-    ossl_crypto_mutex_lock(lock);
-
-    t = ossl_crypto_thread_native_start(test_thread_noreturn, lock, 1);
+    t = ossl_crypto_thread_native_start(test_thread_noreturn, NULL, 1);
     if (!TEST_ptr(t))
-        goto fail;
+        return 0;
     if (!TEST_int_eq(ossl_crypto_thread_native_terminate(t), 1))
-        goto fail;
+        return 0;
     if (!TEST_int_eq(ossl_crypto_thread_native_clean(t), 1))
-        goto fail;
-
-    testval = 1;
-
-fail:
-    ossl_crypto_mutex_unlock(lock);
-    ossl_crypto_mutex_free(&lock);
-    if (!TEST_ptr_null(lock))
         return 0;
 
-    return testval;
+    return 1;
 }
 
 #if !defined(OPENSSL_NO_DEFAULT_THREAD_POOL)