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 if (translation_unit_initialized == MagickFalse)
69 InitializeMagickMutex();
70 omp_set_lock(&translation_unit_mutex);
71 #elif defined(MAGICKCORE_THREAD_SUPPORT)
76 status=pthread_mutex_lock(&translation_unit_mutex);
80 ThrowFatalException(ResourceLimitFatalError,
"UnableToLockSemaphore");
83 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
84 while (InterlockedCompareExchange(&translation_unit_mutex,1L,0L) != 0)
89 static inline void UnlockMagickMutex(
void)
91 #if defined(MAGICKCORE_OPENMP_SUPPORT)
92 if (translation_unit_initialized == MagickFalse)
93 InitializeMagickMutex();
94 omp_unset_lock(&translation_unit_mutex);
95 #elif defined(MAGICKCORE_THREAD_SUPPORT)
100 status=pthread_mutex_unlock(&translation_unit_mutex);
104 ThrowFatalException(ResourceLimitFatalError,
"UnableToUnlockSemaphore");
107 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
108 InterlockedExchange(&translation_unit_mutex,0L);
112 #if defined(__cplusplus) || defined(c_plusplus)