41#include "magick/studio.h"
42#include "magick/memory_.h"
43#include "magick/thread_.h"
44#include "magick/thread-private.h"
56 (*destructor)(
void *);
60MagickExport 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);
74MagickExport 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);
87MagickExport
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));
99MagickExport 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);
137MagickExport 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;
192MagickExport 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;
243MagickExport
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()]);
286MagickExport 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;