da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_UWIN) && defined(_BLD_ast)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid _STUB_vmprofile(){}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "vmhdr.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Method to profile space usage.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo, kpv@research.att.com, 03/23/94.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFHASH(pf) ((pf)->data.data.hash)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFVM(pf) ((pf)->data.data.vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFFILE(pf) ((pf)->data.data.fm.file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFLINE(pf) ((pf)->line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFNAME(pf) ((pf)->data.f)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFNALLOC(pf) ((pf)->data.data.nalloc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFALLOC(pf) ((pf)->data.data.alloc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFNFREE(pf) ((pf)->data.data.nfree)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFFREE(pf) ((pf)->data.data.free)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFREGION(pf) ((pf)->data.data.region)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFMAX(pf) ((pf)->data.data.fm.max)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _pfdata_s Pfdata_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _pfdata_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Vmulong_t hash; /* hash value */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { char* file; /* file name */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t max; /* max busy space for region */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } fm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmalloc_t* vm; /* region alloc from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pfobj_t* region; /* pointer to region record */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t nalloc; /* number of alloc calls */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t alloc; /* amount allocated */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t nfree; /* number of free calls */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t free; /* amount freed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _pfobj_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Pfobj_t* next; /* next in linked list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int line; /* line #, 0 for name holder */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pfdata_t data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char f[1]; /* actual file name */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Pfobj_t** Pftable; /* hash table */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PFTABLE 1019 /* table size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Vmalloc_t* Vmpf; /* heap for our own use */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Pfobj_t* pfsearch(Vmalloc_t* vm, const char* file, int line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Pfobj_t* pfsearch(vm, file, line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm; /* region allocating from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst char* file; /* the file issuing the allocation request */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint line; /* line number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t *pf, *last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmulong_t h;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg const char* cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!Vmpf && !(Vmpf = vmopen(Vmdcheap,Vmpool,0)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make hash table; PFTABLE'th slot hold regions' records */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!Pftable)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(!(Pftable = (Pfobj_t**)vmalloc(Vmheap,(PFTABLE+1)*sizeof(Pfobj_t*))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n = PFTABLE; n >= 0; --n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[n] = NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see if it's there with a combined hash value of vm,file,line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin h = line + (((Vmulong_t)vm)>>4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(cp = file; *cp; ++cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin h += (h<<7) + ((*cp)&0377) + 987654321L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (int)(h%PFTABLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(last = NIL(Pfobj_t*), pf = Pftable[n]; pf; last = pf, pf = pf->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(PFLINE(pf) == line && PFVM(pf) == vm && strcmp(PFFILE(pf),file) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* insert if not there yet */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg Pfobj_t* fn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t* pfvm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmulong_t hn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* first get/construct the file name slot */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hn = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(cp = file; *cp; ++cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hn += (hn<<7) + ((*cp)&0377) + 987654321L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (int)(hn%PFTABLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(fn = Pftable[n]; fn; fn = fn->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(PFLINE(fn) < 0 && strcmp(PFNAME(fn),file) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!fn)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = sizeof(Pfobj_t) - sizeof(Pfdata_t) + strlen(file) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(fn = (Pfobj_t*)vmalloc(Vmheap,s)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fn->next = Pftable[n];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[n] = fn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFLINE(fn) = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy(PFNAME(fn),file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* get region record; note that these are ordered by vm */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last = NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(pfvm = Pftable[PFTABLE]; pfvm; last = pfvm, pfvm = pfvm->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vm >= PFVM(pfvm))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!pfvm || PFVM(pfvm) > vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(!(pfvm = (Pfobj_t*)vmalloc(Vmpf,sizeof(Pfobj_t))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { pfvm->next = last->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last->next = pfvm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { pfvm->next = Pftable[PFTABLE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[PFTABLE] = pfvm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pfvm) = PFALLOC(pfvm) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pfvm) = PFFREE(pfvm) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFMAX(pfvm) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFVM(pfvm) = vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFLINE(pfvm) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(pf = (Pfobj_t*)vmalloc(Vmpf,sizeof(Pfobj_t))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (int)(h%PFTABLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = Pftable[n];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[n] = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFLINE(pf) = line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFFILE(pf) = PFNAME(fn);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFREGION(pf) = pfvm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFVM(pf) = vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pf) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFALLOC(pf) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFFREE(pf) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFHASH(pf) = h;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(last) /* do a move-to-front */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { last->next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = Pftable[n];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[n] = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void pfclose(Vmalloc_t* vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void pfclose(vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t *pf, *next, *last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* free all records related to region vm */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n = PFTABLE; n >= 0; --n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { for(last = NIL(Pfobj_t*), pf = Pftable[n]; pf; )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(PFLINE(pf) >= 0 && PFVM(pf) == vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last->next = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else Pftable[n] = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmfree(Vmpf,pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else last = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void pfsetinfo(Vmalloc_t* vm, Vmuchar_t* data, size_t size, const char* file, int line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void pfsetinfo(vm, data, size, file, line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmuchar_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst char* file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t* pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmulong_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* let vmclose knows that there are records for region vm */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Vmpfclose = pfclose;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!file || line <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { file = "";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((pf = pfsearch(vm,file,line)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PFALLOC(pf) += size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFOBJ(data) = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFSIZE(data) = size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* update region statistics */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFREGION(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFALLOC(pf) += size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((s = PFALLOC(pf) - PFFREE(pf)) > PFMAX(pf) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFMAX(pf) = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* sort by file names and line numbers */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Pfobj_t* pfsort(Pfobj_t* pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Pfobj_t* pfsort(pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinPfobj_t* pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t *one, *two, *next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int cmp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!pf->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* partition to two equal size lists */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin one = two = NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = one;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin one = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((pf = next) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = two;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin two = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sort and merge the lists */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin one = pfsort(one);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin two = pfsort(two);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(pf = next = NIL(Pfobj_t*);; )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* make sure that the "<>" file comes first */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(PFLINE(one) == 0 && PFLINE(two) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmp = PFVM(one) > PFVM(two) ? 1 : -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(PFLINE(one) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmp = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(PFLINE(two) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmp = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if((cmp = strcmp(PFFILE(one),PFFILE(two))) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { cmp = PFLINE(one) - PFLINE(two);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cmp == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmp = PFVM(one) > PFVM(two) ? 1 : -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cmp < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(!pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = one;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else next->next = one;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next = one;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(one = one->next) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(two)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next->next = two;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(!pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = two;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else next->next = two;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next = two;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(two = two->next) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(one)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next->next = one;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* pfsummary(char* buf, Vmulong_t na, Vmulong_t sa,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vmulong_t nf, Vmulong_t sf, Vmulong_t max, Vmulong_t size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* pfsummary(buf, na, sa, nf, sf, max, size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar* buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t na;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t sa;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t nf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t sf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t max;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmulong_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf,"n_alloc", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(na,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf,"n_free", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(nf,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf,"s_alloc", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(sa,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf,"s_free", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(sf,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(max > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { buf = (*_Vmstrcpy)(buf,"max_busy", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(max,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf,"extent", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (*_Vmstrcpy)(buf, (*_Vmitoa)(size,-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *buf++ = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* print profile data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmprofile(Vmalloc_t* vm, int fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmprofile(vm, fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t *pf, *list, *next, *last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmulong_t nalloc, alloc, nfree, free;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Seg_t* seg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[1024], *bufp, *endbuf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INITBUF() (bufp = buf, endbuf = buf+sizeof(buf)-128)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CHKBUF() (bufp >= endbuf ? (write(fd,buf,bufp-buf), bufp=buf) : bufp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FLSBUF() (bufp > buf ? write(fd,buf,bufp-buf) : 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fd < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* initialize functions from vmtrace.c that we use below */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((n = vmtrace(-1)) >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmtrace(n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc = free = nalloc = nfree = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin list = NIL(Pfobj_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n = PFTABLE-1; n >= 0; --n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { for(pf = Pftable[n], last = NIL(Pfobj_t*); pf; )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(PFLINE(pf) < 0 || (vm && vm != PFVM(pf)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { last = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto next_pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* remove from hash table */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last->next = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else Pftable[n] = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* put on output list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = list;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin list = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nalloc += PFNALLOC(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc += PFALLOC(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nfree += PFNFREE(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free += PFFREE(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next_pf:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin INITBUF();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"ALLOCATION USAGE SUMMARY", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = pfsummary(bufp,nalloc,alloc,nfree,free,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* print regions' summary data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(pf = Pftable[PFTABLE]; pf; pf = pf->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(vm && PFVM(pf) != vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(seg = PFVM(pf)->data->seg; seg; seg = seg->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc += seg->extent;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"region", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(PFVM(pf)),0), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = pfsummary(bufp,PFNALLOC(pf),PFALLOC(pf),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf),PFFREE(pf),PFMAX(pf),alloc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sort then output detailed profile */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin list = pfsort(list);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(pf = list; pf; )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* compute summary for file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc = free = nalloc = nfree = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(last = pf; last; last = last->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(strcmp(PFFILE(last),PFFILE(pf)) != 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nalloc += PFNALLOC(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin alloc += PFALLOC(last);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nfree += PFNFREE(last);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free += PFFREE(last);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CHKBUF();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"file",'=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,PFFILE(pf)[0] ? PFFILE(pf) : "<>" ,':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = pfsummary(bufp,nalloc,alloc,nfree,free,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(pf != last) /* detailed data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { CHKBUF();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"\tline",'=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(PFLINE(pf),-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "region", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(PFVM(pf)),0), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = pfsummary(bufp,PFNALLOC(pf),PFALLOC(pf),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf),PFFREE(pf),0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* reinsert into hash table */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next = pf->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (int)(PFHASH(pf)%PFTABLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf->next = Pftable[n];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pftable[n] = pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FLSBUF();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfalloc(Vmalloc_t* vm, size_t size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfalloc(vm, size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int line, local, inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(local = vd->mode&VM_TRUST) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GETLOCAL(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd, local))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = ROUND(size,ALIGN) + PF_EXTRA;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(data = KPVALLOC(vm,s,(*(Vmbest->allocf))) ) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfsetinfo(vm,(Vmuchar_t*)data,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)data,size,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(local, vm, VM_ALLOC, (Void_t*)data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int pffree(Vmalloc_t* vm, Void_t* data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int pffree(vm, data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t* pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int line, rv, local, inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(local = vd->mode&VM_TRUST) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GETLOCAL(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,local))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(KPVADDR(vm,data,Vmbest->addrf) != 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(vm->disc->exceptf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*vm->disc->exceptf)(vm,VM_BADADDR,data,vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFOBJ(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = PFSIZE(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PFNFREE(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFFREE(pf) += s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFREGION(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFFREE(pf) += s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,(Vmuchar_t*)data,NIL(Vmuchar_t*),s,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = KPVFREE((vm), (Void_t*)data, (*Vmbest->freef));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(local, vm, VM_FREE, data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return rv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfresize(Vmalloc_t* vm, Void_t* data, size_t size, int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfresize(vm, data, size, type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Pfobj_t* pf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t news;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int line, local, inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t oldsize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { oldsize = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin addr = pfalloc(vm,size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(size == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { (void)pffree(vm,data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(local = vd->mode&VM_TRUST))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GETLOCAL(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd, local))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(KPVADDR(vm,data,Vmbest->addrf) != 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(vm->disc->exceptf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*vm->disc->exceptf)(vm,VM_BADADDR,data,vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd, local);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFOBJ(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = oldsize = PFSIZE(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin news = ROUND(size,ALIGN) + PF_EXTRA;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((addr = KPVRESIZE(vm,data,news,(type&~VM_RSZERO),Vmbest->resizef)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(pf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PFFREE(pf) += s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFREGION(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFFREE(pf) += s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNFREE(pf) += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfsetinfo(vm,(Vmuchar_t*)addr,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,(Vmuchar_t*)data,(Vmuchar_t*)addr,size,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(pf) /* reset old info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PFALLOC(pf) -= s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pf) -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pf = PFREGION(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFALLOC(pf) -= s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PFNALLOC(pf) -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin file = PFFILE(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = PFLINE(pf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfsetinfo(vm,(Vmuchar_t*)data,s,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(local, vm, VM_RESIZE, (Void_t*)addr, vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone: if(addr && (type&VM_RSZERO) && oldsize < size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg Vmuchar_t *d = (Vmuchar_t*)addr+oldsize, *ed = (Vmuchar_t*)addr+size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { *d++ = 0; } while(d < ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long pfsize(Vmalloc_t* vm, Void_t* addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long pfsize(vm, addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (*Vmbest->addrf)(vm,addr) != 0 ? -1L : (long)PFSIZE(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long pfaddr(Vmalloc_t* vm, Void_t* addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long pfaddr(vm, addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (*Vmbest->addrf)(vm,addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int pfcompact(Vmalloc_t* vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int pfcompact(vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (*Vmbest->compactf)(vm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfalign(Vmalloc_t* vm, size_t size, size_t align)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* pfalign(vm, size, align)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t align;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int line, local, inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(local = vd->mode&VM_TRUST) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GETLOCAL(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd, local))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (size <= TINYSIZE ? TINYSIZE : ROUND(size,ALIGN)) + PF_EXTRA;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(data = KPVALIGN(vm,s,align,Vmbest->alignf)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfsetinfo(vm,(Vmuchar_t*)data,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!local && (vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)data,size,align);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd, local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(local, vm, VM_ALLOC, data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Vmethod_t _Vmprofile =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfalloc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfresize,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pffree,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfaddr,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfsize,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfcompact,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pfalign,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VM_MTPROFILE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__DEFINE__(Vmethod_t*,Vmprofile,&_Vmprofile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef NoF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinNoF(vmprofile)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif