static void *AcquireSemaphoreMemory(const size_t count,const size_t quantum)
{
+#define AlignedExtent(size,alignment) \
+ (((size)+((alignment)-1)) & ~((alignment)-1))
+
size_t
alignment,
extent,
}
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
DeleteCriticalSection(&(*semaphore_info)->mutex);
#endif
(*semaphore_info)->signature=(~MagickSignature);
- *semaphore_info=RelinquishSemaphoreMemory(*semaphore_info);
+ *semaphore_info=(SemaphoreInfo *) RelinquishSemaphoreMemory(*semaphore_info);
UnlockMagickMutex();
}
\f