18 #ifndef MAGICKCORE_MUTEX_H
19 #define MAGICKCORE_MUTEX_H
21 #if defined(__cplusplus) || defined(c_plusplus)
33 #if defined(MAGICKCORE_OPENMP_SUPPORT)
34 static MagickBooleanType
35 translation_unit_initialized = MagickFalse;
38 translation_unit_mutex;
39 #elif defined(MAGICKCORE_THREAD_SUPPORT)
40 static pthread_mutex_t
41 translation_unit_mutex = PTHREAD_MUTEX_INITIALIZER;
42 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
44 translation_unit_mutex = 0;
47 static inline void DestroyMagickMutex(
void)
49 #if defined(MAGICKCORE_OPENMP_SUPPORT)
50 if (translation_unit_initialized != MagickFalse)
51 omp_destroy_lock(&translation_unit_mutex);
52 translation_unit_initialized=MagickFalse;
56 static inline void InitializeMagickMutex(
void)
58 #if defined(MAGICKCORE_OPENMP_SUPPORT)
59 if (translation_unit_initialized == MagickFalse)
60 omp_init_lock(&translation_unit_mutex);
61 translation_unit_initialized=MagickTrue;
65 static inline void LockMagickMutex(
void)
67 #if defined(MAGICKCORE_OPENMP_SUPPORT)
68 omp_set_lock(&translation_unit_mutex);
69 #elif defined(MAGICKCORE_THREAD_SUPPORT)
74 status=pthread_mutex_lock(&translation_unit_mutex);
78 ThrowFatalException(ResourceLimitFatalError,
"UnableToLockSemaphore");
81 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
82 while (InterlockedCompareExchange(&translation_unit_mutex,1L,0L) != 0)
87 static inline void UnlockMagickMutex(
void)
89 #if defined(MAGICKCORE_OPENMP_SUPPORT)
90 omp_unset_lock(&translation_unit_mutex);
91 #elif defined(MAGICKCORE_THREAD_SUPPORT)
96 status=pthread_mutex_unlock(&translation_unit_mutex);
100 ThrowFatalException(ResourceLimitFatalError,
"UnableToUnlockSemaphore");
103 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
104 InterlockedExchange(&translation_unit_mutex,0L);
108 #if defined(__cplusplus) || defined(c_plusplus)