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 (at) 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 44 void 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