1 /*
2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
3  * Created by:  rolla.n.selbak REMOVE-THIS AT intel DOT com
4  * This file is licensed under the GPL license.  For the full content
5  * of this license, see the COPYING file at the top level of this
6  * source tree.
7 
8  * Test that pthread_exit()
9  *
10  * terminates the calling thread and makes the value 'value_ptr' available
11  * to any successful join with the terminating thread.
12  *
13  * Steps:
14  * 1.  Create a new thread.  Have it return a return code on pthread_exit();
15  * 2.  Call pthread_join() in main(), and pass to it 'value_ptr'.
16  * 3.  Check to see of the value_ptr and the value returned by pthread_exit() are the same;
17  *
18  */
19 
20 #include <pthread.h>
21 #include <stdio.h>
22 #include <unistd.h>
23 #include "posixtest.h"
24 
25 #define RETURN_CODE 100     /* Set a random return code number. This shall be the return code of the
26                    thread when using pthread_exit(). */
27 
28 #define INTHREAD 0      /* Control going to or is already for Thread */
29 #define INMAIN 1        /* Control going to or is already for Main */
30 
31 static int sem;         /* Manual semaphore used to indicate when the thread has been created. */
32 
33 /* Thread's function. */
a_thread_func()34 static void *a_thread_func()
35 {
36     sem = INMAIN;
37     pthread_exit((void *)RETURN_CODE);
38     return NULL;
39 }
40 
posix_testcase(void)41 static int posix_testcase(void)
42 {
43     pthread_t new_th;
44     int *value_ptr;
45 
46     /* Initializing variables. */
47     value_ptr = 0;
48     sem = INTHREAD;
49 
50     /* Create a new thread. */
51     if (pthread_create(&new_th, NULL, a_thread_func, NULL) != 0) {
52         perror("Error creating thread\n");
53         return PTS_UNRESOLVED;
54     }
55 
56     /* Make sure the thread was created before we join it. */
57     while (sem == INTHREAD)
58         sleep(1);
59 
60     /* Wait for thread to return */
61     if (pthread_join(new_th, (void *)&value_ptr) != 0) {
62         perror("Error in pthread_join()\n");
63         return PTS_UNRESOLVED;
64     }
65 
66     /* Check to make sure that 'value_ptr' that was passed to pthread_join() and the
67      * pthread_exit() return code that was used in the thread function are the same. */
68     if ((long)value_ptr != RETURN_CODE) {
69         printf
70             ("Test FAILED: pthread_exit() could not pass the return value of the thread in 'value_ptr' to pthread_join().\n");
71         return PTS_FAIL;
72     }
73 
74     printf("Test PASSED\n");
75     return PTS_PASS;
76 }
77 #include <rtt_utest_internal.h>
78 UTEST_TC_EXPORT(testcase, "posix.pthread_exit.1-1.c", RT_NULL, RT_NULL, 10);
79 
80