int main(void) { size_t i, j; void *p1, *p2; for( i=0; i<=1<<16; ++i) { p1 = scalable_malloc(i); if( !p1 ) printf("Warning: there should be memory but scalable_malloc returned NULL\n"); scalable_free(p1); } p1 = p2 = NULL; for( i=1024*1024; ; i/=2 ) { scalable_free(p1); p1 = scalable_realloc(p2, i); p2 = scalable_calloc(i, 32); if (p2) { if (i<sizeof(size_t)) { for (j=0; j<i; j++) assert(0==*((char*)p2+j)); } else { for (j=0; j<i; j+=sizeof(size_t)) assert(0==*((size_t*)p2+j)); } } scalable_free(p2); p2 = scalable_malloc(i); if (i==0) break; } for( i=1; i<1024*1024; i*=2 ) { scalable_free(p1); p1 = scalable_realloc(p2, i); p2 = scalable_malloc(i); } scalable_free(p1); scalable_free(p2); printf("done\n"); return 0; }
bool TestReallocMsize(size_t startSz) { bool passed = true; char *buf = (char*)scalable_malloc(startSz); ASSERT(buf, ""); size_t realSz = scalable_msize(buf); ASSERT(realSz>=startSz, "scalable_msize must be not less then allocated size"); memset(buf, 'a', realSz-1); buf[realSz-1] = 0; char *buf1 = (char*)scalable_realloc(buf, 2*realSz); ASSERT(buf1, ""); ASSERT(scalable_msize(buf1)>=2*realSz, "scalable_msize must be not less then allocated size"); buf1[2*realSz-1] = 0; if ( strspn(buf1, "a") < realSz-1 ) { REPORT( "Error: data broken for %d Bytes object.\n", startSz); passed = false; } scalable_free(buf1); return passed; }
void* FMallocTBB::Realloc( void* Ptr, SIZE_T NewSize, uint32 Alignment ) { IncrementTotalReallocCalls(); MEM_TIME(MemTime -= FPlatformTime::Seconds()) #if UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT SIZE_T OldSize = 0; if (Ptr) { OldSize = scalable_msize(Ptr); if (NewSize < OldSize) { FMemory::Memset((uint8*)Ptr + NewSize, DEBUG_FILL_FREED, OldSize - NewSize); } } #endif void* NewPtr = NULL; if (Alignment != DEFAULT_ALIGNMENT) { Alignment = FMath::Max(NewSize >= 16 ? (uint32)16 : (uint32)8, Alignment); NewPtr = scalable_aligned_realloc(Ptr, NewSize, Alignment); } else { NewPtr = scalable_realloc(Ptr, NewSize); } #if UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT if (NewPtr && NewSize > OldSize ) { FMemory::Memset((uint8*)NewPtr + OldSize, DEBUG_FILL_NEW, NewSize - OldSize); } #endif if( !NewPtr && NewSize ) { OutOfMemory(NewSize, Alignment); } MEM_TIME(MemTime += FPlatformTime::Seconds()) return NewPtr; }
int main(void) { size_t i, j; int curr_mode, res; void *p1, *p2; atexit( MyExit ); for ( curr_mode = 0; curr_mode<=1; curr_mode++) { assert(ExpectedResultHugePages == scalable_allocation_mode(TBBMALLOC_USE_HUGE_PAGES, !curr_mode)); p1 = scalable_malloc(10*1024*1024); assert(p1); assert(ExpectedResultHugePages == scalable_allocation_mode(TBBMALLOC_USE_HUGE_PAGES, curr_mode)); scalable_free(p1); } /* note that huge pages (if supported) are still enabled at this point */ #if __TBB_SOURCE_DIRECTLY_INCLUDED assert(TBBMALLOC_OK == scalable_allocation_mode(TBBMALLOC_INTERNAL_SOURCE_INCLUDED, 0)); #endif for( i=0; i<=1<<16; ++i) { p1 = scalable_malloc(i); if( !p1 ) printf("Warning: there should be memory but scalable_malloc returned NULL\n"); scalable_free(p1); } p1 = p2 = NULL; for( i=1024*1024; ; i/=2 ) { scalable_free(p1); p1 = scalable_realloc(p2, i); p2 = scalable_calloc(i, 32); if (p2) { if (i<sizeof(size_t)) { for (j=0; j<i; j++) assert(0==*((char*)p2+j)); } else { for (j=0; j<i; j+=sizeof(size_t)) assert(0==*((size_t*)p2+j)); } } scalable_free(p2); p2 = scalable_malloc(i); if (i==0) break; } for( i=1; i<1024*1024; i*=2 ) { scalable_free(p1); p1 = scalable_realloc(p2, i); p2 = scalable_malloc(i); } scalable_free(p1); scalable_free(p2); res = scalable_allocation_command(TBBMALLOC_CLEAN_ALL_BUFFERS, NULL); assert(res == TBBMALLOC_OK); res = scalable_allocation_command(TBBMALLOC_CLEAN_THREAD_BUFFERS, NULL); /* expect all caches cleaned before, so got nothing from CLEAN_THREAD_BUFFERS */ assert(res == TBBMALLOC_NO_EFFECT); /* check that invalid param argument give expected result*/ res = scalable_allocation_command(TBBMALLOC_CLEAN_THREAD_BUFFERS, (void*)(intptr_t)1); assert(res == TBBMALLOC_INVALID_PARAM); __TBB_mallocProcessShutdownNotification(); printf("done\n"); return 0; }