]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/semaphore.c
(no commit message)
[imagemagick] / MagickCore / semaphore.c
index 3b3b4befafaa33f940c394f66ccea16adfae056c..25cfcb260f9652af6b4608b22a112da78869fa40 100644 (file)
@@ -123,18 +123,67 @@ MagickExport void AcquireSemaphoreInfo(SemaphoreInfo **semaphore_info)
 %
 */
 
-static void *AcquireSemaphoreMemory(const size_t size)
+static void *AcquireSemaphoreMemory(const size_t count,const size_t quantum)
 {
+#define AlignedExtent(size,alignment) \
+  (((size)+((alignment)-1)) & ~((alignment)-1))
+
+  size_t
+    alignment,
+    extent,
+    size;
+
+  void
+    *memory;
+
+  size=count*quantum;
+  if ((count == 0) || (quantum != (size/count)))
+    {
+      errno=ENOMEM;
+      return((void *) NULL);
+    }
+  memory=NULL;
+  alignment=CACHE_LINE_SIZE;
+  extent=AlignedExtent(size,alignment);
+  if ((size == 0) || (alignment < sizeof(void *)) || (extent < size))
+    return((void *) NULL);
 #if defined(MAGICKCORE_HAVE_POSIX_MEMALIGN)
+  if (posix_memalign(&memory,alignment,extent) != 0)
+    memory=NULL;
+#elif defined(MAGICKCORE_HAVE__ALIGNED_MALLOC)
+  memory=_aligned_malloc(extent,alignment);
+#else
   {
     void
-      *memory;
+      *p;
 
-    if (posix_memalign(&memory,CACHE_LINE_SIZE,CacheAlign(size)) == 0)
-      return(memory);
+    extent=(size+alignment-1)+sizeof(void *);
+    if (extent > size)
+      {
+        p=malloc(extent);
+        if (p != NULL)
+          {
+            memory=(void *) AlignedExtent((size_t) p+sizeof(void *),alignment);
+            *((void **) memory-1)=p;
+          }
+      }
   }
 #endif
-  return(malloc(CacheAlign(size)));
+  return(memory);
+}
+
+static void *RelinquishSemaphoreMemory(void *memory)
+{
+  if (memory == (void *) NULL)
+    return((void *) NULL);
+#if defined(MAGICKCORE_HAVE_POSIX_MEMALIGN)
+  free(memory);
+#elif defined(MAGICKCORE_HAVE__ALIGNED_MALLOC)
+  _aligned_free(memory);
+#else
+  free(*((void **) memory-1));
+#endif
+  return(NULL);
 }
 
 MagickExport SemaphoreInfo *AllocateSemaphoreInfo(void)
@@ -145,7 +194,7 @@ MagickExport SemaphoreInfo *AllocateSemaphoreInfo(void)
   /*
     Allocate semaphore.
   */
-  semaphore_info=(SemaphoreInfo *) AcquireSemaphoreMemory(
+  semaphore_info=(SemaphoreInfo *) AcquireSemaphoreMemory(1,
     sizeof(*semaphore_info));
   if (semaphore_info == (SemaphoreInfo *) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
@@ -258,8 +307,7 @@ MagickExport void DestroySemaphoreInfo(SemaphoreInfo **semaphore_info)
   DeleteCriticalSection(&(*semaphore_info)->mutex);
 #endif
   (*semaphore_info)->signature=(~MagickSignature);
-  free(*semaphore_info);
-  *semaphore_info=(SemaphoreInfo *) NULL;
+  *semaphore_info=(SemaphoreInfo *) RelinquishSemaphoreMemory(*semaphore_info);
   UnlockMagickMutex();
 }
 \f