1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/malloc.h" 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> // getopt() 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../config.h" 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int s_quiet = 0; 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(HAVE_MALLINFO) 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic size_t check(size_t min, size_t max) 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct mallinfo mi; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t used; 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mi = mallinfo(); 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (! s_quiet) 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("arena = %d\n", mi.arena); /* non-mmapped space allocated from system */ 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("ordblks = %d\n", mi.ordblks); /* number of free chunks */ 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("smblks = %d\n", mi.smblks); /* number of fastbin blocks */ 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("hblks = %d\n", mi.hblks); /* number of mmapped regions */ 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("hblkhd = %d\n", mi.hblkhd); /* space in mmapped regions */ 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("usmblks = %d\n", mi.usmblks); /* maximum total allocated space */ 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("fsmblks = %d\n", mi.fsmblks); /* space available in freed fastbin blocks */ 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("uordblks = %d\n", mi.uordblks); /* total allocated space */ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("fordblks = %d\n", mi.fordblks); /* total free space */ 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("keepcost = %d\n", mi.keepcost); /* top-most, releasable (via malloc_trim) space */ 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("(min = %zu, max = %zu)\n", min, max); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n"); 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // size checks 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used = mi.uordblks + mi.hblkhd; 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (used < min) 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (used > max) 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(2); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // used should be reasonably close to min 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // define "reasonably" as within 20% 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (used/5*4 > min) 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(3); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // sanity checks 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((mi.ordblks == 0) != (mi.fordblks == 0)) 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(10); 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((mi.smblks == 0) != (mi.fsmblks == 0)) 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(11); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((mi.hblks == 0) != (mi.hblkhd == 0)) 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(12); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mi.keepcost > mi.fordblks) 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(13); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mi.fsmblks > mi.fordblks) 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(14); 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // arena should be reasonably close to fordblks + uordblks 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mi.arena < mi.fordblks + mi.uordblks) 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(15); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mi.arena/5*4 > mi.fordblks + mi.uordblks) 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(16); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return used; 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic size_t check(size_t min, size_t max) 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (! s_quiet) 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("mallinfo() is not supported on this platform.\n"); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n"); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv) 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* ptr[40]; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t min, max; 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int optchar; 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown while ((optchar = getopt(argc, argv, "q")) != EOF) 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (optchar) 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 'q': 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_quiet = 1; 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Usage: %s [-q].\n", argv[0]); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 1; 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown min = 0; 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 1; i <= 40; i++) 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int size = i * i * 8; 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown min += size; 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptr[i - 1] = malloc(size); 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown }; 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown max = check(min, (size_t)-1); 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 1; i <= 20; i++) 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int size = i * i * 8; 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown min -= size; 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown max -= size; 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(ptr[i - 1]); 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown }; 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown check(min, max); 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for ( ; i <= 40; i++) 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(ptr[i - 1]); 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Success.\n"); 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 134