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-win32 - POSIX Threads Library for Win32
11  *      Copyright(C) 1998 John E. Bossom
12  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
13  *
14  *      Contact Email: rpj@callisto.canberra.edu.au
15  *
16  *      The current list of contributors is contained
17  *      in the file CONTRIBUTORS included with the source
18  *      code distribution. The list can also be seen at the
19  *      following World Wide Web location:
20  *      http://sources.redhat.com/pthreads-win32/contributors.html
21  *
22  *      This library is free software; you can redistribute it and/or
23  *      modify it under the terms of the GNU Lesser General Public
24  *      License as published by the Free Software Foundation; either
25  *      version 2 of the License, or (at your option) any later version.
26  *
27  *      This library is distributed in the hope that it will be useful,
28  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
29  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
30  *      Lesser General Public License for more details.
31  *
32  *      You should have received a copy of the GNU Lesser General Public
33  *      License along with this library in the file COPYING.LIB;
34  *      if not, write to the Free Software Foundation, Inc.,
35  *      51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
36  */
37 
38 #include "pthread.h"
39 #include "implement.h"
40 #if !defined(_UWIN)
41 /*#   include <process.h> */
42 #endif
43 
44 void
pthread_exit(void * value_ptr)45 pthread_exit (void *value_ptr)
46      /*
47       * ------------------------------------------------------
48       * DOCPUBLIC
49       *      This function terminates the calling thread, returning
50       *      the value 'value_ptr' to any joining thread.
51       *
52       * PARAMETERS
53       *      value_ptr
54       *              a generic data value (i.e. not the address of a value)
55       *
56       *
57       * DESCRIPTION
58       *      This function terminates the calling thread, returning
59       *      the value 'value_ptr' to any joining thread.
60       *      NOTE: thread should be joinable.
61       *
62       * RESULTS
63       *              N/A
64       *
65       * ------------------------------------------------------
66       */
67 {
68   ptw32_thread_t * sp;
69 
70   /*
71    * Don't use pthread_self() to avoid creating an implicit POSIX thread handle
72    * unnecessarily.
73    */
74   sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey);
75 
76 #if defined(_UWIN)
77   if (--pthread_count <= 0)
78     exit ((int) value_ptr);
79 #endif
80 
81   if (NULL == sp)
82     {
83       /*
84        * A POSIX thread handle was never created. I.e. this is a
85        * Win32 thread that has never called a pthreads-win32 routine that
86        * required a POSIX handle.
87        *
88        * Implicit POSIX handles are cleaned up in ptw32_throw() now.
89        */
90 
91 #if ! (defined (__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__)  || defined (__DMC__)
92       _endthreadex ((unsigned) (size_t) value_ptr);
93 #else
94       _endthread ();
95 #endif
96 
97       /* Never reached */
98     }
99 
100   sp->exitStatus = value_ptr;
101 
102   ptw32_throw (PTW32_EPS_EXIT);
103 
104   /* Never reached. */
105 
106 }
107