41#include "MagickCore/studio.h"
42#include "MagickCore/memory_.h"
43#include "MagickCore/thread_.h"
44#include "MagickCore/thread-private.h"
56 (*destructor)(
void *);
84MagickExport MagickBooleanType CreateMagickThreadKey(MagickThreadKey *key,
85 void (*destructor)(
void *))
87#if defined(MAGICKCORE_THREAD_SUPPORT)
88 return(pthread_key_create(key,destructor) == 0 ? MagickTrue : MagickFalse);
89#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
90 magick_unreferenced(destructor);
92 return(*key != TLS_OUT_OF_INDEXES ? MagickTrue : MagickFalse);
98 keys=(MagickThreadValue **) key;
99 *keys=(MagickThreadValue *) AcquireMagickMemory(
sizeof(**keys));
100 if (*keys != (MagickThreadValue *) NULL)
102 (*keys)->number_threads=GetOpenMPMaximumThreads();
103 (*keys)->values=(
void **) AcquireQuantumMemory((*keys)->number_threads,
105 if ((*keys)->values == (
void **) NULL)
106 *keys=(MagickThreadValue *) RelinquishMagickMemory(*keys);
108 (
void) memset((*keys)->values,0,(*keys)->number_threads*
110 (*keys)->destructor=destructor;
112 return((*keys != (MagickThreadValue *) NULL) ? MagickTrue : MagickFalse);
139MagickExport MagickBooleanType DeleteMagickThreadKey(MagickThreadKey key)
141#if defined(MAGICKCORE_THREAD_SUPPORT)
142 return(pthread_key_delete(key) == 0 ? MagickTrue : MagickFalse);
143#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
144 return(TlsFree(key) != 0 ? MagickTrue : MagickFalse);
153 keys=(MagickThreadValue *) key;
154 for (i=0; i < (ssize_t) keys->number_threads; i++)
155 if ((keys->destructor != (
void *) NULL) &&
156 (keys->values[i] != (
void *) NULL))
158 keys->destructor(keys->values[i]);
159 keys->values[i]=(
void *) NULL;
161 keys=(MagickThreadValue *) RelinquishMagickMemory(keys);
190MagickExport
void *GetMagickThreadValue(MagickThreadKey key)
192#if defined(MAGICKCORE_THREAD_SUPPORT)
193 return(pthread_getspecific(key));
194#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
195 return(TlsGetValue(key));
201 keys=(MagickThreadValue *) key;
202 return(keys->values[GetOpenMPThreadId()]);
233MagickExport MagickBooleanType SetMagickThreadValue(MagickThreadKey key,
236#if defined(MAGICKCORE_THREAD_SUPPORT)
237 return(pthread_setspecific(key,value) == 0 ? MagickTrue : MagickFalse);
238#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
239 return(TlsSetValue(key,(
void *) value) != 0 ? MagickTrue : MagickFalse);
245 keys=(MagickThreadValue *) key;
246 keys->values[GetOpenMPThreadId()]=(
void *) value;