ultimatepp/uppdev/Malloc/Tests.cpp
cxl 4a1c627474 Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

124 lines
2.7 KiB
C++

#include "Malloc.h"
#define LLOG(x) // LOG(x)
Heap heaps[4];
void *bptr[16384];
size_t bsz[16384];
size_t total_size;
void HeapSet(byte *ptr, int sz)
{
if(!ptr) return;
// Allocator specific!
size_t l = (uintptr_t)ptr & ~4095;
size_t qp = (uintptr_t)ptr;
int q = 0; // (uintptr_t)ptr % 257;
while(sz--)
*ptr++ = (byte)q++;
}
void HeapCheck(byte *ptr, int sz)
{
DUMP((void *)ptr);
if(!ptr) return;
int q = 0; // (uintptr_t)ptr % 257;
while(sz--)
ASSERT(*ptr++ == (byte)q++);
}
int Hrnd() {
// return 0;
return rand() & 3;
}
int Szrnd()
{
// return 600 + (rand() & 8191);
// return 600 + rand();
// return rand() & 511;
return total_size > 1000 * 1000 * 500 ? rand() & 255
: rand() & 3 ? rand() & 511
: rand() & 3 ? rand() & 8191
: rand() + rand() + rand();
}
void CheckHeaps()
{
RTIMING("CheckHeaps");
for(int i = 0; i < 16384; i++)
HeapCheck((byte *)bptr[i], bsz[i]);
for(int i = 0; i < 4; i++)
heaps[i].Check();
}
extern int s4kb__;
extern int s64kb__;
extern int sBig__;
void Test1()
{
RTIMING("Test1");
bool prudent = false;
SetVppLogSizeLimit(200 * 1000 * 1000);
int doalloc = 20000;
for(int i = 0; i < 4; i++)
heaps[i].Init();
// for(;;)
for(int n = 0; n < 1000*1000*1000; n++) {
LLOG("Step " << n);
if(n % 10000 == 0) {
Cout() << n << (doalloc > 16384 ? " allocating" : " freeing")
<< "(" << s4kb__ << ':' << s64kb__ << ':' << sBig__ << ") ["
<< total_size << "]\n";
CheckHeaps();
}
// if(n == 114677)
// LOG("BP");
int i = n & 16383;
LLOG("FREE " << (void *)bptr[i]);
heaps[Hrnd()].Free(bptr[i]);
bptr[i] = NULL;
if(prudent)
CheckHeaps();
total_size -= bsz[i];
if(doalloc > 16384) {
bsz[i] = Szrnd();
bptr[i] = heaps[Hrnd()].Alloc(bsz[i]);
LLOG("ALLOCATED " << (void *)bptr[i] << " of size " << bsz[i]);
HeapSet((byte *)bptr[i], bsz[i]);
}
else
doalloc++;
if(prudent)
CheckHeaps();
total_size += bsz[i];
if(rand() == 0)
doalloc = 0;
// if(rand() == 1)
// doalloc = 20000;
if(rand() == 0 && (rand() & 7) == 0) {
Heap& h = heaps[Hrnd()];
h.Shutdown();
memset(&h, 0, sizeof(Heap));
h.Free(h.Alloc(0));
}
if(prudent)
CheckHeaps();
}
LLOG("=== Final Free ==============================================================");
for(int i = 0; i < 16384; i++) {
if(bptr[i] == (void *)0x05bdd858)
LOG("BP");
heaps[0].Free(bptr[i]);
}
LLOG("=== Shutdown ==============================================================");
for(int i = 0; i < 4; i++)
heaps[i].Shutdown();
Heap::AuxFinalCheck();
Cout() << "Passed OK!\n";
}