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 *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
36 */
37
38#include "pthread.h"
39#include "implement.h"
40#if !defined(_UWIN)
41/*#   include <process.h> */
42#endif
43
44void
45pthread_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