1 /*
2 * pthread_exit.c
3 *
4 * Description:
5 * This translation unit implements routines associated with exiting from
6 * a thread.
7 *
8 * --------------------------------------------------------------------------
9 *
10 * Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
11 * Copyright(C) 2008 Jason Schmidlapp
12 *
13 * Contact Email: jschmidlapp@users.sourceforge.net
14 *
15 *
16 * Based upon Pthreads-win32 - POSIX Threads Library for Win32
17 * Copyright(C) 1998 John E. Bossom
18 * Copyright(C) 1999,2005 Pthreads-win32 contributors
19 *
20 * Contact Email: rpj@callisto.canberra.edu.au
21 *
22 * The original list of contributors to the Pthreads-win32 project
23 * is contained in the file CONTRIBUTORS.ptw32 included with the
24 * source code distribution. The list can also be seen at the
25 * following World Wide Web location:
26 * http://sources.redhat.com/pthreads-win32/contributors.html
27 *
28 * This library is free software; you can redistribute it and/or
29 * modify it under the terms of the GNU Lesser General Public
30 * License as published by the Free Software Foundation; either
31 * version 2 of the License, or (at your option) any later version.
32 *
33 * This library is distributed in the hope that it will be useful,
34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
36 * Lesser General Public License for more details.
37 *
38 * You should have received a copy of the GNU Lesser General Public
39 * License along with this library in the file COPYING.LIB;
40 * if not, write to the Free Software Foundation, Inc.,
41 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
42 */
43
44 #include "pthread.h"
45 #include "implement.h"
46
47 void
pthread_exit(void * value_ptr)48 pthread_exit (void *value_ptr)
49 /*
50 * ------------------------------------------------------
51 * DOCPUBLIC
52 * This function terminates the calling thread, returning
53 * the value 'value_ptr' to any joining thread.
54 *
55 * PARAMETERS
56 * value_ptr
57 * a generic data value (i.e. not the address of a value)
58 *
59 *
60 * DESCRIPTION
61 * This function terminates the calling thread, returning
62 * the value 'value_ptr' to any joining thread.
63 * NOTE: thread should be joinable.
64 *
65 * RESULTS
66 * N/A
67 *
68 * ------------------------------------------------------
69 */
70 {
71 pte_thread_t * sp;
72
73 /*
74 * Don't use pthread_self() to avoid creating an implicit POSIX thread handle
75 * unnecessarily.
76 */
77 sp = (pte_thread_t *) pthread_getspecific (pte_selfThreadKey);
78
79 if (NULL == sp)
80 {
81 /*
82 * A POSIX thread handle was never created. I.e. this is a
83 * Win32 thread that has never called a pthreads-win32 routine that
84 * required a POSIX handle.
85 *
86 * Implicit POSIX handles are cleaned up in pte_throw() now.
87 */
88
89 /* Terminate thread */
90 pte_osThreadExit();
91
92 /* Never reached */
93 }
94
95 sp->exitStatus = value_ptr;
96
97 pte_throw (PTE_EPS_EXIT);
98
99 /* Never reached. */
100
101 }
102