xref: /minix3/external/bsd/bind/dist/bin/tests/mem/t_mem.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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