main.c revision 88800
188800Skbyanc/* $FreeBSD: head/tools/test/malloc/main.c 88800 2002-01-02 06:42:34Z kbyanc $ */
219192Sphk#include <stdlib.h>
319192Sphk#include <stdio.h>
419192Sphk#include <unistd.h>
519192Sphk
619192Sphku_long NBUCKETS		= 2000;
719192Sphku_long NOPS		= 200000;
819192Sphku_long NSIZE		= (16*1024);
919192Sphk
1019192Sphkchar **foo;
1119192Sphk
1219192Sphkint
1319192Sphkmain(int argc, char **argv)
1419192Sphk{
1519192Sphk    int i,j,k;
1619192Sphk
1719192Sphk    if (argc > 1) NOPS     = strtoul(argv[1],0,0);
1819192Sphk    if (argc > 2) NBUCKETS = strtoul(argv[2],0,0);
1919192Sphk    if (argc > 3) NSIZE	   = strtoul(argv[3],0,0);
2019192Sphk    printf("BRK(0)=%x ",sbrk(0));
2119192Sphk    foo = malloc (sizeof *foo * NBUCKETS);
2219192Sphk    memset(foo,0,sizeof *foo * NBUCKETS);
2388800Skbyanc    for (i = 1; i <= 4096; i *= 2) {
2419192Sphk        for (j = 0 ; j < 40960/i && j < NBUCKETS; j++) {
2519192Sphk	    foo[j] = malloc(i);
2619192Sphk        }
2719192Sphk        for (j = 0 ; j < 40960/i && j < NBUCKETS; j++) {
2819192Sphk	    free(foo[j]);
2919192Sphk	    foo[j] = 0;
3019192Sphk        }
3119192Sphk    }
3219192Sphk
3319192Sphk    for (i = 0 ; i < NOPS ; i++) {
3419192Sphk	j = random() % NBUCKETS;
3588800Skbyanc	k = random() % NSIZE;
3619192Sphk	foo[j] = realloc(foo[j], k & 1 ? 0 : k);
3788800Skbyanc	if (k & 1 || k == 0) {
3888800Skbyanc		/*
3988800Skbyanc		 * Workaround because realloc return bogus pointer rather than
4088800Skbyanc		 * NULL if passed zero length.
4188800Skbyanc		 */
4288800Skbyanc		foo[j] = 0;
4388800Skbyanc	}
4419192Sphk	if (foo[j])
4519192Sphk	    foo[j][0] = 1;
4619192Sphk    }
4719192Sphk    printf("BRK(1)=%x ",sbrk(0));
4819192Sphk    for (j = 0 ; j < NBUCKETS ; j++) {
4919192Sphk	if (foo[j]) {
5019192Sphk	    free(foo[j]);
5119192Sphk	    foo[j] = 0;
5219192Sphk	}
5319192Sphk    }
5419192Sphk    printf("BRK(2)=%x NOPS=%lu NBUCKETS=%lu NSIZE=%lu\n",
5519192Sphk	sbrk(0),NOPS,NBUCKETS,NSIZE);
5619192Sphk    return 0;
5719192Sphk}
58