diff options
Diffstat (limited to 'usr/src/lib/libast/common/vmalloc/vmdebug.c')
-rw-r--r-- | usr/src/lib/libast/common/vmalloc/vmdebug.c | 798 |
1 files changed, 0 insertions, 798 deletions
diff --git a/usr/src/lib/libast/common/vmalloc/vmdebug.c b/usr/src/lib/libast/common/vmalloc/vmdebug.c deleted file mode 100644 index 3cb1e3963e..0000000000 --- a/usr/src/lib/libast/common/vmalloc/vmdebug.c +++ /dev/null @@ -1,798 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1985-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* Phong Vo <kpv@research.att.com> * -* * -***********************************************************************/ -#if defined(_UWIN) && defined(_BLD_ast) - -void _STUB_vmdebug(){} - -#else - -#include "vmhdr.h" - -/* Method to help with debugging. This does rigorous checks on -** addresses and arena integrity. -** -** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94. -*/ - -/* structure to keep track of file names */ -typedef struct _dbfile_s Dbfile_t; -struct _dbfile_s -{ Dbfile_t* next; - char file[1]; -}; -static Dbfile_t* Dbfile; - -/* global watch list */ -#define S_WATCH 32 -static int Dbnwatch; -static Void_t* Dbwatch[S_WATCH]; - -/* types of warnings reported by dbwarn() */ -#define DB_CHECK 0 -#define DB_ALLOC 1 -#define DB_FREE 2 -#define DB_RESIZE 3 -#define DB_WATCH 4 -#define DB_RESIZED 5 - -#define LONGV(x) ((Vmulong_t)(x)) - -static int Dbinit = 0; -#define DBINIT() (Dbinit ? 0 : (dbinit(), Dbinit=1) ) -static void dbinit() -{ int fd; - if((fd = vmtrace(-1)) >= 0) - vmtrace(fd); -} - -static int Dbfd = 2; /* default warning file descriptor */ -#if __STD_C -int vmdebug(int fd) -#else -int vmdebug(fd) -int fd; -#endif -{ - int old = Dbfd; - Dbfd = fd; - return old; -} - -/* just an entry point to make it easy to set break point */ -#if __STD_C -static void vmdbwarn(Vmalloc_t* vm, char* mesg, int n) -#else -static void vmdbwarn(vm, mesg, n) -Vmalloc_t* vm; -char* mesg; -int n; -#endif -{ - reg Vmdata_t* vd = vm->data; - - write(Dbfd,mesg,n); - if(vd->mode&VM_DBABORT) - abort(); -} - -/* issue a warning of some type */ -#if __STD_C -static void dbwarn(Vmalloc_t* vm, Void_t* data, int where, - const char* file, int line, const Void_t* func, int type) -#else -static void dbwarn(vm, data, where, file, line, func, type) -Vmalloc_t* vm; /* region holding the block */ -Void_t* data; /* data block */ -int where; /* byte that was corrupted */ -const char* file; /* file where call originates */ -int line; /* line number of call */ -const Void_t* func; /* function called from */ -int type; /* operation being done */ -#endif -{ - char buf[1024], *bufp, *endbuf, *s; -#define SLOP 64 /* enough for a message and an int */ - - DBINIT(); - - bufp = buf; - endbuf = buf + sizeof(buf); - - if(type == DB_ALLOC) - bufp = (*_Vmstrcpy)(bufp, "alloc error", ':'); - else if(type == DB_FREE) - bufp = (*_Vmstrcpy)(bufp, "free error", ':'); - else if(type == DB_RESIZE) - bufp = (*_Vmstrcpy)(bufp, "resize error", ':'); - else if(type == DB_CHECK) - bufp = (*_Vmstrcpy)(bufp, "corrupted data", ':'); - else if(type == DB_WATCH) - bufp = (*_Vmstrcpy)(bufp, "alert", ':'); - - /* region info */ - bufp = (*_Vmstrcpy)(bufp, "region", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(vm), 0), ':'); - - if(data) - { bufp = (*_Vmstrcpy)(bufp,"block",'='); - bufp = (*_Vmstrcpy)(bufp,(*_Vmitoa)(VLONG(data),0),':'); - } - - if(!data) - { if(where == DB_ALLOC) - bufp = (*_Vmstrcpy)(bufp, "can't get memory", ':'); - else bufp = (*_Vmstrcpy)(bufp, "region is locked", ':'); - } - else if(type == DB_FREE || type == DB_RESIZE) - { if(where == 0) - bufp = (*_Vmstrcpy)(bufp, "unallocated block", ':'); - else bufp = (*_Vmstrcpy)(bufp, "already freed", ':'); - } - else if(type == DB_WATCH) - { bufp = (*_Vmstrcpy)(bufp, "size", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(DBSIZE(data),-1), ':'); - if(where == DB_ALLOC) - bufp = (*_Vmstrcpy)(bufp,"just allocated", ':'); - else if(where == DB_FREE) - bufp = (*_Vmstrcpy)(bufp,"being freed", ':'); - else if(where == DB_RESIZE) - bufp = (*_Vmstrcpy)(bufp,"being resized", ':'); - else if(where == DB_RESIZED) - bufp = (*_Vmstrcpy)(bufp,"just resized", ':'); - } - else if(type == DB_CHECK) - { bufp = (*_Vmstrcpy)(bufp, "bad byte at", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(LONGV(where),-1), ':'); - if((s = DBFILE(data)) && (bufp + strlen(s) + SLOP) < endbuf) - { bufp = (*_Vmstrcpy)(bufp,"allocated at", '='); - bufp = (*_Vmstrcpy)(bufp, s, ','); - bufp = (*_Vmstrcpy)(bufp,(*_Vmitoa)(LONGV(DBLINE(data)),-1),':'); - } - } - - /* location where offending call originates from */ - if(file && file[0] && line > 0 && (bufp + strlen(file) + SLOP) < endbuf) - { bufp = (*_Vmstrcpy)(bufp, "detected at", '='); - bufp = (*_Vmstrcpy)(bufp, file, ','); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(LONGV(line),-1), ','); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(func),-1), ':'); - } - - *(bufp - 1) = '\n'; - *bufp = '\0'; - - vmdbwarn(vm,buf,(bufp-buf)); -} - -/* check for watched address and issue warnings */ -#if __STD_C -static void dbwatch(Vmalloc_t* vm, Void_t* data, - const char* file, int line, const Void_t* func, int type) -#else -static void dbwatch(vm, data, file, line, func, type) -Vmalloc_t* vm; -Void_t* data; -const char* file; -int line; -const Void_t* func; -int type; -#endif -{ - reg int n; - - for(n = Dbnwatch; n >= 0; --n) - { if(Dbwatch[n] == data) - { dbwarn(vm,data,type,file,line,func,DB_WATCH); - return; - } - } -} - -/* record information about the block */ -#if __STD_C -static void dbsetinfo(Vmuchar_t* data, size_t size, const char* file, int line) -#else -static void dbsetinfo(data, size, file, line) -Vmuchar_t* data; /* real address not the one from Vmbest */ -size_t size; /* the actual requested size */ -const char* file; /* file where the request came from */ -int line; /* and line number */ -#endif -{ - reg Vmuchar_t *begp, *endp; - reg Dbfile_t *last, *db; - - DBINIT(); - - /* find the file structure */ - if(!file || !file[0]) - db = NIL(Dbfile_t*); - else - { for(last = NIL(Dbfile_t*), db = Dbfile; db; last = db, db = db->next) - if(strcmp(db->file,file) == 0) - break; - if(!db) - { db = (Dbfile_t*)vmalloc(Vmheap,sizeof(Dbfile_t)+strlen(file)); - if(db) - { (*_Vmstrcpy)(db->file,file,0); - db->next = Dbfile; - Dbfile = db->next; - } - } - else if(last) /* move-to-front heuristic */ - { last->next = db->next; - db->next = Dbfile; - Dbfile = db->next; - } - } - - DBSETFL(data,(db ? db->file : NIL(char*)),line); - DBSIZE(data) = size; - DBSEG(data) = SEG(DBBLOCK(data)); - - DBHEAD(data,begp,endp); - while(begp < endp) - *begp++ = DB_MAGIC; - DBTAIL(data,begp,endp); - while(begp < endp) - *begp++ = DB_MAGIC; -} - -/* Check to see if an address is in some data block of a region. -** This returns -(offset+1) if block is already freed, +(offset+1) -** if block is live, 0 if no match. -*/ -#if __STD_C -static long dbaddr(Vmalloc_t* vm, Void_t* addr) -#else -static long dbaddr(vm, addr) -Vmalloc_t* vm; -Void_t* addr; -#endif -{ - reg Block_t *b, *endb; - reg Seg_t* seg; - reg Vmuchar_t* data; - reg long offset = -1L; - reg Vmdata_t* vd = vm->data; - reg int local, inuse; - - SETINUSE(vd, inuse); - GETLOCAL(vd,local); - if(ISLOCK(vd,local) || !addr) - { CLRINUSE(vd, inuse); - return -1L; - } - SETLOCK(vd,local); - - b = endb = NIL(Block_t*); - for(seg = vd->seg; seg; seg = seg->next) - { b = SEGBLOCK(seg); - endb = (Block_t*)(seg->baddr - sizeof(Head_t)); - if((Vmuchar_t*)addr > (Vmuchar_t*)b && - (Vmuchar_t*)addr < (Vmuchar_t*)endb) - break; - } - if(!seg) - goto done; - - if(local) /* must be vmfree or vmresize checking address */ - { if(DBSEG(addr) == seg) - { b = DBBLOCK(addr); - if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) ) - offset = 0; - else offset = -2L; - } - goto done; - } - - while(b < endb) - { data = (Vmuchar_t*)DATA(b); - if((Vmuchar_t*)addr >= data && (Vmuchar_t*)addr < data+SIZE(b)) - { if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) ) - { data = DB2DEBUG(data); - if((Vmuchar_t*)addr >= data && - (Vmuchar_t*)addr < data+DBSIZE(data)) - offset = (Vmuchar_t*)addr - data; - } - goto done; - } - - b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) ); - } - -done: - CLRLOCK(vd,local); - CLRINUSE(vd, inuse); - return offset; -} - - -#if __STD_C -static long dbsize(Vmalloc_t* vm, Void_t* addr) -#else -static long dbsize(vm, addr) -Vmalloc_t* vm; -Void_t* addr; -#endif -{ - reg Block_t *b, *endb; - reg Seg_t* seg; - reg long size; - reg Vmdata_t* vd = vm->data; - reg int inuse; - - SETINUSE(vd, inuse); - if(ISLOCK(vd,0)) - { CLRINUSE(vd, inuse); - return -1L; - } - SETLOCK(vd,0); - - size = -1L; - for(seg = vd->seg; seg; seg = seg->next) - { b = SEGBLOCK(seg); - endb = (Block_t*)(seg->baddr - sizeof(Head_t)); - if((Vmuchar_t*)addr <= (Vmuchar_t*)b || - (Vmuchar_t*)addr >= (Vmuchar_t*)endb) - continue; - while(b < endb) - { if(addr == (Void_t*)DB2DEBUG(DATA(b))) - { if(ISBUSY(SIZE(b)) && !ISJUNK(SIZE(b)) ) - size = (long)DBSIZE(addr); - goto done; - } - - b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) ); - } - } -done: - CLRLOCK(vd,0); - CLRINUSE(vd, inuse); - return size; -} - -#if __STD_C -static Void_t* dballoc(Vmalloc_t* vm, size_t size) -#else -static Void_t* dballoc(vm, size) -Vmalloc_t* vm; -size_t size; -#endif -{ - reg size_t s; - reg Vmuchar_t* data; - reg char* file; - reg int line; - reg Void_t* func; - reg Vmdata_t* vd = vm->data; - reg int inuse; - - SETINUSE(vd, inuse); - VMFLF(vm,file,line,func); - - if(ISLOCK(vd,0) ) - { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_ALLOC); - CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - SETLOCK(vd,0); - - if(vd->mode&VM_DBCHECK) - vmdbcheck(vm); - - s = ROUND(size,ALIGN) + DB_EXTRA; - if(s < sizeof(Body_t)) /* no tiny blocks during Vmdebug */ - s = sizeof(Body_t); - - if(!(data = (Vmuchar_t*)KPVALLOC(vm,s,(*(Vmbest->allocf))) ) ) - { dbwarn(vm,NIL(Vmuchar_t*),DB_ALLOC,file,line,func,DB_ALLOC); - goto done; - } - - data = DB2DEBUG(data); - dbsetinfo(data,size,file,line); - - if((vd->mode&VM_TRACE) && _Vmtrace) - { vm->file = file; vm->line = line; vm->func = func; - (*_Vmtrace)(vm,NIL(Vmuchar_t*),data,size,0); - } - - if(Dbnwatch > 0 ) - dbwatch(vm,data,file,line,func,DB_ALLOC); - -done: - CLRLOCK(vd,0); - ANNOUNCE(0, vm, VM_ALLOC, (Void_t*)data, vm->disc); - CLRINUSE(vd, inuse); - return (Void_t*)data; -} - - -#if __STD_C -static int dbfree(Vmalloc_t* vm, Void_t* data ) -#else -static int dbfree(vm, data ) -Vmalloc_t* vm; -Void_t* data; -#endif -{ - char* file; - int line; - Void_t* func; - reg long offset; - reg int rv, *ip, *endip; - reg Vmdata_t* vd = vm->data; - reg int inuse; - - SETINUSE(vd, inuse); - VMFLF(vm,file,line,func); - - if(!data) - { CLRINUSE(vd, inuse); - return 0; - } - - if(ISLOCK(vd,0) ) - { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_FREE); - CLRINUSE(vd, inuse); - return -1; - } - SETLOCK(vd,0); - - if(vd->mode&VM_DBCHECK) - vmdbcheck(vm); - - if((offset = KPVADDR(vm,data,dbaddr)) != 0) - { dbwarn(vm,(Vmuchar_t*)data,offset == -1L ? 0 : 1,file,line,func,DB_FREE); - if(vm->disc->exceptf) - (void)(*vm->disc->exceptf)(vm,VM_BADADDR,data,vm->disc); - CLRLOCK(vd,0); - CLRINUSE(vd, inuse); - return -1; - } - - if(Dbnwatch > 0) - dbwatch(vm,data,file,line,func,DB_FREE); - - if((vd->mode&VM_TRACE) && _Vmtrace) - { vm->file = file; vm->line = line; vm->func = func; - (*_Vmtrace)(vm,(Vmuchar_t*)data,NIL(Vmuchar_t*),DBSIZE(data),0); - } - - /* clear free space */ - ip = (int*)data; - endip = ip + (DBSIZE(data)+sizeof(int)-1)/sizeof(int); - while(ip < endip) - *ip++ = 0; - - rv = KPVFREE((vm), (Void_t*)DB2BEST(data), (*Vmbest->freef)); - CLRLOCK(vd,0); - ANNOUNCE(0, vm, VM_FREE, data, vm->disc); - CLRINUSE(vd, inuse); - return rv; -} - -/* Resizing an existing block */ -#if __STD_C -static Void_t* dbresize(Vmalloc_t* vm, Void_t* addr, reg size_t size, int type) -#else -static Void_t* dbresize(vm,addr,size,type) -Vmalloc_t* vm; /* region allocating from */ -Void_t* addr; /* old block of data */ -reg size_t size; /* new size */ -int type; /* !=0 for movable, >0 for copy */ -#endif -{ - reg Vmuchar_t* data; - reg size_t s, oldsize; - reg long offset; - char *file, *oldfile; - int line, oldline; - Void_t* func; - reg Vmdata_t* vd = vm->data; - reg int inuse; - - SETINUSE(vd, inuse); - if(!addr) - { oldsize = 0; - data = (Vmuchar_t*)dballoc(vm,size); - goto done; - } - if(size == 0) - { (void)dbfree(vm,addr); - CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - - VMFLF(vm,file,line,func); - - if(ISLOCK(vd,0) ) - { dbwarn(vm,NIL(Vmuchar_t*),0,file,line,func,DB_RESIZE); - CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - SETLOCK(vd,0); - - if(vd->mode&VM_DBCHECK) - vmdbcheck(vm); - - if((offset = KPVADDR(vm,addr,dbaddr)) != 0) - { dbwarn(vm,(Vmuchar_t*)addr,offset == -1L ? 0 : 1,file,line,func,DB_RESIZE); - if(vm->disc->exceptf) - (void)(*vm->disc->exceptf)(vm,VM_BADADDR,addr,vm->disc); - CLRLOCK(vd,0); - CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - - if(Dbnwatch > 0) - dbwatch(vm,addr,file,line,func,DB_RESIZE); - - /* Vmbest data block */ - data = DB2BEST(addr); - oldsize = DBSIZE(addr); - oldfile = DBFILE(addr); - oldline = DBLINE(addr); - - /* do the resize */ - s = ROUND(size,ALIGN) + DB_EXTRA; - if(s < sizeof(Body_t)) - s = sizeof(Body_t); - data = (Vmuchar_t*)KPVRESIZE(vm,(Void_t*)data,s, - (type&~VM_RSZERO),(*(Vmbest->resizef)) ); - if(!data) /* failed, reset data for old block */ - { dbwarn(vm,NIL(Vmuchar_t*),DB_ALLOC,file,line,func,DB_RESIZE); - dbsetinfo((Vmuchar_t*)addr,oldsize,oldfile,oldline); - } - else - { data = DB2DEBUG(data); - dbsetinfo(data,size,file,line); - - if((vd->mode&VM_TRACE) && _Vmtrace) - { vm->file = file; vm->line = line; - (*_Vmtrace)(vm,(Vmuchar_t*)addr,data,size,0); - } - if(Dbnwatch > 0) - dbwatch(vm,data,file,line,func,DB_RESIZED); - } - - CLRLOCK(vd,0); - ANNOUNCE(0, vm, VM_RESIZE, (Void_t*)data, vm->disc); - -done: if(data && (type&VM_RSZERO) && size > oldsize) - { reg Vmuchar_t *d = data+oldsize, *ed = data+size; - do { *d++ = 0; } while(d < ed); - } - CLRINUSE(vd, inuse); - return (Void_t*)data; -} - -/* compact any residual free space */ -#if __STD_C -static int dbcompact(Vmalloc_t* vm) -#else -static int dbcompact(vm) -Vmalloc_t* vm; -#endif -{ - return (*(Vmbest->compactf))(vm); -} - -/* check for memory overwrites over all live blocks */ -#if __STD_C -int vmdbcheck(Vmalloc_t* vm) -#else -int vmdbcheck(vm) -Vmalloc_t* vm; -#endif -{ - reg Block_t *b, *endb; - reg Seg_t* seg; - int rv; - reg Vmdata_t* vd = vm->data; - - /* check the meta-data of this region */ - if(vd->mode & (VM_MTDEBUG|VM_MTBEST|VM_MTPROFILE)) - { if(_vmbestcheck(vd, NIL(Block_t*)) < 0) - return -1; - if(!(vd->mode&VM_MTDEBUG)) - return 0; - } - else return -1; - - rv = 0; - for(seg = vd->seg; seg; seg = seg->next) - { b = SEGBLOCK(seg); - endb = (Block_t*)(seg->baddr - sizeof(Head_t)); - while(b < endb) - { reg Vmuchar_t *data, *begp, *endp; - - if(ISJUNK(SIZE(b)) || !ISBUSY(SIZE(b))) - goto next; - - data = DB2DEBUG(DATA(b)); - if(DBISBAD(data)) /* seen this before */ - { rv += 1; - goto next; - } - - DBHEAD(data,begp,endp); - for(; begp < endp; ++begp) - if(*begp != DB_MAGIC) - goto set_bad; - - DBTAIL(data,begp,endp); - for(; begp < endp; ++begp) - { if(*begp == DB_MAGIC) - continue; - set_bad: - dbwarn(vm,data,begp-data,NIL(char*),0,0,DB_CHECK); - DBSETBAD(data); - rv += 1; - goto next; - } - - next: b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS)); - } - } - - return rv; -} - -/* set/delete an address to watch */ -#if __STD_C -Void_t* vmdbwatch(Void_t* addr) -#else -Void_t* vmdbwatch(addr) -Void_t* addr; /* address to insert */ -#endif -{ - reg int n; - reg Void_t* out; - - out = NIL(Void_t*); - if(!addr) - Dbnwatch = 0; - else - { for(n = Dbnwatch - 1; n >= 0; --n) - if(Dbwatch[n] == addr) - break; - if(n < 0) /* insert */ - { if(Dbnwatch == S_WATCH) - { /* delete left-most */ - out = Dbwatch[0]; - Dbnwatch -= 1; - for(n = 0; n < Dbnwatch; ++n) - Dbwatch[n] = Dbwatch[n+1]; - } - Dbwatch[Dbnwatch] = addr; - Dbnwatch += 1; - } - } - return out; -} - -#if __STD_C -static Void_t* dbalign(Vmalloc_t* vm, size_t size, size_t align) -#else -static Void_t* dbalign(vm, size, align) -Vmalloc_t* vm; -size_t size; -size_t align; -#endif -{ - reg Vmuchar_t* data; - reg size_t s; - reg char* file; - reg int line; - reg Void_t* func; - reg Vmdata_t* vd = vm->data; - reg int inuse; - - SETINUSE(vd, inuse); - VMFLF(vm,file,line,func); - - if(size <= 0 || align <= 0) - { CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - - if(ISLOCK(vd,0) ) - { CLRINUSE(vd, inuse); - return NIL(Void_t*); - } - SETLOCK(vd,0); - - if((s = ROUND(size,ALIGN) + DB_EXTRA) < sizeof(Body_t)) - s = sizeof(Body_t); - - if(!(data = (Vmuchar_t*)KPVALIGN(vm,s,align,(*(Vmbest->alignf)))) ) - goto done; - - data += DB_HEAD; - dbsetinfo(data,size,file,line); - - if((vd->mode&VM_TRACE) && _Vmtrace) - { vm->file = file; vm->line = line; vm->func = func; - (*_Vmtrace)(vm,NIL(Vmuchar_t*),data,size,align); - } - -done: - CLRLOCK(vd,0); - ANNOUNCE(0, vm, VM_ALLOC, (Void_t*)data, vm->disc); - CLRINUSE(vd, inuse); - return (Void_t*)data; -} - -/* print statistics of region vm. If vm is NULL, use Vmregion */ -#if __STD_C -ssize_t vmdbstat(Vmalloc_t* vm) -#else -ssize_t vmdbstat(vm) -Vmalloc_t* vm; -#endif -{ Vmstat_t st; - char buf[1024], *bufp; - - vmstat(vm ? vm : Vmregion, &st); - bufp = buf; - bufp = (*_Vmstrcpy)(bufp, "n_busy", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_busy,-1), ','); - bufp = (*_Vmstrcpy)(bufp, " s_busy", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.s_busy),-1), '\n'); - bufp = (*_Vmstrcpy)(bufp, "n_free", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_free,-1), ','); - bufp = (*_Vmstrcpy)(bufp, " s_free", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.s_free),-1), '\n'); - bufp = (*_Vmstrcpy)(bufp, "m_busy", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.m_busy),-1), ','); - bufp = (*_Vmstrcpy)(bufp, " m_free", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.m_free),-1), '\n'); - bufp = (*_Vmstrcpy)(bufp, "n_segment", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)((Vmulong_t)st.n_seg,-1), ','); - bufp = (*_Vmstrcpy)(bufp, " extent", '='); - bufp = (*_Vmstrcpy)(bufp, (*_Vmitoa)(VLONG(st.extent),-1), '\n'); - *bufp = 0; - write(Dbfd, buf, strlen(buf)); - return strlen(buf); -} - -static Vmethod_t _Vmdebug = -{ - dballoc, - dbresize, - dbfree, - dbaddr, - dbsize, - dbcompact, - dbalign, - VM_MTDEBUG -}; - -__DEFINE__(Vmethod_t*,Vmdebug,&_Vmdebug); - -#ifdef NoF -NoF(vmdebug) -#endif - -#endif |