From bafef09b6e5f3b2eb5a66d1911b1a1a8e62656b0 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Sat, 25 Feb 2012 19:24:59 +0000 Subject: [PATCH] add btAlignPointer template and use it in serializer/allocator this should fix Issue 559 --- src/LinearMath/btAlignedAllocator.cpp | 15 +++++++-------- src/LinearMath/btScalar.h | 17 +++++++++++++++++ src/LinearMath/btSerializer.h | 20 ++------------------ 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/LinearMath/btAlignedAllocator.cpp b/src/LinearMath/btAlignedAllocator.cpp index 189b759d2..c4c0ceb2e 100644 --- a/src/LinearMath/btAlignedAllocator.cpp +++ b/src/LinearMath/btAlignedAllocator.cpp @@ -58,16 +58,18 @@ static inline void btAlignedFreeDefault(void *ptr) free(ptr); } #else + + + + + static inline void *btAlignedAllocDefault(size_t size, int alignment) { void *ret; char *real; - unsigned long offset; - real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1)); if (real) { - offset = (alignment - (unsigned long)(real + sizeof(void *))) & (alignment-1); - ret = (void *)((real + sizeof(void *)) + offset); + ret = btAlignPointer(real + sizeof(void *),alignment); *((void **)(ret)-1) = (void *)(real); } else { ret = (void *)(real); @@ -110,7 +112,6 @@ void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filen { void *ret; char *real; - unsigned long offset; gTotalBytesAlignedAllocs += size; gNumAlignedAllocs++; @@ -118,9 +119,7 @@ void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filen real = (char *)sAllocFunc(size + 2*sizeof(void *) + (alignment-1)); if (real) { - offset = (alignment - (unsigned long)(real + 2*sizeof(void *))) & -(alignment-1); - ret = (void *)((real + 2*sizeof(void *)) + offset); + ret = (void*) btAlignPointer((real + 2*sizeof(void *), alignment); *((void **)(ret)-1) = (void *)(real); *((int*)(ret)-2) = size; diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index f4bc17c9c..a8a4e387a 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -519,4 +519,21 @@ struct btTypedObject return m_objectType; } }; + + +///align a pointer to the provided alignment, upwards +template T* btAlignPointer(T* unalignedPtr, size_t alignment) +{ + union + { + T* ptr; + size_t integer; + }; + const size_t bit_mask = ~(alignment - 1); + ptr = unalignedPtr; + integer += alignment-1; + integer &= bit_mask; + return ptr; +} + #endif //BT_SCALAR_H diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 8a89374c6..37aff8d99 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -246,15 +246,7 @@ protected: while (*cp)cp++; cp++; } - { - nr= (long)cp; - // long mask=3; - nr= ((nr+3)&~3)-nr; - while (nr--) - { - cp++; - } - } + cp = btAlignPointer(cp,4); /* TYPE (4 bytes) @@ -281,15 +273,7 @@ protected: cp++; } - { - nr= (long)cp; - // long mask=3; - nr= ((nr+3)&~3)-nr; - while (nr--) - { - cp++; - } - } + cp = btAlignPointer(cp,4); /*