]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/semaphore.c
(no commit message)
[imagemagick] / MagickCore / semaphore.c
index 755f0c799f373f5f01eb97e7fff89990ef360db7..25cfcb260f9652af6b4608b22a112da78869fa40 100644 (file)
@@ -125,6 +125,9 @@ MagickExport void AcquireSemaphoreInfo(SemaphoreInfo **semaphore_info)
 
 static void *AcquireSemaphoreMemory(const size_t count,const size_t quantum)
 {
+#define AlignedExtent(size,alignment) \
+  (((size)+((alignment)-1)) & ~((alignment)-1))
+
   size_t
     alignment,
     extent,
@@ -141,25 +144,28 @@ static void *AcquireSemaphoreMemory(const size_t count,const size_t quantum)
     }
   memory=NULL;
   alignment=CACHE_LINE_SIZE;
-  extent=(size+alignment-1)+sizeof(void *);
-  if ((size == 0) || (alignment < sizeof(void *)) || (extent <= 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,size) != 0)
+  if (posix_memalign(&memory,alignment,extent) != 0)
     memory=NULL;
 #elif defined(MAGICKCORE_HAVE__ALIGNED_MALLOC)
-  memory=_aligned_malloc(size,alignment);
+  memory=_aligned_malloc(extent,alignment);
 #else
   {
     void
       *p;
 
-    p=malloc(extent);
-    if (p != NULL)
+    extent=(size+alignment-1)+sizeof(void *);
+    if (extent > size)
       {
-        memory=(void *) (((size_t) p+sizeof(void *)+alignment-1) &
-          ~(alignment-1));
-        *((void **) memory-1)=p;
+        p=malloc(extent);
+        if (p != NULL)
+          {
+            memory=(void *) AlignedExtent((size_t) p+sizeof(void *),alignment);
+            *((void **) memory-1)=p;
+          }
       }
   }
 #endif
@@ -301,7 +307,7 @@ MagickExport void DestroySemaphoreInfo(SemaphoreInfo **semaphore_info)
   DeleteCriticalSection(&(*semaphore_info)->mutex);
 #endif
   (*semaphore_info)->signature=(~MagickSignature);
-  *semaphore_info=RelinquishSemaphoreMemory(*semaphore_info);
+  *semaphore_info=(SemaphoreInfo *) RelinquishSemaphoreMemory(*semaphore_info);
   UnlockMagickMutex();
 }
 \f