From 33fbbaccaba51c27d74e1716b4050ddd41293b73 Mon Sep 17 00:00:00 2001 From: Nicholas Hastings Date: Sun, 28 Oct 2012 12:05:52 -0400 Subject: [PATCH] Changed posix impl of _aligned_malloc to match MemAlloc_Aligned behavior (other than tracking). --- public/tier1/utlmemory.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/public/tier1/utlmemory.h b/public/tier1/utlmemory.h index 0b3c3c35..2f60930c 100644 --- a/public/tier1/utlmemory.h +++ b/public/tier1/utlmemory.h @@ -38,11 +38,22 @@ #endif #if defined(_LINUX) || defined(__APPLE__) -inline void *_aligned_malloc( size_t size, size_t alignment ) +inline void *_aligned_malloc( size_t size, size_t align ) { - void *pTemp; - posix_memalign( &pTemp, alignment, size ); - return pTemp; + unsigned char *pAlloc, *pResult; + + if (!IsPowerOfTwo(uint(align))) + return NULL; + + align = (align > sizeof(void *) ? align : sizeof(void *)) - 1; + + if ( (pAlloc = (unsigned char*)malloc( sizeof(void *) + align + size ) ) == (unsigned char*)NULL) + return NULL; + + pResult = (unsigned char*)( (size_t)(pAlloc + sizeof(void *) + align ) & ~align ); + ((unsigned char**)(pResult))[-1] = pAlloc; + + return (void *)pResult; } #endif