1*00b67f09SDavid van Moolenbroek /* $NetBSD: t_mem.c,v 1.5 2014/12/10 04:37:53 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2007, 2009, 2013 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: t_mem.c,v 1.15 2009/01/22 23:47:54 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
25*00b67f09SDavid van Moolenbroek
26*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
27*00b67f09SDavid van Moolenbroek
28*00b67f09SDavid van Moolenbroek /*
29*00b67f09SDavid van Moolenbroek * Adapted from the original mempool_test.c program.
30*00b67f09SDavid van Moolenbroek */
31*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
32*00b67f09SDavid van Moolenbroek
33*00b67f09SDavid van Moolenbroek #define MP1_FREEMAX 10
34*00b67f09SDavid van Moolenbroek #define MP1_FILLCNT 10
35*00b67f09SDavid van Moolenbroek #define MP1_MAXALLOC 30
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek #define MP2_FREEMAX 25
38*00b67f09SDavid van Moolenbroek #define MP2_FILLCNT 25
39*00b67f09SDavid van Moolenbroek
40*00b67f09SDavid van Moolenbroek static int
memtest(void)41*00b67f09SDavid van Moolenbroek memtest(void) {
42*00b67f09SDavid van Moolenbroek int nfails;
43*00b67f09SDavid van Moolenbroek void *items1[50];
44*00b67f09SDavid van Moolenbroek void *items2[50];
45*00b67f09SDavid van Moolenbroek void *tmp;
46*00b67f09SDavid van Moolenbroek isc_mempool_t *mp1, *mp2;
47*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
48*00b67f09SDavid van Moolenbroek unsigned int i, j;
49*00b67f09SDavid van Moolenbroek int rval;
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroek nfails = 0;
53*00b67f09SDavid van Moolenbroek mctx = NULL;
54*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
55*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
56*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
57*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
58*00b67f09SDavid van Moolenbroek ++nfails;
59*00b67f09SDavid van Moolenbroek return(nfails);
60*00b67f09SDavid van Moolenbroek }
61*00b67f09SDavid van Moolenbroek
62*00b67f09SDavid van Moolenbroek mp1 = NULL;
63*00b67f09SDavid van Moolenbroek isc_result = isc_mempool_create(mctx, 24, &mp1);
64*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
65*00b67f09SDavid van Moolenbroek t_info("isc_mempool_create failed %s\n",
66*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
67*00b67f09SDavid van Moolenbroek ++nfails;
68*00b67f09SDavid van Moolenbroek return(nfails);
69*00b67f09SDavid van Moolenbroek }
70*00b67f09SDavid van Moolenbroek
71*00b67f09SDavid van Moolenbroek mp2 = NULL;
72*00b67f09SDavid van Moolenbroek isc_result = isc_mempool_create(mctx, 31, &mp2);
73*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
74*00b67f09SDavid van Moolenbroek t_info("isc_mempool_create failed %s\n",
75*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
76*00b67f09SDavid van Moolenbroek ++nfails;
77*00b67f09SDavid van Moolenbroek return(nfails);
78*00b67f09SDavid van Moolenbroek }
79*00b67f09SDavid van Moolenbroek
80*00b67f09SDavid van Moolenbroek if (T_debug)
81*00b67f09SDavid van Moolenbroek isc_mem_stats(mctx, stderr);
82*00b67f09SDavid van Moolenbroek
83*00b67f09SDavid van Moolenbroek t_info("setting freemax to %d\n", MP1_FREEMAX);
84*00b67f09SDavid van Moolenbroek isc_mempool_setfreemax(mp1, MP1_FREEMAX);
85*00b67f09SDavid van Moolenbroek t_info("setting fillcount to %d\n", MP1_FILLCNT);
86*00b67f09SDavid van Moolenbroek isc_mempool_setfillcount(mp1, MP1_FILLCNT);
87*00b67f09SDavid van Moolenbroek t_info("setting maxalloc to %d\n", MP1_MAXALLOC);
88*00b67f09SDavid van Moolenbroek isc_mempool_setmaxalloc(mp1, MP1_MAXALLOC);
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek /*
91*00b67f09SDavid van Moolenbroek * Allocate MP1_MAXALLOC items from the pool. This is our max.
92*00b67f09SDavid van Moolenbroek */
93*00b67f09SDavid van Moolenbroek for (i = 0; i < MP1_MAXALLOC; i++) {
94*00b67f09SDavid van Moolenbroek items1[i] = isc_mempool_get(mp1);
95*00b67f09SDavid van Moolenbroek if (items1[i] == NULL) {
96*00b67f09SDavid van Moolenbroek t_info("isc_mempool_get unexpectedly failed\n");
97*00b67f09SDavid van Moolenbroek ++nfails;
98*00b67f09SDavid van Moolenbroek }
99*00b67f09SDavid van Moolenbroek }
100*00b67f09SDavid van Moolenbroek
101*00b67f09SDavid van Moolenbroek /*
102*00b67f09SDavid van Moolenbroek * Try to allocate one more. This should fail.
103*00b67f09SDavid van Moolenbroek */
104*00b67f09SDavid van Moolenbroek tmp = isc_mempool_get(mp1);
105*00b67f09SDavid van Moolenbroek if (tmp != NULL) {
106*00b67f09SDavid van Moolenbroek t_info("isc_mempool_get unexpectedly succeeded\n");
107*00b67f09SDavid van Moolenbroek ++nfails;
108*00b67f09SDavid van Moolenbroek }
109*00b67f09SDavid van Moolenbroek
110*00b67f09SDavid van Moolenbroek /*
111*00b67f09SDavid van Moolenbroek * Free the first 11 items. Verify that there are 10 free items on
112*00b67f09SDavid van Moolenbroek * the free list (which is our max).
113*00b67f09SDavid van Moolenbroek */
114*00b67f09SDavid van Moolenbroek
115*00b67f09SDavid van Moolenbroek for (i = 0; i < 11; i++) {
116*00b67f09SDavid van Moolenbroek isc_mempool_put(mp1, items1[i]);
117*00b67f09SDavid van Moolenbroek items1[i] = NULL;
118*00b67f09SDavid van Moolenbroek }
119*00b67f09SDavid van Moolenbroek
120*00b67f09SDavid van Moolenbroek rval = isc_mempool_getfreecount(mp1);
121*00b67f09SDavid van Moolenbroek if (rval != 10) {
122*00b67f09SDavid van Moolenbroek t_info("isc_mempool_getfreecount returned %d, expected %d\n",
123*00b67f09SDavid van Moolenbroek rval, MP1_FREEMAX);
124*00b67f09SDavid van Moolenbroek ++nfails;
125*00b67f09SDavid van Moolenbroek }
126*00b67f09SDavid van Moolenbroek
127*00b67f09SDavid van Moolenbroek rval = isc_mempool_getallocated(mp1);
128*00b67f09SDavid van Moolenbroek if (rval != 19) {
129*00b67f09SDavid van Moolenbroek t_info("isc_mempool_getallocated returned %d, expected %d\n",
130*00b67f09SDavid van Moolenbroek rval, MP1_MAXALLOC - 11);
131*00b67f09SDavid van Moolenbroek ++nfails;
132*00b67f09SDavid van Moolenbroek }
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek if (T_debug)
135*00b67f09SDavid van Moolenbroek isc_mem_stats(mctx, stderr);
136*00b67f09SDavid van Moolenbroek
137*00b67f09SDavid van Moolenbroek /*
138*00b67f09SDavid van Moolenbroek * Now, beat up on mp2 for a while. Allocate 50 items, then free
139*00b67f09SDavid van Moolenbroek * them, then allocate 50 more, etc.
140*00b67f09SDavid van Moolenbroek */
141*00b67f09SDavid van Moolenbroek
142*00b67f09SDavid van Moolenbroek t_info("setting freemax to %d\n", MP2_FREEMAX);
143*00b67f09SDavid van Moolenbroek isc_mempool_setfreemax(mp2, 25);
144*00b67f09SDavid van Moolenbroek t_info("setting fillcount to %d\n", MP2_FILLCNT);
145*00b67f09SDavid van Moolenbroek isc_mempool_setfillcount(mp2, 25);
146*00b67f09SDavid van Moolenbroek
147*00b67f09SDavid van Moolenbroek t_info("exercising the memory pool\n");
148*00b67f09SDavid van Moolenbroek for (j = 0; j < 500000; j++) {
149*00b67f09SDavid van Moolenbroek for (i = 0; i < 50; i++) {
150*00b67f09SDavid van Moolenbroek items2[i] = isc_mempool_get(mp2);
151*00b67f09SDavid van Moolenbroek if (items2[i] == NULL) {
152*00b67f09SDavid van Moolenbroek t_info("items2[%d] is unexpectedly null\n", i);
153*00b67f09SDavid van Moolenbroek ++nfails;
154*00b67f09SDavid van Moolenbroek }
155*00b67f09SDavid van Moolenbroek }
156*00b67f09SDavid van Moolenbroek for (i = 0; i < 50; i++) {
157*00b67f09SDavid van Moolenbroek isc_mempool_put(mp2, items2[i]);
158*00b67f09SDavid van Moolenbroek items2[i] = NULL;
159*00b67f09SDavid van Moolenbroek }
160*00b67f09SDavid van Moolenbroek if (j % 50000 == 0)
161*00b67f09SDavid van Moolenbroek t_info("...\n");
162*00b67f09SDavid van Moolenbroek }
163*00b67f09SDavid van Moolenbroek
164*00b67f09SDavid van Moolenbroek /*
165*00b67f09SDavid van Moolenbroek * Free all the other items and blow away this pool.
166*00b67f09SDavid van Moolenbroek */
167*00b67f09SDavid van Moolenbroek for (i = 11; i < MP1_MAXALLOC; i++) {
168*00b67f09SDavid van Moolenbroek isc_mempool_put(mp1, items1[i]);
169*00b67f09SDavid van Moolenbroek items1[i] = NULL;
170*00b67f09SDavid van Moolenbroek }
171*00b67f09SDavid van Moolenbroek
172*00b67f09SDavid van Moolenbroek isc_mempool_destroy(&mp1);
173*00b67f09SDavid van Moolenbroek
174*00b67f09SDavid van Moolenbroek if (T_debug)
175*00b67f09SDavid van Moolenbroek isc_mem_stats(mctx, stderr);
176*00b67f09SDavid van Moolenbroek
177*00b67f09SDavid van Moolenbroek isc_mempool_destroy(&mp2);
178*00b67f09SDavid van Moolenbroek
179*00b67f09SDavid van Moolenbroek if (T_debug)
180*00b67f09SDavid van Moolenbroek isc_mem_stats(mctx, stderr);
181*00b67f09SDavid van Moolenbroek
182*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
183*00b67f09SDavid van Moolenbroek
184*00b67f09SDavid van Moolenbroek return(0);
185*00b67f09SDavid van Moolenbroek }
186*00b67f09SDavid van Moolenbroek
187*00b67f09SDavid van Moolenbroek static const char *a1 =
188*00b67f09SDavid van Moolenbroek "the memory module supports the creation of memory contexts "
189*00b67f09SDavid van Moolenbroek "and the management of memory pools.";
190*00b67f09SDavid van Moolenbroek static void
t1(void)191*00b67f09SDavid van Moolenbroek t1(void) {
192*00b67f09SDavid van Moolenbroek int rval;
193*00b67f09SDavid van Moolenbroek int result;
194*00b67f09SDavid van Moolenbroek
195*00b67f09SDavid van Moolenbroek t_assert("mem", 1, T_REQUIRED, "%s", a1);
196*00b67f09SDavid van Moolenbroek
197*00b67f09SDavid van Moolenbroek rval = memtest();
198*00b67f09SDavid van Moolenbroek
199*00b67f09SDavid van Moolenbroek if (rval == 0)
200*00b67f09SDavid van Moolenbroek result = T_PASS;
201*00b67f09SDavid van Moolenbroek else
202*00b67f09SDavid van Moolenbroek result = T_FAIL;
203*00b67f09SDavid van Moolenbroek t_result(result);
204*00b67f09SDavid van Moolenbroek }
205*00b67f09SDavid van Moolenbroek
206*00b67f09SDavid van Moolenbroek testspec_t T_testlist[] = {
207*00b67f09SDavid van Moolenbroek { (PFV) t1, "basic memory subsystem" },
208*00b67f09SDavid van Moolenbroek { (PFV) 0, NULL }
209*00b67f09SDavid van Moolenbroek };
210*00b67f09SDavid van Moolenbroek
211*00b67f09SDavid van Moolenbroek #ifdef WIN32
212*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)213*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
214*00b67f09SDavid van Moolenbroek t_settests(T_testlist);
215*00b67f09SDavid van Moolenbroek return (t_main(argc, argv));
216*00b67f09SDavid van Moolenbroek }
217*00b67f09SDavid van Moolenbroek #endif
218