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=(
void **) AcquireQuantumMemory((*keys)->number_threads,
158 if ((*keys)->values == (
void **) NULL)
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;