btAlignedAllocator.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "btAlignedAllocator.h"
00017
00018 int gNumAlignedAllocs = 0;
00019 int gNumAlignedFree = 0;
00020 int gTotalBytesAlignedAllocs = 0;
00021
00022 static void *btAllocDefault(size_t size)
00023 {
00024 return malloc(size);
00025 }
00026
00027 static void btFreeDefault(void *ptr)
00028 {
00029 free(ptr);
00030 }
00031
00032 static btAllocFunc *sAllocFunc = btAllocDefault;
00033 static btFreeFunc *sFreeFunc = btFreeDefault;
00034
00035
00036
00037 #if defined (BT_HAS_ALIGNED_ALLOCATOR)
00038 #include <malloc.h>
00039 static void *btAlignedAllocDefault(size_t size, int alignment)
00040 {
00041 return _aligned_malloc(size, (size_t)alignment);
00042 }
00043
00044 static void btAlignedFreeDefault(void *ptr)
00045 {
00046 _aligned_free(ptr);
00047 }
00048 #elif defined(__CELLOS_LV2__)
00049 #include <stdlib.h>
00050
00051 static inline void *btAlignedAllocDefault(size_t size, int alignment)
00052 {
00053 return memalign(alignment, size);
00054 }
00055
00056 static inline void btAlignedFreeDefault(void *ptr)
00057 {
00058 free(ptr);
00059 }
00060 #else
00061 static inline void *btAlignedAllocDefault(size_t size, int alignment)
00062 {
00063 void *ret;
00064 char *real;
00065 unsigned long offset;
00066
00067 real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1));
00068 if (real) {
00069 offset = (alignment - (unsigned long)(real + sizeof(void *))) & (alignment-1);
00070 ret = (void *)((real + sizeof(void *)) + offset);
00071 *((void **)(ret)-1) = (void *)(real);
00072 } else {
00073 ret = (void *)(real);
00074 }
00075 return (ret);
00076 }
00077
00078 static inline void btAlignedFreeDefault(void *ptr)
00079 {
00080 void* real;
00081
00082 if (ptr) {
00083 real = *((void **)(ptr)-1);
00084 sFreeFunc(real);
00085 }
00086 }
00087 #endif
00088
00089
00090 static btAlignedAllocFunc *sAlignedAllocFunc = btAlignedAllocDefault;
00091 static btAlignedFreeFunc *sAlignedFreeFunc = btAlignedFreeDefault;
00092
00093 void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc)
00094 {
00095 sAlignedAllocFunc = allocFunc ? allocFunc : btAlignedAllocDefault;
00096 sAlignedFreeFunc = freeFunc ? freeFunc : btAlignedFreeDefault;
00097 }
00098
00099 void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc)
00100 {
00101 sAllocFunc = allocFunc ? allocFunc : btAllocDefault;
00102 sFreeFunc = freeFunc ? freeFunc : btFreeDefault;
00103 }
00104
00105 #ifdef BT_DEBUG_MEMORY_ALLOCATIONS
00106
00107 #include <stdio.h>
00108
00109 void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filename)
00110 {
00111 void *ret;
00112 char *real;
00113 unsigned long offset;
00114
00115 gTotalBytesAlignedAllocs += size;
00116 gNumAlignedAllocs++;
00117
00118
00119 real = (char *)sAllocFunc(size + 2*sizeof(void *) + (alignment-1));
00120 if (real) {
00121 offset = (alignment - (unsigned long)(real + 2*sizeof(void *))) &
00122 (alignment-1);
00123 ret = (void *)((real + 2*sizeof(void *)) + offset);
00124 *((void **)(ret)-1) = (void *)(real);
00125 *((int*)(ret)-2) = size;
00126
00127 } else {
00128 ret = (void *)(real);
00129 }
00130
00131 printf("allocation#%d at address %x, from %s,line %d, size %d\n",gNumAlignedAllocs,real, filename,line,size);
00132
00133 int* ptr = (int*)ret;
00134 *ptr = 12;
00135 return (ret);
00136 }
00137
00138 void btAlignedFreeInternal (void* ptr,int line,char* filename)
00139 {
00140
00141 void* real;
00142 gNumAlignedFree++;
00143
00144 if (ptr) {
00145 real = *((void **)(ptr)-1);
00146 int size = *((int*)(ptr)-2);
00147 gTotalBytesAlignedAllocs -= size;
00148
00149 printf("free #%d at address %x, from %s,line %d, size %d\n",gNumAlignedFree,real, filename,line,size);
00150
00151 sFreeFunc(real);
00152 } else
00153 {
00154 printf("NULL ptr\n");
00155 }
00156 }
00157
00158 #else //BT_DEBUG_MEMORY_ALLOCATIONS
00159
00160 void* btAlignedAllocInternal (size_t size, int alignment)
00161 {
00162 gNumAlignedAllocs++;
00163 void* ptr;
00164 #if defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
00165 ptr = sAlignedAllocFunc(size, alignment);
00166 #else
00167 char *real;
00168 unsigned long offset;
00169
00170 real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1));
00171 if (real) {
00172 offset = (alignment - (unsigned long)(real + sizeof(void *))) & (alignment-1);
00173 ptr = (void *)((real + sizeof(void *)) + offset);
00174 *((void **)(ptr)-1) = (void *)(real);
00175 } else {
00176 ptr = (void *)(real);
00177 }
00178 #endif // defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
00179
00180 return ptr;
00181 }
00182
00183 void btAlignedFreeInternal (void* ptr)
00184 {
00185 if (!ptr)
00186 {
00187 return;
00188 }
00189
00190 gNumAlignedFree++;
00191
00192 #if defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
00193 sAlignedFreeFunc(ptr);
00194 #else
00195 void* real;
00196
00197 if (ptr) {
00198 real = *((void **)(ptr)-1);
00199 sFreeFunc(real);
00200 }
00201 #endif // defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
00202 }
00203
00204 #endif //BT_DEBUG_MEMORY_ALLOCATIONS
00205