From 6d9259f334de431f1e934cae14f447a3857ae17b Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 28 Jun 2023 09:37:49 -0600 Subject: [PATCH] Add small test of pthread_exit()/pthread_self() on main thread. --- testing/ostest/Makefile | 4 ++ testing/ostest/ostest.h | 6 ++ testing/ostest/ostest_main.c | 8 +++ testing/ostest/pthread_exit.c | 114 ++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 testing/ostest/pthread_exit.c diff --git a/testing/ostest/Makefile b/testing/ostest/Makefile index a55998577..3235521c9 100644 --- a/testing/ostest/Makefile +++ b/testing/ostest/Makefile @@ -66,6 +66,10 @@ CSRCS += cancel.c cond.c mutex.c timedmutex.c sem.c semtimed.c barrier.c CSRCS += timedwait.c CSRCS += pthread_rwlock.c pthread_rwlock_cancel.c +ifeq ($(CONFIG_SCHED_WAITPID),y) +CSRCS += pthread_exit.c +endif + ifneq ($(CONFIG_TLS_NELEM),0) CSRCS += specific.c endif diff --git a/testing/ostest/ostest.h b/testing/ostest/ostest.h index 22989fa59..e29457c7d 100644 --- a/testing/ostest/ostest.h +++ b/testing/ostest/ostest.h @@ -230,6 +230,12 @@ void pthread_rwlock_test(void); void pthread_rwlock_cancel_test(void); +/* pthread_exit.c ***********************************************************/ + +#ifdef CONFIG_SCHED_WAITPID +void pthread_exit_test(void); +#endif + /* pthread_cleanup.c ********************************************************/ void pthread_cleanup_test(void); diff --git a/testing/ostest/ostest_main.c b/testing/ostest/ostest_main.c index e3c19f58f..e0631271a 100644 --- a/testing/ostest/ostest_main.c +++ b/testing/ostest/ostest_main.c @@ -441,6 +441,14 @@ static int user_main(int argc, char *argv[]) check_test_memory_usage(); #endif +#ifdef CONFIG_SCHED_WAITPID + /* Verify pthread_exit() and pthread_self() */ + + printf("\nuser_main: pthread_exit() test\n"); + pthread_exit_test(); + check_test_memory_usage(); +#endif + /* Verify pthreads rwlock interfaces */ printf("\nuser_main: pthread_rwlock test\n"); diff --git a/testing/ostest/pthread_exit.c b/testing/ostest/pthread_exit.c new file mode 100644 index 000000000..19cc5fef8 --- /dev/null +++ b/testing/ostest/pthread_exit.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * apps/testing/ostest/pthread_exit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "ostest.h" + +#ifdef CONFIG_SCHED_WAITPID + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define PRIORITY 100 + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void *pthread_exit_thread(FAR void *parameter) +{ + unsigned me = (unsigned)pthread_self(); + + printf("pthread_exit_thread %u: Sleeping for 10 second\n", me); + sleep(5); + printf("pthread_exit_thread %u: Still running...\n", me); + sleep(5); + printf("pthread_exit_thread %u: Exiting\n", me); + return NULL; +} + +static int pthread_exit_main(int argc, char **argv) +{ + pthread_t child; +#ifdef SDCC + pthread_attr_t attr; +#endif + unsigned me = (unsigned)pthread_self(); + int ret; + + printf("pthread_exit_main %u: Starting pthread_exit_thread\n", me); +#ifdef SDCC + pthread_attr_init(&attr); + ret = pthread_create(&child, &attr, pthread_exit_thread, NULL); +#else + ret = pthread_create(&child, NULL, pthread_exit_thread, NULL); +#endif + if (ret != 0) + { + printf("Thread creation failed, return code %d", ret); + } + + printf("pthread_exit_main %u: Sleeping for 5 seconds\n", me); + fflush(stdout); + sleep(5); + + printf("pthread_exit_main %u: Calling pthread_exit()\n", me); + pthread_exit(NULL); + + printf("pthread_exit_main %u: ERROR: Still running\n", me); + exit(0); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void pthread_exit_test(void) +{ + int statloc; + int ret; + + ret = task_create("pthread_exit", PRIORITY, STACKSIZE, pthread_exit_main, + NULL); + if (ret < 0) + { + printf("pthread_exit_test: ERROR task_create Failed\n"); + } + else + { + printf("pthread_exit_test: Started pthread_exit_main at PID=%d\n", + ret); + waitpid((pid_t)ret, &statloc, 0); + } +} + +#endif /* CONFIG_SCHED_WAITPID */