/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % L o c k S e m a p h o r e I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % LockSemaphoreInfo() locks a semaphore. % % The format of the LockSemaphoreInfo method is: % % void LockSemaphoreInfo(SemaphoreInfo *semaphore_info) % % A description of each parameter follows: % % o semaphore_info: Specifies a pointer to an SemaphoreInfo structure. % */ MagickExport void LockSemaphoreInfo(SemaphoreInfo *semaphore_info) { assert(semaphore_info != (SemaphoreInfo *) NULL); assert(semaphore_info->signature == MagickSignature); #if defined(MAGICKCORE_THREAD_SUPPORT) { int status; status=pthread_mutex_lock(&semaphore_info->mutex); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError,"UnableToLockSemaphore"); } } #elif defined(MAGICKCORE_HAVE_WINTHREADS) EnterCriticalSection(&semaphore_info->mutex); #endif #if defined(MAGICKCORE_DEBUG) if ((semaphore_info->reference_count > 0) && (IsMagickThreadEqual(semaphore_info->id) != MagickFalse)) { (void) FormatLocaleFile(stderr,"Warning: unexpected recursive lock!\n"); (void) fflush(stderr); } #endif semaphore_info->id=GetMagickThreadId(); semaphore_info->reference_count++; }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % A l l o c a t e S e m a p h o r e I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AllocateSemaphoreInfo() initializes the SemaphoreInfo structure. % % The format of the AllocateSemaphoreInfo method is: % % SemaphoreInfo *AllocateSemaphoreInfo(void) % */ MagickExport SemaphoreInfo *AllocateSemaphoreInfo(void) { SemaphoreInfo *semaphore_info; /* Allocate semaphore. */ semaphore_info=(SemaphoreInfo *) AcquireAlignedMemory(1, sizeof(SemaphoreInfo)); if (semaphore_info == (SemaphoreInfo *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); (void) ResetMagickMemory(semaphore_info,0,sizeof(SemaphoreInfo)); /* Initialize the semaphore. */ #if defined(MAGICKCORE_HAVE_PTHREAD) { int status; pthread_mutexattr_t mutex_info; status=pthread_mutexattr_init(&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } status=pthread_mutex_init(&semaphore_info->mutex,&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } status=pthread_mutexattr_destroy(&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } } #elif defined(MAGICKCORE_HAVE_WINTHREADS) InitializeCriticalSection(&semaphore_info->mutex); #endif semaphore_info->id=GetMagickThreadId(); semaphore_info->reference_count=0; semaphore_info->signature=MagickSignature; return(semaphore_info); }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % L o c k S e m a p h o r e I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % LockSemaphoreInfo() locks a semaphore. % % The format of the LockSemaphoreInfo method is: % % MagickBooleanType LockSemaphoreInfo(SemaphoreInfo *semaphore_info) % % A description of each parameter follows: % % o semaphore_info: Specifies a pointer to an SemaphoreInfo structure. % */ MagickExport MagickBooleanType LockSemaphoreInfo(SemaphoreInfo *semaphore_info) { assert(semaphore_info != (SemaphoreInfo *) NULL); assert(semaphore_info->signature == MagickSignature); #if defined(MAGICKCORE_HAVE_PTHREAD) { int status; status=pthread_mutex_lock(&semaphore_info->mutex); if (status != 0) return(MagickFalse); #if defined(MAGICKCORE_DEBUG) { if ((semaphore_info->reference_count > 0) && (IsMagickThreadEqual(semaphore_info->id) != MagickFalse)) { (void) fprintf(stderr,"Warning: unexpected recursive lock!\n"); (void) fflush(stderr); } } #endif } #elif defined(MAGICKORE_HAVE_WINTHREADS) { EnterCriticalSection(&semaphore_info->mutex); #if defined(MAGICKCORE_DEBUG) { if ((semaphore_info->reference_count > 0) && (IsMagickThreadEqual(semaphore_info->id) != MagickFalse)) { (void) fprintf(stderr,"Warning: unexpected recursive lock!\n"); (void) fflush(stderr); } } #endif } #endif semaphore_info->id=GetMagickThreadId(); semaphore_info->reference_count++; return(MagickTrue); }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % A l l o c a t e S e m a p h o r e I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AllocateSemaphoreInfo() initializes the SemaphoreInfo structure. % % The format of the AllocateSemaphoreInfo method is: % % SemaphoreInfo *AllocateSemaphoreInfo(void) % */ MagickExport SemaphoreInfo *AllocateSemaphoreInfo(void) { SemaphoreInfo *semaphore_info; /* Allocate semaphore. */ semaphore_info=(SemaphoreInfo *) malloc(sizeof(SemaphoreInfo)); if (semaphore_info == (SemaphoreInfo *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); (void) ResetMagickMemory(semaphore_info,0,sizeof(SemaphoreInfo)); /* Initialize the semaphore. */ #if defined(MAGICKCORE_THREAD_SUPPORT) { int status; pthread_mutexattr_t mutex_info; status=pthread_mutexattr_init(&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } #if defined(MAGICKCORE_DEBUG) #if defined(PTHREAD_MUTEX_ERRORCHECK) status=pthread_mutex_settype(&mutex_info,PTHREAD_MUTEX_ERRORCHECK); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } #endif #endif status=pthread_mutex_init(&semaphore_info->mutex,&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } status=pthread_mutexattr_destroy(&mutex_info); if (status != 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } } #elif defined(MAGICKCORE_HAVE_WINTHREADS) { int status; status=InitializeCriticalSectionAndSpinCount(&semaphore_info->mutex,0x0400); if (status == 0) { errno=status; ThrowFatalException(ResourceLimitFatalError, "UnableToInitializeSemaphore"); } } #endif semaphore_info->id=GetMagickThreadId(); semaphore_info->reference_count=0; semaphore_info->signature=MagickSignature; return(semaphore_info); }