static double runtest() { unsigned int seed=1; int n, i; double opspersec=0; THREADVAR threads[THREADS]; for(n=0; n<THREADS; n++) { unsigned int *toallocptr; int m; threadstuff[n].ops=0; times[n]=0; threadstuff[n].toalloc=toallocptr=calloc(RECORDS, sizeof(unsigned int)); threadstuff[n].allocs=calloc(RECORDS, sizeof(void *)); for(m=0; m<RECORDS; m++) { unsigned int size=myrandom(&seed); if(size<(1<<30)) { /* Make it two power multiple of less than 512 bytes to model frequent C++ new's */ size=4<<(size & 7); } else { size&=0x3FFF; /* < 16Kb */ /*size&=0x1FFF;*/ /* < 8Kb */ /*size=(1<<6)<<(size & 7);*/ /* < 8Kb */ } *toallocptr++=size; } } #ifdef TORTURETEST for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(i=0; i<32; i++) { int found=-1; do { for(n=0; n<THREADS; n++) { THREADSLEEP(100); if(threadstuff[n].done) { found=n; break; } } } while(found<0); THREADWAIT(threads[found]); threads[found]=0; THREADINIT(&threads[found], found); printf("Relaunched thread %d\n", found); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #else #if 1 for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #else /* Quick realloc() test */ doRealloc=1; for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #endif #endif { usCount totaltime=0; int totalops=0; for(n=0; n<THREADS; n++) { totaltime+=times[n]; totalops+=threadstuff[n].ops; } opspersec=1000000000000.0*totalops/totaltime*THREADS; printf("This allocator achieves %lfops/sec under %d threads\n", opspersec, THREADS); } for(n=THREADS-1; n>=0; n--) { free(threadstuff[n].allocs); threadstuff[n].allocs=0; free(threadstuff[n].toalloc); threadstuff[n].toalloc=0; } return opspersec; }
static double runtest() { unsigned int seed=1; int n, i; double opspersec=0; THREADVAR threads[THREADS]; for(n=0; n<THREADS; n++) { unsigned int *toallocptr; int m; memset(&threadstuff[n].ops, 0, sizeof(threadstuff[n].ops)); times[n]=0; threadstuff[n].toalloc=toallocptr=calloc(RECORDS, sizeof(unsigned int)); threadstuff[n].allocs=calloc(RECORDS, sizeof(void *)); for(m=0; m<RECORDS; m++) { unsigned int size=myrandom(&seed); #if TESTCPLUSPLUS if(size&(1<<31)) { /* Make it two power multiple of less than 512 bytes to model frequent C++ new's */ size=4<<(size & 7); } else #endif { size&=BLOCKSIZE-1; } *toallocptr++=size; } } #if 2==TESTTYPE for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(i=0; i<8; i++) { int found=-1; do { for(n=0; n<THREADS; n++) { THREADSLEEP(100); if(threadstuff[n].done) { found=n; break; } } } while(found<0); THREADWAIT(threads[found]); threads[found]=0; #if DEBUG { usCount totaltime=0; int totalops=0, totalmallocs=0, totalreallocs=0; for(n=0; n<THREADS; n++) { totaltime+=times[n]; totalmallocs+=threadstuff[n].ops.mallocs; totalreallocs+=threadstuff[n].ops.reallocs; totalops+=threadstuff[n].ops.mallocs+threadstuff[n].ops.reallocs; } opspersec=1000000000000.0*totalops/totaltime*THREADS; printf("This test spent %f%% of its time doing reallocs\n", 100.0*totalreallocs/totalops); printf("This allocator achieves %lfops/sec under %d threads\n\n", opspersec, THREADS); } #endif THREADINIT(&threads[found], found); printf("Relaunched thread %d\n", found); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #else #if 1 for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #else /* Quick realloc() test */ doRealloc=1; for(n=0; n<THREADS; n++) { THREADINIT(&threads[n], n); } for(n=THREADS-1; n>=0; n--) { THREADWAIT(threads[n]); threads[n]=0; } #endif #endif { usCount totaltime=0; int totalops=0, totalmallocs=0, totalreallocs=0; for(n=0; n<THREADS; n++) { totaltime+=times[n]; totalmallocs+=threadstuff[n].ops.mallocs; totalreallocs+=threadstuff[n].ops.reallocs; totalops+=threadstuff[n].ops.mallocs+threadstuff[n].ops.reallocs; } opspersec=1000000000000.0*totalops/totaltime*THREADS; printf("This test spent %f%% of its time doing reallocs\n", 100.0*totalreallocs/totalops); printf("This allocator achieves %lfops/sec under %d threads\n", opspersec, THREADS); } for(n=THREADS-1; n>=0; n--) { free(threadstuff[n].allocs); threadstuff[n].allocs=0; free(threadstuff[n].toalloc); threadstuff[n].toalloc=0; } return opspersec; }