diff options
author | Matthew Breindel <falcon@lindenlab.com> | 2010-06-26 12:35:05 -0700 |
---|---|---|
committer | Matthew Breindel <falcon@lindenlab.com> | 2010-06-26 12:35:05 -0700 |
commit | 6f2bd694d9a21174648b4e4f76d6d078aa88265f (patch) | |
tree | 1ba898756969e97bbe1ffc16c9b28f7ef2fbac61 /indra/llcommon | |
parent | a043cfbe463e94a5c6e6f0e31e22912b025890c7 (diff) |
Fixed mac build (given LL_MESH_ENABLED set to 0).
Diffstat (limited to 'indra/llcommon')
-rw-r--r-- | indra/llcommon/llmemory.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 1c8c91f57e..35935efa88 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -34,6 +34,22 @@ #include <stdlib.h> +// A not necessarily efficient, but general, aligned malloc http://stackoverflow.com/questions/196329/osx-lacks-memalign +inline void* ll_aligned_malloc( size_t size, int align ) +{ + void* mem = malloc( size + (align - 1) + sizeof(void*) ); + char* aligned = ((char*)mem) + sizeof(void*); + aligned += align - ((uintptr_t)aligned & (align - 1)); + + ((void**)aligned)[-1] = mem; + return aligned; +} + +inline void ll_aligned_free( void* ptr ) +{ + free( ((void**)ptr)[-1] ); +} + inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16(). { #if defined(LL_WINDOWS) @@ -65,7 +81,7 @@ inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed wi #if defined(LL_WINDOWS) return _mm_malloc(size, 32); #elif defined(LL_DARWIN) -# error implement me. + return ll_aligned_malloc( size, 32 ); #else void *rtn; if (LL_LIKELY(0 == posix_memalign(&rtn, 32, size))) @@ -80,7 +96,7 @@ inline void ll_aligned_free_32(void *p) #if defined(LL_WINDOWS) _mm_free(p); #elif defined(LL_DARWIN) -# error implement me. + ll_aligned_free( p ); #else free(p); // posix_memalign() is compatible with heap deallocator #endif |