From: Čestmír Kalina Date: Fri, 21 Oct 2022 09:08:24 +0000 (+0200) Subject: test: threads: replace test_thread_noreturn X-Git-Tag: openssl-3.2.0-alpha1~1862 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6ca4bd2e4c92531e74acba3e1ff08e6fbb664b20;p=thirdparty%2Fopenssl.git test: threads: replace test_thread_noreturn 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 Reviewed-by: Hugo Landau Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/19433) --- diff --git a/test/threadstest.c b/test/threadstest.c index 6ddb4bf96c1..cd1277082cc 100644 --- a/test/threadstest.c +++ b/test/threadstest.c @@ -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)