This source file includes following definitions.
- DestroyMagickMutex
- InitializeMagickMutex
- LockMagickMutex
- UnlockMagickMutex
#ifndef _MAGICKCORE_SEMAPHORE_PRIVATE_H
#define _MAGICKCORE_SEMAPHORE_PRIVATE_H
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
#if defined(MAGICKCORE_OPENMP_SUPPORT)
static omp_lock_t
semaphore_mutex;
#elif defined(MAGICKCORE_THREAD_SUPPORT)
static pthread_mutex_t
semaphore_mutex = PTHREAD_MUTEX_INITIALIZER;
#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
static LONG
semaphore_mutex = 0;
#else
static ssize_t
semaphore_mutex = 0;
#endif
static MagickBooleanType
active_mutex = MagickFalse;
static inline void DestroyMagickMutex(void)
{
#if defined(MAGICKCORE_OPENMP_SUPPORT)
if (active_mutex != MagickFalse)
omp_destroy_lock(&semaphore_mutex);
#endif
active_mutex=MagickFalse;
}
static inline void InitializeMagickMutex(void)
{
#if defined(MAGICKCORE_OPENMP_SUPPORT)
if (active_mutex == MagickFalse)
omp_init_lock(&semaphore_mutex);
#endif
active_mutex=MagickTrue;
}
static inline void LockMagickMutex(void)
{
#if defined(MAGICKCORE_OPENMP_SUPPORT)
omp_set_lock(&semaphore_mutex);
#elif defined(MAGICKCORE_THREAD_SUPPORT)
{
int
status;
status=pthread_mutex_lock(&semaphore_mutex);
if (status != 0)
{
errno=status;
ThrowFatalException(ResourceLimitFatalError,"UnableToLockSemaphore");
}
}
#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
while (InterlockedCompareExchange(&semaphore_mutex,1L,0L) != 0)
Sleep(10);
#endif
}
static inline void UnlockMagickMutex(void)
{
#if defined(MAGICKCORE_OPENMP_SUPPORT)
omp_unset_lock(&semaphore_mutex);
#elif defined(MAGICKCORE_THREAD_SUPPORT)
{
int
status;
status=pthread_mutex_unlock(&semaphore_mutex);
if (status != 0)
{
errno=status;
ThrowFatalException(ResourceLimitFatalError,"UnableToUnlockSemaphore");
}
}
#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
InterlockedExchange(&semaphore_mutex,0L);
#endif
}
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
#endif