Skip to content

Commit

Permalink
test: threads: replace test_thread_noreturn
Browse files Browse the repository at this point in the history
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 <[email protected]>

Reviewed-by: Hugo Landau <[email protected]>
Reviewed-by: Tomas Mraz <[email protected]>
(Merged from openssl#19433)
  • Loading branch information
ckalina authored and t8m committed Oct 21, 2022
1 parent 4e43bc0 commit 6ca4bd2
Showing 1 changed file with 8 additions and 23 deletions.
31 changes: 8 additions & 23 deletions test/threadstest.c
Original file line number Diff line number Diff line change
Expand Up @@ -787,25 +787,23 @@ 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;
}

/* Tests of native threads */

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 */

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 6ca4bd2

Please sign in to comment.