| 181 | } |
| 182 | |
| 183 | void* PxSampleAllocator::allocate(size_t size, const char* typeName, const char* filename, int line) |
| 184 | { |
| 185 | if(!size) |
| 186 | return NULL; |
| 187 | |
| 188 | #if PX_DEBUG || PX_PROFILE |
| 189 | Ps::MutexT<Ps::RawAllocator>::ScopedLock lock(mMutex); |
| 190 | |
| 191 | // Allocate one debug block in front of each real allocation |
| 192 | const size_t neededSize = size + sizeof(DebugBlock); |
| 193 | void* ptr = platformAlignedAlloc(neededSize); |
| 194 | |
| 195 | if (NULL != ptr) |
| 196 | { |
| 197 | // Fill debug block |
| 198 | DebugBlock* DB = (DebugBlock*)ptr; |
| 199 | DB->mCheckValue = DEBUG_IDENTIFIER; |
| 200 | DB->mSize = PxU32(size); |
| 201 | DB->mLine = line; |
| 202 | DB->mSlotIndex = INVALID_ID; |
| 203 | DB->mFilename = filename; |
| 204 | DB->mHandle = typeName ? typeName : ""; |
| 205 | |
| 206 | // Update global stats |
| 207 | mTotalNbAllocs++; |
| 208 | mNbAllocs++; |
| 209 | mNbAllocatedBytes += PxU32(size); |
| 210 | if(mNbAllocatedBytes>mHighWaterMark) |
| 211 | mHighWaterMark = mNbAllocatedBytes; |
| 212 | |
| 213 | // Insert the allocated block in the debug memory block list |
| 214 | if(mMemBlockList) |
| 215 | { |
| 216 | if(mFirstFree!=INVALID_ID) |
| 217 | { |
| 218 | // Recycle old location |
| 219 | PxU32 NextFree = (PxU32)(size_t)(mMemBlockList[mFirstFree]); |
| 220 | if(NextFree!=INVALID_ID) |
| 221 | NextFree>>=1; |
| 222 | |
| 223 | mMemBlockList[mFirstFree] = ptr; |
| 224 | DB->mSlotIndex = mFirstFree; |
| 225 | |
| 226 | mFirstFree = NextFree; |
| 227 | } |
| 228 | else |
| 229 | { |
| 230 | if(mMemBlockUsed==mMemBlockListSize) |
| 231 | { |
| 232 | // Allocate a bigger block |
| 233 | void** tps = (void**)::malloc((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); |
| 234 | // Copy already used part |
| 235 | memcpy(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); |
| 236 | // Initialize remaining part |
| 237 | void* Next = tps + mMemBlockListSize; |
| 238 | memset(Next, 0, MEMBLOCKSTART*sizeof(void*)); |
| 239 | |
| 240 | // Free previous memory, setup new pointer |
nothing calls this directly
no test coverage detected