]> granicus.if.org Git - imagemagick/blob - MagickCore/thread.c
(no commit message)
[imagemagick] / MagickCore / thread.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                  TTTTT  H   H  RRRR   EEEEE   AAA   DDDD                    %
6 %                    T    H   H  R   R  E      A   A  D   D                   %
7 %                    T    HHHHH  RRRR   EEE    AAAAA  D   D                   %
8 %                    T    H   H  R R    E      A   A  D   D                   %
9 %                    T    H   H  R  R   EEEEE  A   A  DDDD                    %
10 %                                                                             %
11 %                                                                             %
12 %                         MagickCore Thread Methods                           %
13 %                                                                             %
14 %                             Software Design                                 %
15 %                                  Cristy                                     %
16 %                               March  2003                                   %
17 %                                                                             %
18 %                                                                             %
19 %  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
20 %  dedicated to making software imaging solutions freely available.           %
21 %                                                                             %
22 %  You may not use this file except in compliance with the License.  You may  %
23 %  obtain a copy of the License at                                            %
24 %                                                                             %
25 %    http://www.imagemagick.org/script/license.php                            %
26 %                                                                             %
27 %  Unless required by applicable law or agreed to in writing, software        %
28 %  distributed under the License is distributed on an "AS IS" BASIS,          %
29 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
30 %  See the License for the specific language governing permissions and        %
31 %  limitations under the License.                                             %
32 %                                                                             %
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34 %
35 %
36 */
37 \f
38 /*
39   Include declarations.
40 */
41 #include "MagickCore/studio.h"
42 #include "MagickCore/memory_.h"
43 #include "MagickCore/thread_.h"
44 #include "MagickCore/thread-private.h"
45 \f
46 /*
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 %                                                                             %
49 %                                                                             %
50 %                                                                             %
51 %   M a g i c k C r e a t e T h r e a d K e y                                 %
52 %                                                                             %
53 %                                                                             %
54 %                                                                             %
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 %
57 %  MagickCreateThreadKey() creates a thread key and returns it.
58 %
59 %  The format of the MagickCreateThreadKey method is:
60 %
61 %      MagickThreadKey MagickCreateThreadKey(MagickThreadKey *key)
62 %
63 */
64 MagickExport MagickBooleanType MagickCreateThreadKey(MagickThreadKey *key)
65 {
66 #if defined(MAGICKCORE_THREAD_SUPPORT)
67   return(pthread_key_create(key,NULL) == 0 ? MagickTrue : MagickFalse);
68 #elif defined(MAGICKCORE_HAVE_WINTHREADS)
69   *key=TlsAlloc();
70   return(*key != TLS_OUT_OF_INDEXES ? MagickTrue : MagickFalse);
71 #else
72   *key=AcquireMagickMemory(sizeof(key));
73   return(*key != (void *) NULL ? MagickTrue : MagickFalse);
74 #endif
75 }
76 \f
77 /*
78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79 %                                                                             %
80 %                                                                             %
81 %                                                                             %
82 %   M a g i c k D e l e t e T h r e a d K e y                                 %
83 %                                                                             %
84 %                                                                             %
85 %                                                                             %
86 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87 %
88 %  MagickDeleteThreadKey() deletes a thread key.
89 %
90 %  The format of the AcquireAESInfo method is:
91 %
92 %      MagickBooleanType MagickDeleteThreadKey(MagickThreadKey key)
93 %
94 %  A description of each parameter follows:
95 %
96 %    o key: the thread key.
97 %
98 */
99 MagickExport MagickBooleanType MagickDeleteThreadKey(MagickThreadKey key)
100 {
101 #if defined(MAGICKCORE_THREAD_SUPPORT)
102   return(pthread_key_delete(key) == 0 ? MagickTrue : MagickFalse);
103 #elif defined(MAGICKCORE_HAVE_WINTHREADS)
104   return(TlsFree(key) != 0 ? MagickTrue : MagickFalse);
105 #else
106   key=(MagickThreadKey) RelinquishMagickMemory(key);
107   return(MagickTrue);
108 #endif
109 }
110 \f
111 /*
112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113 %                                                                             %
114 %                                                                             %
115 %                                                                             %
116 %   M a g i c k G e t T h r e a d V a l u e                                   %
117 %                                                                             %
118 %                                                                             %
119 %                                                                             %
120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
121 %
122 %  MagickGetThreadValue() returns a value associated with the thread key.
123 %
124 %  The format of the MagickGetThreadValue method is:
125 %
126 %      void *MagickGetThreadValue(MagickThreadKey key)
127 %
128 %  A description of each parameter follows:
129 %
130 %    o key: the thread key.
131 %
132 */
133 MagickExport void *MagickGetThreadValue(MagickThreadKey key)
134 {
135 #if defined(MAGICKCORE_THREAD_SUPPORT)
136   return(pthread_getspecific(key));
137 #elif defined(MAGICKCORE_HAVE_WINTHREADS)
138   return(TlsGetValue(key));
139 #else
140   return((void *) (*key));
141 #endif
142 }
143 \f
144 /*
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146 %                                                                             %
147 %                                                                             %
148 %                                                                             %
149 %   M a g i c k S e t T h r e a d V a l u e                                   %
150 %                                                                             %
151 %                                                                             %
152 %                                                                             %
153 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154 %
155 %  MagickSetThreadValue() associates a value with the thread key.
156 %
157 %  The format of the MagickSetThreadValue method is:
158 %
159 %      MagickBooleanType MagickSetThreadValue(MagickThreadKey key,
160 %        const void *value)
161 %
162 %  A description of each parameter follows:
163 %
164 %    o key: the thread key.
165 %
166 %    o value: the value
167 %
168 */
169 MagickExport MagickBooleanType MagickSetThreadValue(MagickThreadKey key,
170   const void *value)
171 {
172 #if defined(MAGICKCORE_THREAD_SUPPORT)
173   return(pthread_setspecific(key,value) == 0 ? MagickTrue : MagickFalse);
174 #elif defined(MAGICKCORE_HAVE_WINTHREADS)
175   return(TlsSetValue(key,(void *) value) != 0 ? MagickTrue : MagickFalse);
176 #else
177   *key=(size_t) value;
178   return(MagickTrue);
179 #endif
180 }