void _tgf_win_free(void * memblock) { if (!memblock) { return; } #ifdef _DEBUG char * p = (char*)memblock - 2*sizeof(int); if (!_CrtIsValidPointer(p, sizeof(int), TRUE)) { assert(0); } if (!_CrtIsValidPointer(p, *(int*)p, TRUE)) { assert( 0 ); } if (*((int*)p + 1) != 123456789) { assert( 0 ); } if(*((int*)(p + *(int*)p ) - 1) != 987654321) { assert( 0 ); } GlobalFree((char*)memblock - 2*sizeof(int)); #else // _DEBUG GlobalFree((char*)memblock - sizeof(int)); #endif // _DEBUG }
void* System::alignedMalloc(size_t bytes, size_t alignment) { alwaysAssertM(isPow2(alignment), "alignment must be a power of 2"); // We must align to at least a word boundary. alignment = iMax((int)alignment, sizeof(void *)); // Pad the allocation size with the alignment size and the // size of the redirect pointer. size_t totalBytes = bytes + alignment + sizeof(intptr_t); void* truePtr = System::malloc(totalBytes); if (!truePtr) { // malloc returned NULL return NULL; } debugAssert(isValidHeapPointer(truePtr)); #ifdef G3D_WIN32 // The blocks we return will not be valid Win32 debug heap // pointers because they are offset // debugAssert(_CrtIsValidPointer(truePtr, totalBytes, TRUE) ); #endif // The return pointer will be the next aligned location (we must at least // leave space for the redirect pointer, however). char* alignedPtr = ((char*)truePtr)+ sizeof(intptr_t); #if 0 // 2^n - 1 has the form 1111... in binary. uint32 bitMask = (alignment - 1); // Advance forward until we reach an aligned location. while ((((intptr_t)alignedPtr) & bitMask) != 0) { alignedPtr += sizeof(void*); } #else alignedPtr += alignment - (((intptr_t)alignedPtr) & (alignment - 1)); // assert((alignedPtr - truePtr) + bytes <= totalBytes); #endif debugAssert((alignedPtr - truePtr) + bytes <= totalBytes); // Immediately before the aligned location, write the true array location // so that we can free it correctly. intptr_t* redirectPtr = (intptr_t*)(alignedPtr - sizeof(intptr_t)); redirectPtr[0] = (intptr_t)truePtr; debugAssert(isValidHeapPointer(truePtr)); #ifdef G3D_WIN32 debugAssert( _CrtIsValidPointer(alignedPtr, bytes, TRUE) ); #endif return (void*)alignedPtr; }
bool IsValidAddress(const void *p, UINT nBytes, BOOL bReadWrite) { return _CrtIsValidPointer(p, nBytes, bReadWrite) == TRUE; }