Home | History | Annotate | Download | only in pthreads-win32
      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