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_vmdebug(){}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "vmhdr.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Method to help with debugging. This does rigorous checks on
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** addresses and arena integrity.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* structure to keep track of file names */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _dbfile_s Dbfile_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _dbfile_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Dbfile_t* next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char file[1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Dbfile_t* Dbfile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* global watch list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_WATCH 32
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int Dbnwatch;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* Dbwatch[S_WATCH];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* types of warnings reported by dbwarn() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_CHECK 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_ALLOC 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_FREE 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_RESIZE 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_WATCH 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DB_RESIZED 5
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LONGV(x) ((Vmulong_t)(x))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int Dbinit = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBINIT() (Dbinit ? 0 : (dbinit(), Dbinit=1) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbinit()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ int fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((fd = vmtrace(-1)) >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmtrace(fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int Dbfd = 2; /* default warning file descriptor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmdebug(int fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmdebug(fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int old = Dbfd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbfd = fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return old;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* just an entry point to make it easy to set break point */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void vmdbwarn(Vmalloc_t* vm, char* mesg, int n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void vmdbwarn(vm, mesg, n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar* mesg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin write(Dbfd,mesg,n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vd->mode&VM_DBABORT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin abort();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* issue a warning of some type */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbwarn(Vmalloc_t* vm, Void_t* data, int where,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* file, int line, const Void_t* func, int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbwarn(vm, data, where, file, line, func, type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm; /* region holding the block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* data; /* data block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint where; /* byte that was corrupted */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst char* file; /* file where call originates */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint line; /* line number of call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst Void_t* func; /* function called from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint type; /* operation being done */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[1024], *bufp, *endbuf, *s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SLOP 64 /* enough for a message and an int */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBINIT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endbuf = buf + sizeof(buf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(type == DB_ALLOC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "alloc error", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_FREE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "free error", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_RESIZE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "resize error", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_CHECK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "corrupted data", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_WATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "alert", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* region info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "region", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(vm), 0), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { bufp = (*_Vmstrcpy)(bufp,"block",'=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,(*_Vmitoa)(VLONG(data),0),':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(where == DB_ALLOC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "can't get memory", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else bufp = (*_Vmstrcpy)(bufp, "region is locked", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_FREE || type == DB_RESIZE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(where == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, "unallocated block", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else bufp = (*_Vmstrcpy)(bufp, "already freed", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_WATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { bufp = (*_Vmstrcpy)(bufp, "size", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(DBSIZE(data),-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(where == DB_ALLOC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"just allocated", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(where == DB_FREE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"being freed", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(where == DB_RESIZE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"being resized", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(where == DB_RESIZED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,"just resized", ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type == DB_CHECK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { bufp = (*_Vmstrcpy)(bufp, "bad byte at", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(LONGV(where),-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((s = DBFILE(data)) && (bufp + strlen(s) + SLOP) < endbuf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { bufp = (*_Vmstrcpy)(bufp,"allocated at", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, s, ',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp,(*_Vmitoa)(LONGV(DBLINE(data)),-1),':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* location where offending call originates from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(file && file[0] && line > 0 && (bufp + strlen(file) + SLOP) < endbuf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { bufp = (*_Vmstrcpy)(bufp, "detected at", '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, file, ',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(LONGV(line),-1), ',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(func),-1), ':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *(bufp - 1) = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *bufp = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmdbwarn(vm,buf,(bufp-buf));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* check for watched address and issue warnings */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbwatch(Vmalloc_t* vm, Void_t* data,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* file, int line, const Void_t* func, int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbwatch(vm, data, file, line, func, type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst char* file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n = Dbnwatch; n >= 0; --n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(Dbwatch[n] == data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,data,type,file,line,func,DB_WATCH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* record information about the block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbsetinfo(Vmuchar_t* data, size_t size, const char* file, int line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void dbsetinfo(data, size, file, line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmuchar_t* data; /* real address not the one from Vmbest */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size; /* the actual requested size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst char* file; /* file where the request came from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint line; /* and line number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmuchar_t *begp, *endp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Dbfile_t *last, *db;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBINIT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* find the file structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!file || !file[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin db = NIL(Dbfile_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { for(last = NIL(Dbfile_t*), db = Dbfile; db; last = db, db = db->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strcmp(db->file,file) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!db)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { db = (Dbfile_t*)vmalloc(Vmheap,sizeof(Dbfile_t)+strlen(file));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(db)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { (*_Vmstrcpy)(db->file,file,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin db->next = Dbfile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbfile = db->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(last) /* move-to-front heuristic */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { last->next = db->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin db->next = Dbfile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbfile = db->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBSETFL(data,(db ? db->file : NIL(char*)),line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBSIZE(data) = size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBSEG(data) = SEG(DBBLOCK(data));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBHEAD(data,begp,endp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(begp < endp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *begp++ = DB_MAGIC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBTAIL(data,begp,endp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(begp < endp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *begp++ = DB_MAGIC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Check to see if an address is in some data block of a region.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** This returns -(offset+1) if block is already freed, +(offset+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** if block is live, 0 if no match.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long dbaddr(Vmalloc_t* vm, Void_t* addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long dbaddr(vm, addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Block_t *b, *endb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Seg_t* seg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmuchar_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg long offset = -1L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int local, inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin GETLOCAL(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,local) || !addr)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1L;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,local);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = endb = NIL(Block_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(seg = vd->seg; seg; seg = seg->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { b = SEGBLOCK(seg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endb = (Block_t*)(seg->baddr - sizeof(Head_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((Vmuchar_t*)addr > (Vmuchar_t*)b &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (Vmuchar_t*)addr < (Vmuchar_t*)endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!seg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(local) /* must be vmfree or vmresize checking address */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(DBSEG(addr) == seg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { b = DBBLOCK(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin offset = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else offset = -2L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(b < endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { data = (Vmuchar_t*)DATA(b);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((Vmuchar_t*)addr >= data && (Vmuchar_t*)addr < data+SIZE(b))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { data = DB2DEBUG(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((Vmuchar_t*)addr >= data &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (Vmuchar_t*)addr < data+DBSIZE(data))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin offset = (Vmuchar_t*)addr - data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,local);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return offset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long dbsize(Vmalloc_t* vm, Void_t* addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic long dbsize(vm, addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Block_t *b, *endb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Seg_t* seg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg long size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1L;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = -1L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(seg = vd->seg; seg; seg = seg->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { b = SEGBLOCK(seg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endb = (Block_t*)(seg->baddr - sizeof(Head_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((Vmuchar_t*)addr <= (Vmuchar_t*)b ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (Vmuchar_t*)addr >= (Vmuchar_t*)endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(b < endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(addr == (Void_t*)DB2DEBUG(DATA(b)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = (long)DBSIZE(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dballoc(Vmalloc_t* vm, size_t size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dballoc(vm, size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmuchar_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_ALLOC);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vd->mode&VM_DBCHECK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmdbcheck(vm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = ROUND(size,ALIGN) + DB_EXTRA;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(s < sizeof(Body_t)) /* no tiny blocks during Vmdebug */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = sizeof(Body_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(data = (Vmuchar_t*)KPVALLOC(vm,s,(*(Vmbest->allocf))) ) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,NIL(Vmuchar_t*),DB_ALLOC,file,line,func,DB_ALLOC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data = DB2DEBUG(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbsetinfo(data,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,NIL(Vmuchar_t*),data,size,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Dbnwatch > 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbwatch(vm,data,file,line,func,DB_ALLOC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(0, vm, VM_ALLOC, (Void_t*)data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (Void_t*)data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int dbfree(Vmalloc_t* vm, Void_t* data )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int dbfree(vm, data )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg long offset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int rv, *ip, *endip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!data)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_FREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vd->mode&VM_DBCHECK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmdbcheck(vm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((offset = KPVADDR(vm,data,dbaddr)) != 0)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner { dbwarn(vm,(Vmuchar_t*)data,offset == -1L ? 0 : 1,file,line,func,DB_FREE);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner 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 if(Dbnwatch > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbwatch(vm,data,file,line,func,DB_FREE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,(Vmuchar_t*)data,NIL(Vmuchar_t*),DBSIZE(data),0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* clear free space */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = (int*)data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endip = ip + (DBSIZE(data)+sizeof(int)-1)/sizeof(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(ip < endip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ip++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = KPVFREE((vm), (Void_t*)DB2BEST(data), (*Vmbest->freef));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(0, vm, VM_FREE, data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return rv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Resizing an existing block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dbresize(Vmalloc_t* vm, Void_t* addr, reg size_t size, int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dbresize(vm,addr,size,type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm; /* region allocating from */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr; /* old block of data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreg size_t size; /* new size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint type; /* !=0 for movable, >0 for copy */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmuchar_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s, oldsize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg long offset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *file, *oldfile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int line, oldline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { oldsize = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data = (Vmuchar_t*)dballoc(vm,size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(size == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { (void)dbfree(vm,addr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_RESIZE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vd->mode&VM_DBCHECK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vmdbcheck(vm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((offset = KPVADDR(vm,addr,dbaddr)) != 0)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner { dbwarn(vm,(Vmuchar_t*)addr,offset == -1L ? 0 : 1,file,line,func,DB_RESIZE);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(vm->disc->exceptf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*vm->disc->exceptf)(vm,VM_BADADDR,addr,vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Dbnwatch > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbwatch(vm,addr,file,line,func,DB_RESIZE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* Vmbest data block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data = DB2BEST(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldsize = DBSIZE(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldfile = DBFILE(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldline = DBLINE(addr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* do the resize */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = ROUND(size,ALIGN) + DB_EXTRA;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(s < sizeof(Body_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = sizeof(Body_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data = (Vmuchar_t*)KPVRESIZE(vm,(Void_t*)data,s,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (type&~VM_RSZERO),(*(Vmbest->resizef)) );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!data) /* failed, reset data for old block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { dbwarn(vm,NIL(Vmuchar_t*),DB_ALLOC,file,line,func,DB_RESIZE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbsetinfo((Vmuchar_t*)addr,oldsize,oldfile,oldline);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { data = DB2DEBUG(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbsetinfo(data,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,(Vmuchar_t*)addr,data,size,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Dbnwatch > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbwatch(vm,data,file,line,func,DB_RESIZED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(0, vm, VM_RESIZE, (Void_t*)data, vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone: if(data && (type&VM_RSZERO) && size > oldsize)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg Vmuchar_t *d = data+oldsize, *ed = data+size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { *d++ = 0; } while(d < ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (Void_t*)data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* compact any residual free space */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int dbcompact(Vmalloc_t* vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int dbcompact(vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (*(Vmbest->compactf))(vm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* check for memory overwrites over all live blocks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmdbcheck(Vmalloc_t* vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint vmdbcheck(vm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Block_t *b, *endb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Seg_t* seg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int rv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check the meta-data of this region */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vd->mode & (VM_MTDEBUG|VM_MTBEST|VM_MTPROFILE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(_vmbestcheck(vd, NIL(Block_t*)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(vd->mode&VM_MTDEBUG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(seg = vd->seg; seg; seg = seg->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { b = SEGBLOCK(seg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endb = (Block_t*)(seg->baddr - sizeof(Head_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(b < endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg Vmuchar_t *data, *begp, *endp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISJUNK(SIZE(b)) || !ISBUSY(SIZE(b)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data = DB2DEBUG(DATA(b));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(DBISBAD(data)) /* seen this before */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { rv += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBHEAD(data,begp,endp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(; begp < endp; ++begp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*begp != DB_MAGIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto set_bad;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBTAIL(data,begp,endp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(; begp < endp; ++begp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(*begp == DB_MAGIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set_bad:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbwarn(vm,data,begp-data,NIL(char*),0,0,DB_CHECK);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DBSETBAD(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next: b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return rv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set/delete an address to watch */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* vmdbwatch(Void_t* addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* vmdbwatch(addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* addr; /* address to insert */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* out;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out = NIL(Void_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbnwatch = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { for(n = Dbnwatch - 1; n >= 0; --n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Dbwatch[n] == addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n < 0) /* insert */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(Dbnwatch == S_WATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* delete left-most */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out = Dbwatch[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbnwatch -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n = 0; n < Dbnwatch; ++n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbwatch[n] = Dbwatch[n+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbwatch[Dbnwatch] = addr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dbnwatch += 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return out;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dbalign(Vmalloc_t* vm, size_t size, size_t align)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* dbalign(vm, size, align)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vm;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t align;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmuchar_t* data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg size_t s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg char* file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg int line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Void_t* func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg Vmdata_t* vd = vm->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin reg int inuse;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SETINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VMFLF(vm,file,line,func);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(size <= 0 || align <= 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ISLOCK(vd,0) )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(Void_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SETLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((s = ROUND(size,ALIGN) + DB_EXTRA) < sizeof(Body_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = sizeof(Body_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(data = (Vmuchar_t*)KPVALIGN(vm,s,align,(*(Vmbest->alignf)))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin data += DB_HEAD;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbsetinfo(data,size,file,line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((vd->mode&VM_TRACE) && _Vmtrace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { vm->file = file; vm->line = line; vm->func = func;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,NIL(Vmuchar_t*),data,size,align);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CLRLOCK(vd,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ANNOUNCE(0, vm, VM_ALLOC, (Void_t*)data, vm->disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin CLRINUSE(vd, inuse);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (Void_t*)data;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner/* print statistics of region vm. If vm is NULL, use Vmregion */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#if __STD_C
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerssize_t vmdbstat(Vmalloc_t* vm)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerssize_t vmdbstat(vm)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. FaulknerVmalloc_t* vm;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#endif
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{ Vmstat_t st;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner char buf[1024], *bufp;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner vmstat(vm ? vm : Vmregion, &st);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = buf;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, "n_busy", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_busy,-1), ',');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, " s_busy", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.s_busy),-1), '\n');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, "n_free", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_free,-1), ',');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, " s_free", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.s_free),-1), '\n');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, "m_busy", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.m_busy),-1), ',');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, " m_free", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.m_free),-1), '\n');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, "n_segment", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_seg,-1), ',');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, " extent", '=');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.extent),-1), '\n');
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *bufp = 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner write(Dbfd, buf, strlen(buf));
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return strlen(buf);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Vmethod_t _Vmdebug =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dballoc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbresize,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbfree,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbaddr,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbsize,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbcompact,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dbalign,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin VM_MTDEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__DEFINE__(Vmethod_t*,Vmdebug,&_Vmdebug);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef NoF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinNoF(vmdebug)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif