Home | History | Annotate | Download | only in pthreads-win32
      1 /*
      2  * pthread_self.c
      3  *
      4  * Description:
      5  * This translation unit implements miscellaneous thread functions.
      6  *
      7  * --------------------------------------------------------------------------
      8  *
      9  *      Pthreads-win32 - POSIX Threads Library for Win32
     10  *      Copyright(C) 1998 John E. Bossom
     11  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
     12  *
     13  *      Contact Email: rpj (at) callisto.canberra.edu.au
     14  *
     15  *      The current list of contributors is contained
     16  *      in the file CONTRIBUTORS included with the source
     17  *      code distribution. The list can also be seen at the
     18  *      following World Wide Web location:
     19  *      http://sources.redhat.com/pthreads-win32/contributors.html
     20  *
     21  *      This library is free software; you can redistribute it and/or
     22  *      modify it under the terms of the GNU Lesser General Public
     23  *      License as published by the Free Software Foundation; either
     24  *      version 2 of the License, or (at your option) any later version.
     25  *
     26  *      This library is distributed in the hope that it will be useful,
     27  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
     28  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     29  *      Lesser General Public License for more details.
     30  *
     31  *      You should have received a copy of the GNU Lesser General Public
     32  *      License along with this library in the file COPYING.LIB;
     33  *      if not, write to the Free Software Foundation, Inc.,
     34  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
     35  */
     36 
     37 #include "pthread.h"
     38 #include "implement.h"
     39 
     40 pthread_t
     41 pthread_self (void)
     42      /*
     43       * ------------------------------------------------------
     44       * DOCPUBLIC
     45       *      This function returns a reference to the current running
     46       *      thread.
     47       *
     48       * PARAMETERS
     49       *      N/A
     50       *
     51       *
     52       * DESCRIPTION
     53       *      This function returns a reference to the current running
     54       *      thread.
     55       *
     56       * RESULTS
     57       *              pthread_t       reference to the current thread
     58       *
     59       * ------------------------------------------------------
     60       */
     61 {
     62   pthread_t self;
     63   pthread_t nil = {NULL, 0};
     64   ptw32_thread_t * sp;
     65 
     66 #if defined(_UWIN)
     67   if (!ptw32_selfThreadKey)
     68     return nil;
     69 #endif
     70 
     71   sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey);
     72 
     73   if (sp != NULL)
     74     {
     75       self = sp->ptHandle;
     76     }
     77   else
     78     {
     79       /*
     80        * Need to create an implicit 'self' for the currently
     81        * executing thread.
     82        */
     83       self = ptw32_new ();
     84       sp = (ptw32_thread_t *) self.p;
     85 
     86       if (sp != NULL)
     87 	{
     88 	  /*
     89 	   * This is a non-POSIX thread which has chosen to call
     90 	   * a POSIX threads function for some reason. We assume that
     91 	   * it isn't joinable, but we do assume that it's
     92 	   * (deferred) cancelable.
     93 	   */
     94 	  sp->implicit = 1;
     95 	  sp->detachState = PTHREAD_CREATE_DETACHED;
     96 	  sp->thread = GetCurrentThreadId ();
     97 
     98 #if defined(NEED_DUPLICATEHANDLE)
     99 	  /*
    100 	   * DuplicateHandle does not exist on WinCE.
    101 	   *
    102 	   * NOTE:
    103 	   * GetCurrentThread only returns a pseudo-handle
    104 	   * which is only valid in the current thread context.
    105 	   * Therefore, you should not pass the handle to
    106 	   * other threads for whatever purpose.
    107 	   */
    108 	  sp->threadH = GetCurrentThread ();
    109 #else
    110 	  if (!DuplicateHandle (GetCurrentProcess (),
    111 				GetCurrentThread (),
    112 				GetCurrentProcess (),
    113 				&sp->threadH,
    114 				0, FALSE, DUPLICATE_SAME_ACCESS))
    115 	    {
    116 	      /*
    117 	       * Should not do this, but we have no alternative if
    118 	       * we can't get a Win32 thread handle.
    119 	       * Thread structs are never freed.
    120 	       */
    121 	      ptw32_threadReusePush (self);
    122 	      /*
    123 	       * As this is a win32 thread calling us and we have failed,
    124 	       * return a value that makes sense to win32.
    125 	       */
    126 	      return nil;
    127 	    }
    128 #endif
    129 
    130 	  /*
    131 	   * No need to explicitly serialise access to sched_priority
    132 	   * because the new handle is not yet public.
    133 	   */
    134 	  sp->sched_priority = GetThreadPriority (sp->threadH);
    135 	  pthread_setspecific (ptw32_selfThreadKey, (void *) sp);
    136 	}
    137     }
    138 
    139   return (self);
    140 
    141 }				/* pthread_self */
    142