41 #include "magick/studio.h"
42 #include "magick/memory_.h"
43 #include "magick/thread_.h"
44 #include "magick/thread-private.h"
56 (*destructor)(
void *);
60 MagickExport MagickBooleanType MagickCreateThreadKey(MagickThreadKey *key)
62 #if defined(MAGICKCORE_THREAD_SUPPORT)
63 return(pthread_key_create(key,NULL) == 0 ? MagickTrue : MagickFalse);
64 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
66 return(*key != TLS_OUT_OF_INDEXES ? MagickTrue : MagickFalse);
68 *key=AcquireMagickMemory(
sizeof(key));
69 return(*key != (
void *) NULL ? MagickTrue : MagickFalse);
74 MagickExport MagickBooleanType MagickDeleteThreadKey(MagickThreadKey key)
76 #if defined(MAGICKCORE_THREAD_SUPPORT)
77 return(pthread_key_delete(key) == 0 ? MagickTrue : MagickFalse);
78 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
79 return(TlsFree(key) != 0 ? MagickTrue : MagickFalse);
81 key=(MagickThreadKey) RelinquishMagickMemory(key);
87 MagickExport
void *MagickGetThreadValue(MagickThreadKey key)
89 #if defined(MAGICKCORE_THREAD_SUPPORT)
90 return(pthread_getspecific(key));
91 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
92 return(TlsGetValue(key));
99 MagickExport MagickBooleanType MagickSetThreadValue(MagickThreadKey key,
102 #if defined(MAGICKCORE_THREAD_SUPPORT)
103 return(pthread_setspecific(key,value) == 0 ? MagickTrue : MagickFalse);
104 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
105 return(TlsSetValue(key,(
void *) value) != 0 ? MagickTrue : MagickFalse);
137 MagickExport MagickBooleanType CreateMagickThreadKey(MagickThreadKey *key,
138 void (*destructor)(
void *))
140 #if defined(MAGICKCORE_THREAD_SUPPORT)
141 return(pthread_key_create(key,destructor) == 0 ? MagickTrue : MagickFalse);
142 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
143 magick_unreferenced(destructor);
145 return(*key != TLS_OUT_OF_INDEXES ? MagickTrue : MagickFalse);
155 (*keys)->number_threads=GetOpenMPMaximumThreads();
156 (*keys)->values=AcquireQuantumMemory((*keys)->number_threads,
158 if ((*keys)->values == (
void *) NULL)
159 *keys=RelinquishMagickMemory(*keys);
161 (
void) memset((*keys)->values,0,(*keys)->number_threads*
163 (*keys)->destructor=destructor;
192 MagickExport MagickBooleanType DeleteMagickThreadKey(MagickThreadKey key)
194 #if defined(MAGICKCORE_THREAD_SUPPORT)
195 return(pthread_key_delete(key) == 0 ? MagickTrue : MagickFalse);
196 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
197 return(TlsFree(key) != 0 ? MagickTrue : MagickFalse);
207 for (i=0; i < (ssize_t) keys->number_threads; i++)
208 if ((keys->destructor != (
void *) NULL) &&
209 (keys->values[i] != (
void *) NULL))
211 keys->destructor(keys->values[i]);
212 keys->values[i]=(
void *) NULL;
243 MagickExport
void *GetMagickThreadValue(MagickThreadKey key)
245 #if defined(MAGICKCORE_THREAD_SUPPORT)
246 return(pthread_getspecific(key));
247 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
248 return(TlsGetValue(key));
255 return(keys->values[GetOpenMPThreadId()]);
286 MagickExport MagickBooleanType SetMagickThreadValue(MagickThreadKey key,
289 #if defined(MAGICKCORE_THREAD_SUPPORT)
290 return(pthread_setspecific(key,value) == 0 ? MagickTrue : MagickFalse);
291 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
292 return(TlsSetValue(key,(
void *) value) != 0 ? MagickTrue : MagickFalse);
299 keys->values[GetOpenMPThreadId()]=(
void *) value;