188800Skbyanc/* $FreeBSD$ */
219192Sphk#include <stdlib.h>
319192Sphk#include <stdio.h>
4219511Sbrucec#include <string.h>
519192Sphk#include <unistd.h>
619192Sphk
719192Sphku_long NBUCKETS		= 2000;
819192Sphku_long NOPS		= 200000;
919192Sphku_long NSIZE		= (16*1024);
1019192Sphk
1119192Sphkchar **foo;
1219192Sphk
1319192Sphkint
1419192Sphkmain(int argc, char **argv)
1519192Sphk{
16219511Sbrucec    u_long i,j,k;
1719192Sphk
1819192Sphk    if (argc > 1) NOPS     = strtoul(argv[1],0,0);
1919192Sphk    if (argc > 2) NBUCKETS = strtoul(argv[2],0,0);
2019192Sphk    if (argc > 3) NSIZE	   = strtoul(argv[3],0,0);
21219511Sbrucec    printf("BRK(0)=%p ", sbrk(0));
22219511Sbrucec    foo = malloc(sizeof(*foo) * NBUCKETS);
23219511Sbrucec    memset(foo, 0, sizeof(*foo) * NBUCKETS);
2488800Skbyanc    for (i = 1; i <= 4096; i *= 2) {
25219511Sbrucec        for (j = 0; j < 40960/i && j < NBUCKETS; j++) {
2619192Sphk	    foo[j] = malloc(i);
2719192Sphk        }
28219511Sbrucec        for (j = 0; j < 40960/i && j < NBUCKETS; j++) {
2919192Sphk	    free(foo[j]);
30219511Sbrucec	    foo[j] = NULL;
3119192Sphk        }
3219192Sphk    }
3319192Sphk
34219511Sbrucec    for (i = 0; i < NOPS; i++) {
3519192Sphk	j = random() % NBUCKETS;
3688800Skbyanc	k = random() % NSIZE;
3719192Sphk	foo[j] = realloc(foo[j], k & 1 ? 0 : k);
3888800Skbyanc	if (k & 1 || k == 0) {
3988800Skbyanc		/*
4088800Skbyanc		 * Workaround because realloc return bogus pointer rather than
4188800Skbyanc		 * NULL if passed zero length.
4288800Skbyanc		 */
43219511Sbrucec		foo[j] = NULL;
4488800Skbyanc	}
4519192Sphk	if (foo[j])
4619192Sphk	    foo[j][0] = 1;
4719192Sphk    }
48219511Sbrucec    printf("BRK(1)=%p ", sbrk(0));
49219511Sbrucec    for (j = 0; j < NBUCKETS; j++) {
5019192Sphk	if (foo[j]) {
5119192Sphk	    free(foo[j]);
52219511Sbrucec	    foo[j] = NULL;
5319192Sphk	}
5419192Sphk    }
55219511Sbrucec    printf("BRK(2)=%p NOPS=%lu NBUCKETS=%lu NSIZE=%lu\n",
56219511Sbrucec	sbrk(0), NOPS, NBUCKETS, NSIZE);
5719192Sphk    return 0;
5819192Sphk}
59