mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 14:16:09 -06:00
124 lines
2.7 KiB
C++
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";
|
|
}
|