HARNESS_EXPORT int main(int argc, char* argv[]) { argC=argc; argV=argv; MaxThread = MinThread = 1; Tmalloc=scalable_malloc; Trealloc=scalable_realloc; Tcalloc=scalable_calloc; Tfree=scalable_free; Rposix_memalign=scalable_posix_memalign; Raligned_malloc=scalable_aligned_malloc; Raligned_realloc=scalable_aligned_realloc; Taligned_free=scalable_aligned_free; // check if we were called to test standard behavior for (int i=1; i< argc; i++) { if (strcmp((char*)*(argv+i),"-s")==0) { setSystemAllocs(); argC--; break; } } ParseCommandLine( argC, argV ); #if __linux__ /* According to man pthreads "NPTL threads do not share resource limits (fixed in kernel 2.6.10)". Use per-threads limits for affected systems. */ if ( LinuxKernelVersion() < 2*1000000 + 6*1000 + 10) perProcessLimits = false; #endif //------------------------------------- #if __APPLE__ /* Skip due to lack of memory limit enforcing under OS X*. */ #else limitMem(200); ReallocParam(); limitMem(0); #endif //for linux and dynamic runtime errno is used to check allocator functions //check if library compiled with /MD(d) and we can use errno #if _MSC_VER #if defined(_MT) && defined(_DLL) //check errno if test itself compiled with /MD(d) only char* version_info_block = NULL; int version_info_block_size; LPVOID comments_block = NULL; UINT comments_block_size; #ifdef _DEBUG #define __TBBMALLOCDLL "tbbmalloc_debug.dll" #else //_DEBUG #define __TBBMALLOCDLL "tbbmalloc.dll" #endif //_DEBUG version_info_block_size = GetFileVersionInfoSize( __TBBMALLOCDLL, (LPDWORD)&version_info_block_size ); if( version_info_block_size && ((version_info_block = (char*)malloc(version_info_block_size)) != NULL) && GetFileVersionInfo( __TBBMALLOCDLL, NULL, version_info_block_size, version_info_block ) && VerQueryValue( version_info_block, "\\StringFileInfo\\000004b0\\Comments", &comments_block, &comments_block_size ) && strstr( (char*)comments_block, "/MD" ) ){ __tbb_test_errno = true; } if( version_info_block ) free( version_info_block ); #endif // defined(_MT) && defined(_DLL) #else // _MSC_VER __tbb_test_errno = true; #endif // _MSC_VER for( int p=MaxThread; p>=MinThread; --p ) { REMARK("testing with %d threads\n", p ); Harness::SpinBarrier *barrier = new Harness::SpinBarrier(p); NativeParallelFor( p, RoundRobin(p, barrier, Verbose) ); delete barrier; } if( !error_occurred ) REPORT("done\n"); return 0; }
HARNESS_EXPORT int main(int argc, char* argv[]) { argC=argc; argV=argv; MaxThread = MinThread = 1; Rmalloc=scalable_malloc; Rrealloc=scalable_realloc; Rcalloc=scalable_calloc; Tfree=scalable_free; Rposix_memalign=scalable_posix_memalign; Raligned_malloc=scalable_aligned_malloc; Raligned_realloc=scalable_aligned_realloc; Taligned_free=scalable_aligned_free; // check if we were called to test standard behavior for (int i=1; i< argc; i++) { if (strcmp((char*)*(argv+i),"-s")==0) { #if __INTEL_COMPILER == 1400 && __linux__ // Workaround for Intel(R) C++ Compiler XE, version 14.0.0.080: // unable to call setSystemAllocs() in such configuration. REPORT("Known issue: Standard allocator testing is not supported.\n"); REPORT( "skip\n" ); return 0; #else setSystemAllocs(); argC--; break; #endif } } ParseCommandLine( argC, argV ); #if __linux__ /* According to man pthreads "NPTL threads do not share resource limits (fixed in kernel 2.6.10)". Use per-threads limits for affected systems. */ if ( LinuxKernelVersion() < 2*1000000 + 6*1000 + 10) perProcessLimits = false; #endif //------------------------------------- #if __APPLE__ /* Skip due to lack of memory limit enforcing under macOS. */ #else limitMem(200); ReallocParam(); limitMem(0); #endif //for linux and dynamic runtime errno is used to check allocator functions //check if library compiled with /MD(d) and we can use errno #if _MSC_VER #if defined(_MT) && defined(_DLL) //check errno if test itself compiled with /MD(d) only char* version_info_block = NULL; int version_info_block_size; LPVOID comments_block = NULL; UINT comments_block_size; #ifdef _DEBUG #define __TBBMALLOCDLL "tbbmalloc_debug.dll" #else //_DEBUG #define __TBBMALLOCDLL "tbbmalloc.dll" #endif //_DEBUG version_info_block_size = GetFileVersionInfoSize( __TBBMALLOCDLL, (LPDWORD)&version_info_block_size ); if( version_info_block_size && ((version_info_block = (char*)malloc(version_info_block_size)) != NULL) && GetFileVersionInfo( __TBBMALLOCDLL, NULL, version_info_block_size, version_info_block ) && VerQueryValue( version_info_block, "\\StringFileInfo\\000004b0\\Comments", &comments_block, &comments_block_size ) && strstr( (char*)comments_block, "/MD" ) ){ __tbb_test_errno = true; } if( version_info_block ) free( version_info_block ); #endif // defined(_MT) && defined(_DLL) #else // _MSC_VER __tbb_test_errno = true; #endif // _MSC_VER CheckArgumentsOverflow(); CheckReallocLeak(); for( int p=MaxThread; p>=MinThread; --p ) { REMARK("testing with %d threads\n", p ); for (int limit=0; limit<2; limit++) { int ret = scalable_allocation_mode(TBBMALLOC_SET_SOFT_HEAP_LIMIT, 16*1024*limit); ASSERT(ret==TBBMALLOC_OK, NULL); Harness::SpinBarrier *barrier = new Harness::SpinBarrier(p); NativeParallelFor( p, RoundRobin(p, barrier, Verbose) ); delete barrier; } } int ret = scalable_allocation_mode(TBBMALLOC_SET_SOFT_HEAP_LIMIT, 0); ASSERT(ret==TBBMALLOC_OK, NULL); if( !error_occurred ) REPORT("done\n"); return 0; }