#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long MEMORY = 16000*1000*100; // test memory limit
long ALLOCATED = 0;
long COUNT = 80000; // repeat count
long ACTIVE = 10000; // number of memroy segment
long MAXSIZE = 400000; //
long MINSIZE = 400;
long MIN_UNIT = 1 ;
typedef
struct mem_list {
void *address;
long size;
struct mem_list *next;
} MEM_LIST, *MEM_LIST_PTR;
void
print_mem_list(MEM_LIST_PTR m)
{
MEM_LIST_PTR n;
if (!m) return;
n = m->next;
for(;n&&n!=m;n=n->next) {
if (n->address && ! (((long)n->address) & 0x700000000000))
printf("0x%08lx 0x%08lx\n",(long)n->address,n->size);
}
}
void
die(char *msg)
{
fprintf(stderr,"%s\n",msg);
exit(0);
}
void
option(long ac, char *av[])
{
long i = 1;
while(ac>1) {
if (av[i][0] == '-') {
switch (av[i][1]) {
case 'c': COUNT = atol(av[++i]); break;
case 'a': ACTIVE = atol(av[++i]); break;
case 'u': MIN_UNIT = atol(av[++i]); break;
case 'm': MAXSIZE = atol(av[++i]); break;
case 'l': MINSIZE = atol(av[++i]); break;
case 'M': MEMORY = atol(av[++i]); break;
}
}
ac--; i++;
}
}
int
main(int ac, char *av[])
{
MEM_LIST mlist;
MEM_LIST_PTR last = &mlist;
MEM_LIST_PTR new;
long i,size;
option(ac,av);
mlist.address = NULL;
mlist.size = 0;
for(i=0;i<ACTIVE;i++) {
new = (MEM_LIST_PTR)malloc(sizeof(MEM_LIST));
if (!new) die("malloc error");
new->address = NULL;
new->next = NULL;
last->next = new;
last = new;
}
last->next = &mlist;
for(i=0;i++<COUNT;last=last->next) {
size = ((random()%(MAXSIZE-MINSIZE))+MINSIZE)*MIN_UNIT;
if (last->address) {
ALLOCATED -= last->size;
last->size = 0;
free(last->address);
last->address = 0;
}
if ( ALLOCATED + size > MEMORY) continue;
last->size = size;
last->address = (void *)malloc(size);
memset(last->address, random(), size);
ALLOCATED += size;
if (!last->address) die("malloc error");
}
print_mem_list(&mlist);
return 0;
}