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 <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)
This commit is contained in:
Čestmír Kalina 2022-10-21 11:08:24 +02:00 committed by Tomas Mraz
parent 4e43bc06f7
commit 6ca4bd2e4c

View 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)