xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/vmalloc/vmprofile.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #if defined(_UWIN) && defined(_BLD_ast)
23*b30d1939SAndy Fiddaman 
_STUB_vmprofile()24*b30d1939SAndy Fiddaman void _STUB_vmprofile(){}
25*b30d1939SAndy Fiddaman 
26*b30d1939SAndy Fiddaman #else
27*b30d1939SAndy Fiddaman 
28*b30d1939SAndy Fiddaman #include	"vmhdr.h"
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman /*	Method to profile space usage.
31*b30d1939SAndy Fiddaman **
32*b30d1939SAndy Fiddaman **	Written by Kiem-Phong Vo, kpv@research.att.com, 03/23/94.
33*b30d1939SAndy Fiddaman */
34*b30d1939SAndy Fiddaman 
35*b30d1939SAndy Fiddaman #define PFHASH(pf)	((pf)->data.data.hash)
36*b30d1939SAndy Fiddaman #define PFVM(pf)	((pf)->data.data.vm)
37*b30d1939SAndy Fiddaman #define PFFILE(pf)	((pf)->data.data.fm.file)
38*b30d1939SAndy Fiddaman #define PFLINE(pf)	((pf)->line)
39*b30d1939SAndy Fiddaman #define PFNAME(pf)	((pf)->data.f)
40*b30d1939SAndy Fiddaman #define PFNALLOC(pf)	((pf)->data.data.nalloc)
41*b30d1939SAndy Fiddaman #define PFALLOC(pf)	((pf)->data.data.alloc)
42*b30d1939SAndy Fiddaman #define PFNFREE(pf)	((pf)->data.data.nfree)
43*b30d1939SAndy Fiddaman #define PFFREE(pf)	((pf)->data.data.free)
44*b30d1939SAndy Fiddaman #define PFREGION(pf)	((pf)->data.data.region)
45*b30d1939SAndy Fiddaman #define PFMAX(pf)	((pf)->data.data.fm.max)
46*b30d1939SAndy Fiddaman 
47*b30d1939SAndy Fiddaman typedef struct _pfdata_s	Pfdata_t;
48*b30d1939SAndy Fiddaman struct _pfdata_s
49*b30d1939SAndy Fiddaman {	Vmulong_t	hash;	/* hash value			*/
50*b30d1939SAndy Fiddaman 	union
51*b30d1939SAndy Fiddaman 	{ char*		file;	/* file name			*/
52*b30d1939SAndy Fiddaman 	  Vmulong_t	max;	/* max busy space for region	*/
53*b30d1939SAndy Fiddaman 	} fm;
54*b30d1939SAndy Fiddaman 	Vmalloc_t*	vm;	/* region alloc from 		*/
55*b30d1939SAndy Fiddaman 	Pfobj_t*	region;	/* pointer to region record	*/
56*b30d1939SAndy Fiddaman 	Vmulong_t	nalloc;	/* number of alloc calls	*/
57*b30d1939SAndy Fiddaman 	Vmulong_t	alloc;	/* amount allocated		*/
58*b30d1939SAndy Fiddaman 	Vmulong_t	nfree;	/* number of free calls		*/
59*b30d1939SAndy Fiddaman 	Vmulong_t	free;	/* amount freed			*/
60*b30d1939SAndy Fiddaman };
61*b30d1939SAndy Fiddaman struct _pfobj_s
62*b30d1939SAndy Fiddaman {	Pfobj_t*	next;	/* next in linked list	*/
63*b30d1939SAndy Fiddaman 	int		line;	/* line #, 0 for name holder	*/
64*b30d1939SAndy Fiddaman 	union
65*b30d1939SAndy Fiddaman 	{
66*b30d1939SAndy Fiddaman 	Pfdata_t	data;
67*b30d1939SAndy Fiddaman 	char		f[1];	/* actual file name		*/
68*b30d1939SAndy Fiddaman 	} data;
69*b30d1939SAndy Fiddaman };
70*b30d1939SAndy Fiddaman 
71*b30d1939SAndy Fiddaman static Pfobj_t**	Pftable;	/* hash table		*/
72*b30d1939SAndy Fiddaman #define PFTABLE		1019		/* table size		*/
73*b30d1939SAndy Fiddaman static Vmalloc_t*	Vmpf;		/* heap for our own use	*/
74*b30d1939SAndy Fiddaman 
75*b30d1939SAndy Fiddaman #if __STD_C
pfsearch(Vmalloc_t * vm,char * file,int line)76*b30d1939SAndy Fiddaman static Pfobj_t* pfsearch(Vmalloc_t* vm, char* file, int line)
77*b30d1939SAndy Fiddaman #else
78*b30d1939SAndy Fiddaman static Pfobj_t* pfsearch(vm, file, line)
79*b30d1939SAndy Fiddaman Vmalloc_t*	vm;	/* region allocating from			*/
80*b30d1939SAndy Fiddaman char*		file;	/* the file issuing the allocation request	*/
81*b30d1939SAndy Fiddaman int		line;	/* line number					*/
82*b30d1939SAndy Fiddaman #endif
83*b30d1939SAndy Fiddaman {
84*b30d1939SAndy Fiddaman 	reg Pfobj_t	*pf, *last;
85*b30d1939SAndy Fiddaman 	reg Vmulong_t	h;
86*b30d1939SAndy Fiddaman 	reg int		n;
87*b30d1939SAndy Fiddaman 	reg char	*cp;
88*b30d1939SAndy Fiddaman 
89*b30d1939SAndy Fiddaman 	if(!Vmpf && !(Vmpf = vmopen(Vmdcheap,Vmpool,0)) )
90*b30d1939SAndy Fiddaman 		return NIL(Pfobj_t*);
91*b30d1939SAndy Fiddaman 
92*b30d1939SAndy Fiddaman 	/* make hash table; PFTABLE'th slot hold regions' records */
93*b30d1939SAndy Fiddaman 	if(!Pftable)
94*b30d1939SAndy Fiddaman 	{	if(!(Pftable = (Pfobj_t**)vmalloc(Vmheap,(PFTABLE+1)*sizeof(Pfobj_t*))) )
95*b30d1939SAndy Fiddaman 			return NIL(Pfobj_t*);
96*b30d1939SAndy Fiddaman 		for(n = PFTABLE; n >= 0; --n)
97*b30d1939SAndy Fiddaman 			Pftable[n] = NIL(Pfobj_t*);
98*b30d1939SAndy Fiddaman 	}
99*b30d1939SAndy Fiddaman 
100*b30d1939SAndy Fiddaman 	/* see if it's there with a combined hash value of vm,file,line */
101*b30d1939SAndy Fiddaman 	h = line + (((Vmulong_t)vm)>>4);
102*b30d1939SAndy Fiddaman 	for(cp = file; *cp; ++cp)
103*b30d1939SAndy Fiddaman 		h += (h<<7) + ((*cp)&0377) + 987654321L;
104*b30d1939SAndy Fiddaman 	n = (int)(h%PFTABLE);
105*b30d1939SAndy Fiddaman 	for(last = NIL(Pfobj_t*), pf = Pftable[n]; pf; last = pf, pf = pf->next)
106*b30d1939SAndy Fiddaman 		if(PFLINE(pf) == line && PFVM(pf) == vm && strcmp(PFFILE(pf),file) == 0)
107*b30d1939SAndy Fiddaman 			break;
108*b30d1939SAndy Fiddaman 
109*b30d1939SAndy Fiddaman 	/* insert if not there yet */
110*b30d1939SAndy Fiddaman 	if(!pf)
111*b30d1939SAndy Fiddaman 	{	reg Pfobj_t*	fn;
112*b30d1939SAndy Fiddaman 		reg Pfobj_t*	pfvm;
113*b30d1939SAndy Fiddaman 		reg Vmulong_t	hn;
114*b30d1939SAndy Fiddaman 
115*b30d1939SAndy Fiddaman 		/* first get/construct the file name slot */
116*b30d1939SAndy Fiddaman 		hn = 0;
117*b30d1939SAndy Fiddaman 		for(cp = file; *cp; ++cp)
118*b30d1939SAndy Fiddaman 			hn += (hn<<7) + ((*cp)&0377) + 987654321L;
119*b30d1939SAndy Fiddaman 		n = (int)(hn%PFTABLE);
120*b30d1939SAndy Fiddaman 		for(fn = Pftable[n]; fn; fn = fn->next)
121*b30d1939SAndy Fiddaman 			if(PFLINE(fn) < 0 && strcmp(PFNAME(fn),file) == 0)
122*b30d1939SAndy Fiddaman 				break;
123*b30d1939SAndy Fiddaman 		if(!fn)
124*b30d1939SAndy Fiddaman 		{	reg size_t	s;
125*b30d1939SAndy Fiddaman 			s = sizeof(Pfobj_t) - sizeof(Pfdata_t) + strlen(file) + 1;
126*b30d1939SAndy Fiddaman 			if(!(fn = (Pfobj_t*)vmalloc(Vmheap,s)) )
127*b30d1939SAndy Fiddaman 				return NIL(Pfobj_t*);
128*b30d1939SAndy Fiddaman 			fn->next = Pftable[n];
129*b30d1939SAndy Fiddaman 			Pftable[n] = fn;
130*b30d1939SAndy Fiddaman 			PFLINE(fn) = -1;
131*b30d1939SAndy Fiddaman 			strcpy(PFNAME(fn),file);
132*b30d1939SAndy Fiddaman 		}
133*b30d1939SAndy Fiddaman 
134*b30d1939SAndy Fiddaman 		/* get region record; note that these are ordered by vm */
135*b30d1939SAndy Fiddaman 		last = NIL(Pfobj_t*);
136*b30d1939SAndy Fiddaman 		for(pfvm = Pftable[PFTABLE]; pfvm; last = pfvm, pfvm = pfvm->next)
137*b30d1939SAndy Fiddaman 			if(vm >= PFVM(pfvm))
138*b30d1939SAndy Fiddaman 				break;
139*b30d1939SAndy Fiddaman 		if(!pfvm || PFVM(pfvm) > vm)
140*b30d1939SAndy Fiddaman 		{	if(!(pfvm = (Pfobj_t*)vmalloc(Vmpf,sizeof(Pfobj_t))) )
141*b30d1939SAndy Fiddaman 				return NIL(Pfobj_t*);
142*b30d1939SAndy Fiddaman 			if(last)
143*b30d1939SAndy Fiddaman 			{	pfvm->next = last->next;
144*b30d1939SAndy Fiddaman 				last->next = pfvm;
145*b30d1939SAndy Fiddaman 			}
146*b30d1939SAndy Fiddaman 			else
147*b30d1939SAndy Fiddaman 			{	pfvm->next = Pftable[PFTABLE];
148*b30d1939SAndy Fiddaman 				Pftable[PFTABLE] = pfvm;
149*b30d1939SAndy Fiddaman 			}
150*b30d1939SAndy Fiddaman 			PFNALLOC(pfvm) = PFALLOC(pfvm) = 0;
151*b30d1939SAndy Fiddaman 			PFNFREE(pfvm) = PFFREE(pfvm) = 0;
152*b30d1939SAndy Fiddaman 			PFMAX(pfvm) = 0;
153*b30d1939SAndy Fiddaman 			PFVM(pfvm) = vm;
154*b30d1939SAndy Fiddaman 			PFLINE(pfvm) = 0;
155*b30d1939SAndy Fiddaman 		}
156*b30d1939SAndy Fiddaman 
157*b30d1939SAndy Fiddaman 		if(!(pf = (Pfobj_t*)vmalloc(Vmpf,sizeof(Pfobj_t))) )
158*b30d1939SAndy Fiddaman 			return NIL(Pfobj_t*);
159*b30d1939SAndy Fiddaman 		n = (int)(h%PFTABLE);
160*b30d1939SAndy Fiddaman 		pf->next = Pftable[n];
161*b30d1939SAndy Fiddaman 		Pftable[n] = pf;
162*b30d1939SAndy Fiddaman 		PFLINE(pf) = line;
163*b30d1939SAndy Fiddaman 		PFFILE(pf) = PFNAME(fn);
164*b30d1939SAndy Fiddaman 		PFREGION(pf) = pfvm;
165*b30d1939SAndy Fiddaman 		PFVM(pf) = vm;
166*b30d1939SAndy Fiddaman 		PFNALLOC(pf) = 0;
167*b30d1939SAndy Fiddaman 		PFALLOC(pf) = 0;
168*b30d1939SAndy Fiddaman 		PFNFREE(pf) = 0;
169*b30d1939SAndy Fiddaman 		PFFREE(pf) = 0;
170*b30d1939SAndy Fiddaman 		PFHASH(pf) = h;
171*b30d1939SAndy Fiddaman 	}
172*b30d1939SAndy Fiddaman 	else if(last)	/* do a move-to-front */
173*b30d1939SAndy Fiddaman 	{	last->next = pf->next;
174*b30d1939SAndy Fiddaman 		pf->next = Pftable[n];
175*b30d1939SAndy Fiddaman 		Pftable[n] = pf;
176*b30d1939SAndy Fiddaman 	}
177*b30d1939SAndy Fiddaman 
178*b30d1939SAndy Fiddaman 	return pf;
179*b30d1939SAndy Fiddaman }
180*b30d1939SAndy Fiddaman 
181*b30d1939SAndy Fiddaman #if __STD_C
pfclose(Vmalloc_t * vm)182*b30d1939SAndy Fiddaman static void pfclose(Vmalloc_t* vm)
183*b30d1939SAndy Fiddaman #else
184*b30d1939SAndy Fiddaman static void pfclose(vm)
185*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
186*b30d1939SAndy Fiddaman #endif
187*b30d1939SAndy Fiddaman {
188*b30d1939SAndy Fiddaman 	reg int		n;
189*b30d1939SAndy Fiddaman 	reg Pfobj_t	*pf, *next, *last;
190*b30d1939SAndy Fiddaman 
191*b30d1939SAndy Fiddaman 	/* free all records related to region vm */
192*b30d1939SAndy Fiddaman 	for(n = PFTABLE; n >= 0; --n)
193*b30d1939SAndy Fiddaman 	{	for(last = NIL(Pfobj_t*), pf = Pftable[n]; pf; )
194*b30d1939SAndy Fiddaman 		{	next = pf->next;
195*b30d1939SAndy Fiddaman 
196*b30d1939SAndy Fiddaman 			if(PFLINE(pf) >= 0 && PFVM(pf) == vm)
197*b30d1939SAndy Fiddaman 			{	if(last)
198*b30d1939SAndy Fiddaman 					last->next = next;
199*b30d1939SAndy Fiddaman 				else	Pftable[n] = next;
200*b30d1939SAndy Fiddaman 				vmfree(Vmpf,pf);
201*b30d1939SAndy Fiddaman 			}
202*b30d1939SAndy Fiddaman 			else	last = pf;
203*b30d1939SAndy Fiddaman 
204*b30d1939SAndy Fiddaman 			pf = next;
205*b30d1939SAndy Fiddaman 		}
206*b30d1939SAndy Fiddaman 	}
207*b30d1939SAndy Fiddaman }
208*b30d1939SAndy Fiddaman 
209*b30d1939SAndy Fiddaman #if __STD_C
pfsetinfo(Vmalloc_t * vm,Vmuchar_t * data,size_t size,char * file,int line)210*b30d1939SAndy Fiddaman static void pfsetinfo(Vmalloc_t* vm, Vmuchar_t* data, size_t size, char* file, int line)
211*b30d1939SAndy Fiddaman #else
212*b30d1939SAndy Fiddaman static void pfsetinfo(vm, data, size, file, line)
213*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
214*b30d1939SAndy Fiddaman Vmuchar_t*	data;
215*b30d1939SAndy Fiddaman size_t		size;
216*b30d1939SAndy Fiddaman char*		file;
217*b30d1939SAndy Fiddaman int		line;
218*b30d1939SAndy Fiddaman #endif
219*b30d1939SAndy Fiddaman {
220*b30d1939SAndy Fiddaman 	reg Pfobj_t*	pf;
221*b30d1939SAndy Fiddaman 	reg Vmulong_t	s;
222*b30d1939SAndy Fiddaman 
223*b30d1939SAndy Fiddaman 	/* let vmclose knows that there are records for region vm */
224*b30d1939SAndy Fiddaman 	_Vmpfclose = pfclose;
225*b30d1939SAndy Fiddaman 
226*b30d1939SAndy Fiddaman 	if(!file || line <= 0)
227*b30d1939SAndy Fiddaman 	{	file = "";
228*b30d1939SAndy Fiddaman 		line = 0;
229*b30d1939SAndy Fiddaman 	}
230*b30d1939SAndy Fiddaman 
231*b30d1939SAndy Fiddaman 	if((pf = pfsearch(vm,file,line)) )
232*b30d1939SAndy Fiddaman 	{	PFALLOC(pf) += (Vmulong_t)size;
233*b30d1939SAndy Fiddaman 		PFNALLOC(pf) += 1;
234*b30d1939SAndy Fiddaman 	}
235*b30d1939SAndy Fiddaman 	PFOBJ(data) = pf;
236*b30d1939SAndy Fiddaman 	PFSIZE(data) = size;
237*b30d1939SAndy Fiddaman 
238*b30d1939SAndy Fiddaman 	if(pf)
239*b30d1939SAndy Fiddaman 	{	/* update region statistics */
240*b30d1939SAndy Fiddaman 		pf = PFREGION(pf);
241*b30d1939SAndy Fiddaman 		PFALLOC(pf) += (Vmulong_t)size;
242*b30d1939SAndy Fiddaman 		PFNALLOC(pf) += 1;
243*b30d1939SAndy Fiddaman 		if((s = PFALLOC(pf) - PFFREE(pf)) > PFMAX(pf) )
244*b30d1939SAndy Fiddaman 			PFMAX(pf) = s;
245*b30d1939SAndy Fiddaman 	}
246*b30d1939SAndy Fiddaman }
247*b30d1939SAndy Fiddaman 
248*b30d1939SAndy Fiddaman /* sort by file names and line numbers */
249*b30d1939SAndy Fiddaman #if __STD_C
pfsort(Pfobj_t * pf)250*b30d1939SAndy Fiddaman static Pfobj_t* pfsort(Pfobj_t* pf)
251*b30d1939SAndy Fiddaman #else
252*b30d1939SAndy Fiddaman static Pfobj_t* pfsort(pf)
253*b30d1939SAndy Fiddaman Pfobj_t*	pf;
254*b30d1939SAndy Fiddaman #endif
255*b30d1939SAndy Fiddaman {
256*b30d1939SAndy Fiddaman 	reg Pfobj_t	*one, *two, *next;
257*b30d1939SAndy Fiddaman 	reg int		cmp;
258*b30d1939SAndy Fiddaman 
259*b30d1939SAndy Fiddaman 	if(!pf->next)
260*b30d1939SAndy Fiddaman 		return pf;
261*b30d1939SAndy Fiddaman 
262*b30d1939SAndy Fiddaman 	/* partition to two equal size lists */
263*b30d1939SAndy Fiddaman 	one = two = NIL(Pfobj_t*);
264*b30d1939SAndy Fiddaman 	while(pf)
265*b30d1939SAndy Fiddaman 	{	next = pf->next;
266*b30d1939SAndy Fiddaman 		pf->next = one;
267*b30d1939SAndy Fiddaman 		one = pf;
268*b30d1939SAndy Fiddaman 
269*b30d1939SAndy Fiddaman 		if((pf = next) )
270*b30d1939SAndy Fiddaman 		{	next = pf->next;
271*b30d1939SAndy Fiddaman 			pf->next = two;
272*b30d1939SAndy Fiddaman 			two = pf;
273*b30d1939SAndy Fiddaman 			pf = next;
274*b30d1939SAndy Fiddaman 		}
275*b30d1939SAndy Fiddaman 	}
276*b30d1939SAndy Fiddaman 
277*b30d1939SAndy Fiddaman 	/* sort and merge the lists */
278*b30d1939SAndy Fiddaman 	one = pfsort(one);
279*b30d1939SAndy Fiddaman 	two = pfsort(two);
280*b30d1939SAndy Fiddaman 	for(pf = next = NIL(Pfobj_t*);; )
281*b30d1939SAndy Fiddaman 	{	/* make sure that the "<>" file comes first */
282*b30d1939SAndy Fiddaman 		if(PFLINE(one) == 0 && PFLINE(two) == 0)
283*b30d1939SAndy Fiddaman 			cmp = PFVM(one) > PFVM(two) ? 1 : -1;
284*b30d1939SAndy Fiddaman 		else if(PFLINE(one) == 0)
285*b30d1939SAndy Fiddaman 			cmp = -1;
286*b30d1939SAndy Fiddaman 		else if(PFLINE(two) == 0)
287*b30d1939SAndy Fiddaman 			cmp = 1;
288*b30d1939SAndy Fiddaman 		else if((cmp = strcmp(PFFILE(one),PFFILE(two))) == 0)
289*b30d1939SAndy Fiddaman 		{	cmp = PFLINE(one) - PFLINE(two);
290*b30d1939SAndy Fiddaman 			if(cmp == 0)
291*b30d1939SAndy Fiddaman 				cmp = PFVM(one) > PFVM(two) ? 1 : -1;
292*b30d1939SAndy Fiddaman 		}
293*b30d1939SAndy Fiddaman 
294*b30d1939SAndy Fiddaman 		if(cmp < 0)
295*b30d1939SAndy Fiddaman 		{	if(!pf)
296*b30d1939SAndy Fiddaman 				pf = one;
297*b30d1939SAndy Fiddaman 			else	next->next = one;
298*b30d1939SAndy Fiddaman 			next = one;
299*b30d1939SAndy Fiddaman 			if(!(one = one->next) )
300*b30d1939SAndy Fiddaman 			{	if(two)
301*b30d1939SAndy Fiddaman 					next->next = two;
302*b30d1939SAndy Fiddaman 				return pf;
303*b30d1939SAndy Fiddaman 			}
304*b30d1939SAndy Fiddaman 		}
305*b30d1939SAndy Fiddaman 		else
306*b30d1939SAndy Fiddaman 		{	if(!pf)
307*b30d1939SAndy Fiddaman 				pf = two;
308*b30d1939SAndy Fiddaman 			else	next->next = two;
309*b30d1939SAndy Fiddaman 			next = two;
310*b30d1939SAndy Fiddaman 			if(!(two = two->next) )
311*b30d1939SAndy Fiddaman 			{	if(one)
312*b30d1939SAndy Fiddaman 					next->next = one;
313*b30d1939SAndy Fiddaman 				return pf;
314*b30d1939SAndy Fiddaman 			}
315*b30d1939SAndy Fiddaman 		}
316*b30d1939SAndy Fiddaman 	}
317*b30d1939SAndy Fiddaman }
318*b30d1939SAndy Fiddaman 
319*b30d1939SAndy Fiddaman #if __STD_C
pfsummary(char * buf,Vmulong_t na,Vmulong_t sa,Vmulong_t nf,Vmulong_t sf,Vmulong_t max,Vmulong_t size)320*b30d1939SAndy Fiddaman static char* pfsummary(char* buf, Vmulong_t na, Vmulong_t sa,
321*b30d1939SAndy Fiddaman 			Vmulong_t nf, Vmulong_t sf, Vmulong_t max, Vmulong_t size)
322*b30d1939SAndy Fiddaman #else
323*b30d1939SAndy Fiddaman static char* pfsummary(buf, na, sa, nf, sf, max, size)
324*b30d1939SAndy Fiddaman char*		buf;
325*b30d1939SAndy Fiddaman Vmulong_t	na;
326*b30d1939SAndy Fiddaman Vmulong_t	sa;
327*b30d1939SAndy Fiddaman Vmulong_t	nf;
328*b30d1939SAndy Fiddaman Vmulong_t	sf;
329*b30d1939SAndy Fiddaman Vmulong_t	max;
330*b30d1939SAndy Fiddaman Vmulong_t	size;
331*b30d1939SAndy Fiddaman #endif
332*b30d1939SAndy Fiddaman {
333*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf,"n_alloc", '=');
334*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(na,-1), ':');
335*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf,"n_free", '=');
336*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(nf,-1), ':');
337*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf,"s_alloc", '=');
338*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(sa,-1), ':');
339*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf,"s_free", '=');
340*b30d1939SAndy Fiddaman 	buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(sf,-1), ':');
341*b30d1939SAndy Fiddaman 	if(max > 0)
342*b30d1939SAndy Fiddaman 	{	buf = (*_Vmstrcpy)(buf,"max_busy", '=');
343*b30d1939SAndy Fiddaman 		buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(max,-1), ':');
344*b30d1939SAndy Fiddaman 		buf = (*_Vmstrcpy)(buf,"extent", '=');
345*b30d1939SAndy Fiddaman 		buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(size,-1), ':');
346*b30d1939SAndy Fiddaman 	}
347*b30d1939SAndy Fiddaman 	*buf++ = '\n';
348*b30d1939SAndy Fiddaman 
349*b30d1939SAndy Fiddaman 	return buf;
350*b30d1939SAndy Fiddaman }
351*b30d1939SAndy Fiddaman 
352*b30d1939SAndy Fiddaman /* print profile data */
353*b30d1939SAndy Fiddaman #if __STD_C
vmprofile(Vmalloc_t * vm,int fd)354*b30d1939SAndy Fiddaman int vmprofile(Vmalloc_t* vm, int fd)
355*b30d1939SAndy Fiddaman #else
356*b30d1939SAndy Fiddaman int vmprofile(vm, fd)
357*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
358*b30d1939SAndy Fiddaman int		fd;
359*b30d1939SAndy Fiddaman #endif
360*b30d1939SAndy Fiddaman {
361*b30d1939SAndy Fiddaman 	reg Pfobj_t	*pf, *list, *next, *last;
362*b30d1939SAndy Fiddaman 	reg int		n;
363*b30d1939SAndy Fiddaman 	reg Vmulong_t	nalloc, alloc, nfree, free;
364*b30d1939SAndy Fiddaman 	reg Seg_t	*seg;
365*b30d1939SAndy Fiddaman 	char		buf[1024], *bufp, *endbuf;
366*b30d1939SAndy Fiddaman #define INITBUF()	(bufp = buf, endbuf = buf+sizeof(buf)-128)
367*b30d1939SAndy Fiddaman #define CHKBUF()	(bufp >= endbuf ? (write(fd,buf,bufp-buf), bufp=buf) : bufp)
368*b30d1939SAndy Fiddaman #define FLSBUF()	(bufp > buf ? write(fd,buf,bufp-buf) : 0)
369*b30d1939SAndy Fiddaman 
370*b30d1939SAndy Fiddaman 	if(fd < 0)
371*b30d1939SAndy Fiddaman 		return -1;
372*b30d1939SAndy Fiddaman 
373*b30d1939SAndy Fiddaman 	/* initialize functions from vmtrace.c that we use below */
374*b30d1939SAndy Fiddaman 	if((n = vmtrace(-1)) >= 0)
375*b30d1939SAndy Fiddaman 		vmtrace(n);
376*b30d1939SAndy Fiddaman 
377*b30d1939SAndy Fiddaman 	alloc = free = nalloc = nfree = 0;
378*b30d1939SAndy Fiddaman 	list = NIL(Pfobj_t*);
379*b30d1939SAndy Fiddaman 	for(n = PFTABLE-1; n >= 0; --n)
380*b30d1939SAndy Fiddaman 	{	for(pf = Pftable[n], last = NIL(Pfobj_t*); pf; )
381*b30d1939SAndy Fiddaman 		{	next = pf->next;
382*b30d1939SAndy Fiddaman 
383*b30d1939SAndy Fiddaman 			if(PFLINE(pf) < 0  || (vm && vm != PFVM(pf)) )
384*b30d1939SAndy Fiddaman 			{	last = pf;
385*b30d1939SAndy Fiddaman 				goto next_pf;
386*b30d1939SAndy Fiddaman 			}
387*b30d1939SAndy Fiddaman 
388*b30d1939SAndy Fiddaman 			/* remove from hash table */
389*b30d1939SAndy Fiddaman 			if(last)
390*b30d1939SAndy Fiddaman 				last->next = next;
391*b30d1939SAndy Fiddaman 			else	Pftable[n] = next;
392*b30d1939SAndy Fiddaman 
393*b30d1939SAndy Fiddaman 			/* put on output list */
394*b30d1939SAndy Fiddaman 			pf->next = list;
395*b30d1939SAndy Fiddaman 			list = pf;
396*b30d1939SAndy Fiddaman 			nalloc += PFNALLOC(pf);
397*b30d1939SAndy Fiddaman 			alloc += PFALLOC(pf);
398*b30d1939SAndy Fiddaman 			nfree += PFNFREE(pf);
399*b30d1939SAndy Fiddaman 			free += PFFREE(pf);
400*b30d1939SAndy Fiddaman 
401*b30d1939SAndy Fiddaman 		next_pf:
402*b30d1939SAndy Fiddaman 			pf = next;
403*b30d1939SAndy Fiddaman 		}
404*b30d1939SAndy Fiddaman 	}
405*b30d1939SAndy Fiddaman 
406*b30d1939SAndy Fiddaman 	INITBUF();
407*b30d1939SAndy Fiddaman 	bufp = (*_Vmstrcpy)(bufp,"ALLOCATION USAGE SUMMARY", ':');
408*b30d1939SAndy Fiddaman 	bufp = pfsummary(bufp,nalloc,alloc,nfree,free,0,0);
409*b30d1939SAndy Fiddaman 
410*b30d1939SAndy Fiddaman 	/* print regions' summary data */
411*b30d1939SAndy Fiddaman 	for(pf = Pftable[PFTABLE]; pf; pf = pf->next)
412*b30d1939SAndy Fiddaman 	{	if(vm && PFVM(pf) != vm)
413*b30d1939SAndy Fiddaman 			continue;
414*b30d1939SAndy Fiddaman 		alloc = 0;
415*b30d1939SAndy Fiddaman 		for(seg = PFVM(pf)->data->seg; seg; seg = seg->next)
416*b30d1939SAndy Fiddaman 			alloc += (Vmulong_t)seg->extent;
417*b30d1939SAndy Fiddaman 		bufp = (*_Vmstrcpy)(bufp,"region", '=');
418*b30d1939SAndy Fiddaman 		bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(PFVM(pf)),0), ':');
419*b30d1939SAndy Fiddaman 		bufp = pfsummary(bufp,PFNALLOC(pf),PFALLOC(pf),
420*b30d1939SAndy Fiddaman 				 PFNFREE(pf),PFFREE(pf),PFMAX(pf),alloc);
421*b30d1939SAndy Fiddaman 	}
422*b30d1939SAndy Fiddaman 
423*b30d1939SAndy Fiddaman 	/* sort then output detailed profile */
424*b30d1939SAndy Fiddaman 	list = pfsort(list);
425*b30d1939SAndy Fiddaman 	for(pf = list; pf; )
426*b30d1939SAndy Fiddaman 	{	/* compute summary for file */
427*b30d1939SAndy Fiddaman 		alloc = free = nalloc = nfree = 0;
428*b30d1939SAndy Fiddaman 		for(last = pf; last; last = last->next)
429*b30d1939SAndy Fiddaman 		{	if(strcmp(PFFILE(last),PFFILE(pf)) != 0)
430*b30d1939SAndy Fiddaman 				break;
431*b30d1939SAndy Fiddaman 			nalloc += PFNALLOC(pf);
432*b30d1939SAndy Fiddaman 			alloc += PFALLOC(last);
433*b30d1939SAndy Fiddaman 			nfree += PFNFREE(last);
434*b30d1939SAndy Fiddaman 			free += PFFREE(last);
435*b30d1939SAndy Fiddaman 		}
436*b30d1939SAndy Fiddaman 		CHKBUF();
437*b30d1939SAndy Fiddaman 		bufp = (*_Vmstrcpy)(bufp,"file",'=');
438*b30d1939SAndy Fiddaman 		bufp = (*_Vmstrcpy)(bufp,PFFILE(pf)[0] ? PFFILE(pf) : "<>" ,':');
439*b30d1939SAndy Fiddaman 		bufp = pfsummary(bufp,nalloc,alloc,nfree,free,0,0);
440*b30d1939SAndy Fiddaman 
441*b30d1939SAndy Fiddaman 		while(pf != last)	/* detailed data */
442*b30d1939SAndy Fiddaman 		{	CHKBUF();
443*b30d1939SAndy Fiddaman 			bufp = (*_Vmstrcpy)(bufp,"\tline",'=');
444*b30d1939SAndy Fiddaman 			bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(PFLINE(pf),-1), ':');
445*b30d1939SAndy Fiddaman 			bufp = (*_Vmstrcpy)(bufp, "region", '=');
446*b30d1939SAndy Fiddaman 			bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(PFVM(pf)),0), ':');
447*b30d1939SAndy Fiddaman 			bufp = pfsummary(bufp,PFNALLOC(pf),PFALLOC(pf),
448*b30d1939SAndy Fiddaman 					 PFNFREE(pf),PFFREE(pf),0,0);
449*b30d1939SAndy Fiddaman 
450*b30d1939SAndy Fiddaman 			/* reinsert into hash table */
451*b30d1939SAndy Fiddaman 			next = pf->next;
452*b30d1939SAndy Fiddaman 			n = (int)(PFHASH(pf)%PFTABLE);
453*b30d1939SAndy Fiddaman 			pf->next = Pftable[n];
454*b30d1939SAndy Fiddaman 			Pftable[n] = pf;
455*b30d1939SAndy Fiddaman 			pf = next;
456*b30d1939SAndy Fiddaman 		}
457*b30d1939SAndy Fiddaman 	}
458*b30d1939SAndy Fiddaman 
459*b30d1939SAndy Fiddaman 	FLSBUF();
460*b30d1939SAndy Fiddaman 	return 0;
461*b30d1939SAndy Fiddaman }
462*b30d1939SAndy Fiddaman 
463*b30d1939SAndy Fiddaman #if __STD_C
pfalloc(Vmalloc_t * vm,size_t size,int local)464*b30d1939SAndy Fiddaman static Void_t* pfalloc(Vmalloc_t* vm, size_t size, int local)
465*b30d1939SAndy Fiddaman #else
466*b30d1939SAndy Fiddaman static Void_t* pfalloc(vm, size, local)
467*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
468*b30d1939SAndy Fiddaman size_t		size;
469*b30d1939SAndy Fiddaman int		local;
470*b30d1939SAndy Fiddaman #endif
471*b30d1939SAndy Fiddaman {
472*b30d1939SAndy Fiddaman 	reg size_t	s;
473*b30d1939SAndy Fiddaman 	reg Void_t	*data;
474*b30d1939SAndy Fiddaman 	reg char	*file;
475*b30d1939SAndy Fiddaman 	reg int		line;
476*b30d1939SAndy Fiddaman 	reg Void_t	*func;
477*b30d1939SAndy Fiddaman 	reg Vmdata_t	*vd = vm->data;
478*b30d1939SAndy Fiddaman 
479*b30d1939SAndy Fiddaman 	VMFLF(vm,file,line,func);
480*b30d1939SAndy Fiddaman 
481*b30d1939SAndy Fiddaman 	SETLOCK(vm, local);
482*b30d1939SAndy Fiddaman 
483*b30d1939SAndy Fiddaman 	s = ROUND(size,ALIGN) + PF_EXTRA;
484*b30d1939SAndy Fiddaman 	if((data = KPVALLOC(vm,s,(*(Vmbest->allocf))) ) )
485*b30d1939SAndy Fiddaman 	{	pfsetinfo(vm,(Vmuchar_t*)data,size,file,line);
486*b30d1939SAndy Fiddaman 
487*b30d1939SAndy Fiddaman 		if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
488*b30d1939SAndy Fiddaman 		{	vm->file = file; vm->line = line; vm->func = func;
489*b30d1939SAndy Fiddaman 			(*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)data,size,0);
490*b30d1939SAndy Fiddaman 		}
491*b30d1939SAndy Fiddaman 	}
492*b30d1939SAndy Fiddaman 
493*b30d1939SAndy Fiddaman 	CLRLOCK(vm, local);
494*b30d1939SAndy Fiddaman 
495*b30d1939SAndy Fiddaman 	return data;
496*b30d1939SAndy Fiddaman }
497*b30d1939SAndy Fiddaman 
498*b30d1939SAndy Fiddaman #if __STD_C
pffree(Vmalloc_t * vm,Void_t * data,int local)499*b30d1939SAndy Fiddaman static int pffree(Vmalloc_t* vm, Void_t* data, int local)
500*b30d1939SAndy Fiddaman #else
501*b30d1939SAndy Fiddaman static int pffree(vm, data, local)
502*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
503*b30d1939SAndy Fiddaman Void_t*		data;
504*b30d1939SAndy Fiddaman int		local;
505*b30d1939SAndy Fiddaman #endif
506*b30d1939SAndy Fiddaman {
507*b30d1939SAndy Fiddaman 	reg Pfobj_t	*pf;
508*b30d1939SAndy Fiddaman 	reg size_t	s;
509*b30d1939SAndy Fiddaman 	reg char	*file;
510*b30d1939SAndy Fiddaman 	reg int		line, rv;
511*b30d1939SAndy Fiddaman 	reg Void_t	*func;
512*b30d1939SAndy Fiddaman 	reg Vmdata_t	*vd = vm->data;
513*b30d1939SAndy Fiddaman 
514*b30d1939SAndy Fiddaman 	VMFLF(vm,file,line,func);
515*b30d1939SAndy Fiddaman 
516*b30d1939SAndy Fiddaman 	if(!data)
517*b30d1939SAndy Fiddaman 		return 0;
518*b30d1939SAndy Fiddaman 
519*b30d1939SAndy Fiddaman 	SETLOCK(vm,local);
520*b30d1939SAndy Fiddaman 
521*b30d1939SAndy Fiddaman 	/**/ASSERT(KPVADDR(vm, data, Vmbest->addrf) == 0 );
522*b30d1939SAndy Fiddaman 	pf = PFOBJ(data);
523*b30d1939SAndy Fiddaman 	s = PFSIZE(data);
524*b30d1939SAndy Fiddaman 	if(pf)
525*b30d1939SAndy Fiddaman 	{	PFNFREE(pf) += 1;
526*b30d1939SAndy Fiddaman 		PFFREE(pf) += (Vmulong_t)s;
527*b30d1939SAndy Fiddaman 		pf = PFREGION(pf);
528*b30d1939SAndy Fiddaman 		PFNFREE(pf) += 1;
529*b30d1939SAndy Fiddaman 		PFFREE(pf) += (Vmulong_t)s;
530*b30d1939SAndy Fiddaman 	}
531*b30d1939SAndy Fiddaman 
532*b30d1939SAndy Fiddaman 	if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
533*b30d1939SAndy Fiddaman 	{	vm->file = file; vm->line = line; vm->func = func;
534*b30d1939SAndy Fiddaman 		(*_Vmtrace)(vm,(Vmuchar_t*)data,NIL(Vmuchar_t*),s,0);
535*b30d1939SAndy Fiddaman 	}
536*b30d1939SAndy Fiddaman 
537*b30d1939SAndy Fiddaman 	rv = KPVFREE((vm), (Void_t*)data, (*Vmbest->freef));
538*b30d1939SAndy Fiddaman 
539*b30d1939SAndy Fiddaman         CLRLOCK(vm, local);
540*b30d1939SAndy Fiddaman 
541*b30d1939SAndy Fiddaman 	return rv;
542*b30d1939SAndy Fiddaman }
543*b30d1939SAndy Fiddaman 
544*b30d1939SAndy Fiddaman #if __STD_C
pfresize(Vmalloc_t * vm,Void_t * data,size_t size,int type,int local)545*b30d1939SAndy Fiddaman static Void_t* pfresize(Vmalloc_t* vm, Void_t* data, size_t size, int type, int local)
546*b30d1939SAndy Fiddaman #else
547*b30d1939SAndy Fiddaman static Void_t* pfresize(vm, data, size, type, local)
548*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
549*b30d1939SAndy Fiddaman Void_t*		data;
550*b30d1939SAndy Fiddaman size_t		size;
551*b30d1939SAndy Fiddaman int		type;
552*b30d1939SAndy Fiddaman int		local;
553*b30d1939SAndy Fiddaman #endif
554*b30d1939SAndy Fiddaman {
555*b30d1939SAndy Fiddaman 	reg Pfobj_t	*pf;
556*b30d1939SAndy Fiddaman 	reg size_t	s, news;
557*b30d1939SAndy Fiddaman 	reg Void_t	*addr;
558*b30d1939SAndy Fiddaman 	reg char	*file;
559*b30d1939SAndy Fiddaman 	reg int		line;
560*b30d1939SAndy Fiddaman 	reg Void_t	*func;
561*b30d1939SAndy Fiddaman 	reg size_t	oldsize;
562*b30d1939SAndy Fiddaman 	reg Vmdata_t	*vd = vm->data;
563*b30d1939SAndy Fiddaman 
564*b30d1939SAndy Fiddaman 	if(!data)
565*b30d1939SAndy Fiddaman 	{	addr = pfalloc(vm, size, local);
566*b30d1939SAndy Fiddaman 		if(addr && (type&VM_RSZERO) )
567*b30d1939SAndy Fiddaman 			memset(addr, 0, size);
568*b30d1939SAndy Fiddaman 		return addr;
569*b30d1939SAndy Fiddaman 	}
570*b30d1939SAndy Fiddaman 	if(size == 0)
571*b30d1939SAndy Fiddaman 	{	(void)pffree(vm, data, local);
572*b30d1939SAndy Fiddaman 		return NIL(Void_t*);
573*b30d1939SAndy Fiddaman 	}
574*b30d1939SAndy Fiddaman 
575*b30d1939SAndy Fiddaman 	VMFLF(vm,file,line,func);
576*b30d1939SAndy Fiddaman 
577*b30d1939SAndy Fiddaman 	SETLOCK(vm, local);
578*b30d1939SAndy Fiddaman 
579*b30d1939SAndy Fiddaman 	/**/ASSERT(KPVADDR(vm,data,Vmbest->addrf) == 0 );
580*b30d1939SAndy Fiddaman 	pf = PFOBJ(data);
581*b30d1939SAndy Fiddaman 	s = oldsize = PFSIZE(data);
582*b30d1939SAndy Fiddaman 
583*b30d1939SAndy Fiddaman 	news = ROUND(size,ALIGN) + PF_EXTRA;
584*b30d1939SAndy Fiddaman 	if((addr = KPVRESIZE(vm,data,news,(type&~VM_RSZERO),Vmbest->resizef)) )
585*b30d1939SAndy Fiddaman 	{	if(pf)
586*b30d1939SAndy Fiddaman 		{	PFFREE(pf) += (Vmulong_t)s;
587*b30d1939SAndy Fiddaman 			PFNFREE(pf) += 1;
588*b30d1939SAndy Fiddaman 			pf = PFREGION(pf);
589*b30d1939SAndy Fiddaman 			PFFREE(pf) += (Vmulong_t)s;
590*b30d1939SAndy Fiddaman 			PFNFREE(pf) += 1;
591*b30d1939SAndy Fiddaman 			pfsetinfo(vm,(Vmuchar_t*)addr,size,file,line);
592*b30d1939SAndy Fiddaman 		}
593*b30d1939SAndy Fiddaman 
594*b30d1939SAndy Fiddaman 		if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
595*b30d1939SAndy Fiddaman 		{	vm->file = file; vm->line = line; vm->func = func;
596*b30d1939SAndy Fiddaman 			(*_Vmtrace)(vm,(Vmuchar_t*)data,(Vmuchar_t*)addr,size,0);
597*b30d1939SAndy Fiddaman 		}
598*b30d1939SAndy Fiddaman 	}
599*b30d1939SAndy Fiddaman 	else if(pf)	/* reset old info */
600*b30d1939SAndy Fiddaman 	{	PFALLOC(pf) -= (Vmulong_t)s;
601*b30d1939SAndy Fiddaman 		PFNALLOC(pf) -= 1;
602*b30d1939SAndy Fiddaman 		pf = PFREGION(pf);
603*b30d1939SAndy Fiddaman 		PFALLOC(pf) -= (Vmulong_t)s;
604*b30d1939SAndy Fiddaman 		PFNALLOC(pf) -= 1;
605*b30d1939SAndy Fiddaman 		file = PFFILE(pf);
606*b30d1939SAndy Fiddaman 		line = PFLINE(pf);
607*b30d1939SAndy Fiddaman 		pfsetinfo(vm,(Vmuchar_t*)data,s,file,line);
608*b30d1939SAndy Fiddaman 	}
609*b30d1939SAndy Fiddaman 
610*b30d1939SAndy Fiddaman 	if(addr && (type&VM_RSZERO) && oldsize < size)
611*b30d1939SAndy Fiddaman 	{	reg Vmuchar_t *d = (Vmuchar_t*)addr+oldsize, *ed = (Vmuchar_t*)addr+size;
612*b30d1939SAndy Fiddaman 		do { *d++ = 0; } while(d < ed);
613*b30d1939SAndy Fiddaman 	}
614*b30d1939SAndy Fiddaman 
615*b30d1939SAndy Fiddaman 	CLRLOCK(vm, local);
616*b30d1939SAndy Fiddaman 
617*b30d1939SAndy Fiddaman 	return addr;
618*b30d1939SAndy Fiddaman }
619*b30d1939SAndy Fiddaman 
620*b30d1939SAndy Fiddaman #if __STD_C
pfsize(Vmalloc_t * vm,Void_t * addr,int local)621*b30d1939SAndy Fiddaman static long pfsize(Vmalloc_t* vm, Void_t* addr, int local)
622*b30d1939SAndy Fiddaman #else
623*b30d1939SAndy Fiddaman static long pfsize(vm, addr, local)
624*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
625*b30d1939SAndy Fiddaman Void_t*		addr;
626*b30d1939SAndy Fiddaman int		local;
627*b30d1939SAndy Fiddaman #endif
628*b30d1939SAndy Fiddaman {
629*b30d1939SAndy Fiddaman 	return (*Vmbest->addrf)(vm, addr, local) != 0 ? -1L : (long)PFSIZE(addr);
630*b30d1939SAndy Fiddaman }
631*b30d1939SAndy Fiddaman 
632*b30d1939SAndy Fiddaman #if __STD_C
pfaddr(Vmalloc_t * vm,Void_t * addr,int local)633*b30d1939SAndy Fiddaman static long pfaddr(Vmalloc_t* vm, Void_t* addr, int local)
634*b30d1939SAndy Fiddaman #else
635*b30d1939SAndy Fiddaman static long pfaddr(vm, addr, local)
636*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
637*b30d1939SAndy Fiddaman Void_t*		addr;
638*b30d1939SAndy Fiddaman int		local;
639*b30d1939SAndy Fiddaman #endif
640*b30d1939SAndy Fiddaman {
641*b30d1939SAndy Fiddaman 	return (*Vmbest->addrf)(vm, addr, local);
642*b30d1939SAndy Fiddaman }
643*b30d1939SAndy Fiddaman 
644*b30d1939SAndy Fiddaman #if __STD_C
pfcompact(Vmalloc_t * vm,int local)645*b30d1939SAndy Fiddaman static int pfcompact(Vmalloc_t* vm, int local)
646*b30d1939SAndy Fiddaman #else
647*b30d1939SAndy Fiddaman static int pfcompact(vm, local)
648*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
649*b30d1939SAndy Fiddaman int		local;
650*b30d1939SAndy Fiddaman #endif
651*b30d1939SAndy Fiddaman {
652*b30d1939SAndy Fiddaman 	return (*Vmbest->compactf)(vm, local);
653*b30d1939SAndy Fiddaman }
654*b30d1939SAndy Fiddaman 
655*b30d1939SAndy Fiddaman #if __STD_C
pfalign(Vmalloc_t * vm,size_t size,size_t align,int local)656*b30d1939SAndy Fiddaman static Void_t* pfalign(Vmalloc_t* vm, size_t size, size_t align, int local)
657*b30d1939SAndy Fiddaman #else
658*b30d1939SAndy Fiddaman static Void_t* pfalign(vm, size, align, local)
659*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
660*b30d1939SAndy Fiddaman size_t		size;
661*b30d1939SAndy Fiddaman size_t		align;
662*b30d1939SAndy Fiddaman int		local;
663*b30d1939SAndy Fiddaman #endif
664*b30d1939SAndy Fiddaman {
665*b30d1939SAndy Fiddaman 	reg size_t	s;
666*b30d1939SAndy Fiddaman 	reg Void_t	*data;
667*b30d1939SAndy Fiddaman 	reg char	*file;
668*b30d1939SAndy Fiddaman 	reg int		line;
669*b30d1939SAndy Fiddaman 	reg Void_t	*func;
670*b30d1939SAndy Fiddaman 	reg Vmdata_t	*vd = vm->data;
671*b30d1939SAndy Fiddaman 
672*b30d1939SAndy Fiddaman 	VMFLF(vm,file,line,func);
673*b30d1939SAndy Fiddaman 
674*b30d1939SAndy Fiddaman 	SETLOCK(vm, local);
675*b30d1939SAndy Fiddaman 
676*b30d1939SAndy Fiddaman 	s = (size <= TINYSIZE ? TINYSIZE : ROUND(size,ALIGN)) + PF_EXTRA;
677*b30d1939SAndy Fiddaman 	if((data = KPVALIGN(vm,s,align,Vmbest->alignf)) )
678*b30d1939SAndy Fiddaman 	{	pfsetinfo(vm,(Vmuchar_t*)data,size,file,line);
679*b30d1939SAndy Fiddaman 
680*b30d1939SAndy Fiddaman 		if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
681*b30d1939SAndy Fiddaman 		{	vm->file = file; vm->line = line; vm->func = func;
682*b30d1939SAndy Fiddaman 			(*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)data,size,align);
683*b30d1939SAndy Fiddaman 		}
684*b30d1939SAndy Fiddaman 	}
685*b30d1939SAndy Fiddaman 
686*b30d1939SAndy Fiddaman 	CLRLOCK(vm, local);
687*b30d1939SAndy Fiddaman 
688*b30d1939SAndy Fiddaman 	return data;
689*b30d1939SAndy Fiddaman }
690*b30d1939SAndy Fiddaman 
691*b30d1939SAndy Fiddaman static Vmethod_t _Vmprofile =
692*b30d1939SAndy Fiddaman {
693*b30d1939SAndy Fiddaman 	pfalloc,
694*b30d1939SAndy Fiddaman 	pfresize,
695*b30d1939SAndy Fiddaman 	pffree,
696*b30d1939SAndy Fiddaman 	pfaddr,
697*b30d1939SAndy Fiddaman 	pfsize,
698*b30d1939SAndy Fiddaman 	pfcompact,
699*b30d1939SAndy Fiddaman 	pfalign,
700*b30d1939SAndy Fiddaman 	VM_MTPROFILE
701*b30d1939SAndy Fiddaman };
702*b30d1939SAndy Fiddaman 
703*b30d1939SAndy Fiddaman __DEFINE__(Vmethod_t*,Vmprofile,&_Vmprofile);
704*b30d1939SAndy Fiddaman 
705*b30d1939SAndy Fiddaman #ifdef NoF
706*b30d1939SAndy Fiddaman NoF(vmprofile)
707*b30d1939SAndy Fiddaman #endif
708*b30d1939SAndy Fiddaman 
709*b30d1939SAndy Fiddaman #endif
710