xref: /relibc/pthreads-emb/pthread_self.c (revision a12978ccca4c576f02971f5cfc2cbefe23e4daba)
1 /*
2  * pthread_self.c
3  *
4  * Description:
5  * This translation unit implements miscellaneous thread functions.
6  *
7  * --------------------------------------------------------------------------
8  *
9  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
10  *      Copyright(C) 2008 Jason Schmidlapp
11  *
12  *      Contact Email: jschmidlapp@users.sourceforge.net
13  *
14  *
15  *      Based upon Pthreads-win32 - POSIX Threads Library for Win32
16  *      Copyright(C) 1998 John E. Bossom
17  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
18  *
19  *      Contact Email: rpj@callisto.canberra.edu.au
20  *
21  *      The original list of contributors to the Pthreads-win32 project
22  *      is contained in the file CONTRIBUTORS.ptw32 included with the
23  *      source code distribution. The list can also be seen at the
24  *      following World Wide Web location:
25  *      http://sources.redhat.com/pthreads-win32/contributors.html
26  *
27  *      This library is free software; you can redistribute it and/or
28  *      modify it under the terms of the GNU Lesser General Public
29  *      License as published by the Free Software Foundation; either
30  *      version 2 of the License, or (at your option) any later version.
31  *
32  *      This library is distributed in the hope that it will be useful,
33  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
34  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
35  *      Lesser General Public License for more details.
36  *
37  *      You should have received a copy of the GNU Lesser General Public
38  *      License along with this library in the file COPYING.LIB;
39  *      if not, write to the Free Software Foundation, Inc.,
40  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
41  */
42 
43 #include <stdio.h>
44 #include <stdlib.h>
45 
46 #include "pthread.h"
47 #include "implement.h"
48 
49 pthread_t
pthread_self(void)50 pthread_self (void)
51 /*
52  * ------------------------------------------------------
53  * DOCPUBLIC
54  *      This function returns a reference to the current running
55  *      thread.
56  *
57  * PARAMETERS
58  *      N/A
59  *
60  *
61  * DESCRIPTION
62  *      This function returns a reference to the current running
63  *      thread.
64  *
65  * RESULTS
66  *              pthread_t       reference to the current thread
67  *
68  * ------------------------------------------------------
69  */
70 {
71   pthread_t self;
72   pte_thread_t * sp;
73 
74   sp = (pte_thread_t *) pthread_getspecific (pte_selfThreadKey);
75 
76   if (sp != NULL)
77     {
78       self = sp->ptHandle;
79     }
80   else
81     {
82       /*
83        * Need to create an implicit 'self' for the currently
84        * executing thread.
85        *
86        * Note that this is a potential memory leak as there is
87        * no way to free the memory and any resources allocated
88        * by pte_new!
89        */
90       self = pte_new ();
91       sp = (pte_thread_t *) self;
92 
93       if (sp != NULL)
94         {
95           /*
96            * This is a non-POSIX thread which has chosen to call
97            * a POSIX threads function for some reason. We assume that
98            * it isn't joinable, but we do assume that it's
99            * (deferred) cancelable.
100            */
101           sp->implicit = 1;
102           sp->detachState = PTHREAD_CREATE_DETACHED;
103 
104           sp->threadId = pte_osThreadGetHandle();
105           /*
106            * No need to explicitly serialise access to sched_priority
107            * because the new handle is not yet public.
108            */
109           sp->sched_priority = 0;
110 
111           pthread_setspecific (pte_selfThreadKey, (void *) sp);
112         }
113     }
114 
115   return (self);
116 
117 }				/* pthread_self */
118