This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 6d9259f33 Add small test of pthread_exit()/pthread_self() on main
thread.
6d9259f33 is described below
commit 6d9259f334de431f1e934cae14f447a3857ae17b
Author: Gregory Nutt <[email protected]>
AuthorDate: Wed Jun 28 09:37:49 2023 -0600
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(+)
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 <nuttx/config.h>
+#include <sys/wait.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <errno.h>
+
+#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 */