/[pcsx2_0.9.7]/trunk/3rdparty/w32pthreads/pthread_setspecific.c
ViewVC logotype

Contents of /trunk/3rdparty/w32pthreads/pthread_setspecific.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations) (download)
Tue Sep 7 03:24:11 2010 UTC (9 years, 11 months ago) by william
File MIME type: text/plain
File size: 4467 byte(s)
committing r3113 initial commit again...
1 /*
2 * pthread_setspecific.c
3 *
4 * Description:
5 * POSIX thread functions which implement thread-specific data (TSD).
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@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 "ptw32pch.h"
38
39
40 int
41 pthread_setspecific (pthread_key_t key, const void *value)
42 /*
43 * ------------------------------------------------------
44 * DOCPUBLIC
45 * This function sets the value of the thread specific
46 * key in the calling thread.
47 *
48 * PARAMETERS
49 * key
50 * an instance of pthread_key_t
51 * value
52 * the value to set key to
53 *
54 *
55 * DESCRIPTION
56 * This function sets the value of the thread specific
57 * key in the calling thread.
58 *
59 * RESULTS
60 * 0 successfully set value
61 * EAGAIN could not set value
62 * ENOENT SERIOUS!!
63 *
64 * ------------------------------------------------------
65 */
66 {
67 pthread_t self;
68 int result = 0;
69
70 if (key != ptw32_selfThreadKey)
71 {
72 /*
73 * Using pthread_self will implicitly create
74 * an instance of pthread_t for the current
75 * thread if one wasn't explicitly created
76 */
77 self = pthread_self ();
78 if (self.p == NULL)
79 {
80 return ENOENT;
81 }
82 }
83 else
84 {
85 /*
86 * Resolve catch-22 of registering thread with selfThread
87 * key
88 */
89 ptw32_thread_t * sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey);
90
91 if (sp == NULL)
92 {
93 if (value == NULL)
94 {
95 return ENOENT;
96 }
97 self = *((pthread_t *) value);
98 }
99 else
100 {
101 self = sp->ptHandle;
102 }
103 }
104
105 result = 0;
106
107 if (key != NULL)
108 {
109 if (self.p != NULL && key->destructor != NULL && value != NULL)
110 {
111 /*
112 * Only require associations if we have to
113 * call user destroy routine.
114 * Don't need to locate an existing association
115 * when setting data to NULL for WIN32 since the
116 * data is stored with the operating system; not
117 * on the association; setting assoc to NULL short
118 * circuits the search.
119 */
120 ThreadKeyAssoc *assoc;
121
122 if (pthread_mutex_lock(&(key->keyLock)) == 0)
123 {
124 ptw32_thread_t * sp = (ptw32_thread_t *) self.p;
125
126 (void) pthread_mutex_lock(&(sp->threadLock));
127
128 assoc = (ThreadKeyAssoc *) sp->keys;
129 /*
130 * Locate existing association
131 */
132 while (assoc != NULL)
133 {
134 if (assoc->key == key)
135 {
136 /*
137 * Association already exists
138 */
139 break;
140 }
141 assoc = assoc->nextKey;
142 }
143
144 /*
145 * create an association if not found
146 */
147 if (assoc == NULL)
148 {
149 result = ptw32_tkAssocCreate (sp, key);
150 }
151
152 (void) pthread_mutex_unlock(&(sp->threadLock));
153 }
154 (void) pthread_mutex_unlock(&(key->keyLock));
155 }
156
157 if (result == 0)
158 {
159 if (!TlsSetValue (key->key, (LPVOID) value))
160 {
161 result = EAGAIN;
162 }
163 }
164 }
165
166 return (result);
167 } /* pthread_setspecific */

  ViewVC Help
Powered by ViewVC 1.1.22