1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdint.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../memcheck.h" 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct cell 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct cell *next; 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int x; 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct pool 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t allocated; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t used; 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown uint8_t *buf; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid * 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownallocate_from_pool(struct pool *p, size_t n) 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *a = p->buf + p->used; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(p->used + n < p->allocated); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_MEMPOOL_ALLOC(p, a, n); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->used += n; 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return a; 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct pool * 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownallocate_pool() 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct pool *p = malloc(sizeof(struct pool)); 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(p); 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->allocated = 4096; 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->used = 0; 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->buf = malloc(p->allocated); 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(p->buf); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(p->buf, 0, p->allocated); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_CREATE_MEMPOOL(p, 0, 0); 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_MAKE_MEM_NOACCESS(p->buf, p->allocated); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N 100 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* flags */ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint static_roots = 0; 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint trim_pool = 0; 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint destroy_pool = 0; 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid set_flags ( int n ) 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (n) { 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 0: 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 0; 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 0; 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 0; 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 0; 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 1; 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 0; 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 0; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 0; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 1; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 3: 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 1; 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 0; 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 0; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 1; 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 1; 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 0; 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 5: 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static_roots = 1; 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown trim_pool = 0; 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown destroy_pool = 1; 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(0); 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct cell *cells_static[N]; 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main( int argc, char** argv ) 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct cell *cells_local[N]; 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int arg; 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t i; 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct pool *p = allocate_pool(); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct cell **cells = static_roots ? cells_static : cells_local; 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(argc == 2); 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(argv[1]); 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(strlen(argv[1]) == 1); 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(argv[1][0] >= '0' && argv[1][0] <= '5'); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg = atoi( argv[1] ); 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown set_flags( arg ); 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(cells_static, 0, sizeof(cells_static)); 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(cells_local, 0, sizeof(cells_local)); 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < N; ++i) { 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cells[i] = allocate_from_pool(p, sizeof(struct cell)); 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (trim_pool) 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_MEMPOOL_TRIM(p, 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->buf+(10 * sizeof(struct cell)), 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 20 * sizeof(struct cell) + 2); 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (destroy_pool) 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_DESTROY_MEMPOOL(p); 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 127