Home | History | Annotate | Download | only in pthreads-win32
      1 /*
      2  * errno.c
      3  *
      4  * Description:
      5  * This translation unit implements routines associated with spawning a new
      6  * 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 #if defined(NEED_ERRNO)
     39 
     40 #include "pthread.h"
     41 #include "implement.h"
     42 
     43 static int reallyBad = ENOMEM;
     44 
     45 /*
     46  * Re-entrant errno.
     47  *
     48  * Each thread has it's own errno variable in pthread_t.
     49  *
     50  * The benefit of using the pthread_t structure
     51  * instead of another TSD key is TSD keys are limited
     52  * on Win32 to 64 per process. Secondly, to implement
     53  * it properly without using pthread_t you'd need
     54  * to dynamically allocate an int on starting the thread
     55  * and store it manually into TLS and then ensure that you free
     56  * it on thread termination. We get all that for free
     57  * by simply storing the errno on the pthread_t structure.
     58  *
     59  * MSVC and Mingw32 already have their own thread-safe errno.
     60  *
     61  * #if defined( _REENTRANT ) || defined( _MT )
     62  * #define errno *_errno()
     63  *
     64  * int *_errno( void );
     65  * #else
     66  * extern int errno;
     67  * #endif
     68  *
     69  */
     70 
     71 int *
     72 _errno (void)
     73 {
     74   pthread_t self;
     75   int *result;
     76 
     77   if ((self = pthread_self ()).p == NULL)
     78     {
     79       /*
     80        * Yikes! unable to allocate a thread!
     81        * Throw an exception? return an error?
     82        */
     83       result = &reallyBad;
     84     }
     85   else
     86     {
     87       result = (int *)(&self.p->exitStatus);
     88     }
     89 
     90   return (result);
     91 
     92 }				/* _errno */
     93 
     94 #endif /* (NEED_ERRNO) */
     95