188800Skbyanc/* $FreeBSD: releng/10.3/tools/test/malloc/main.c 219511 2011-03-11 17:33:31Z brucec $ */ 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