diff options
Diffstat (limited to 'usr/src/lib/libast/common/vmalloc/malloc.c')
-rw-r--r-- | usr/src/lib/libast/common/vmalloc/malloc.c | 1122 |
1 files changed, 0 insertions, 1122 deletions
diff --git a/usr/src/lib/libast/common/vmalloc/malloc.c b/usr/src/lib/libast/common/vmalloc/malloc.c deleted file mode 100644 index 84f61120ad..0000000000 --- a/usr/src/lib/libast/common/vmalloc/malloc.c +++ /dev/null @@ -1,1122 +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_malloc(){} - -#else - -#if _UWIN - -#define calloc ______calloc -#define _ast_free ______free -#define malloc ______malloc -#define mallinfo ______mallinfo -#define mallopt ______mallopt -#define mstats ______mstats -#define realloc ______realloc - -#define _STDLIB_H_ 1 - -extern int atexit(void(*)(void)); -extern char* getenv(const char*); - -#endif - -#include "vmhdr.h" -#include <errno.h> - -#if _UWIN - -#include <malloc.h> - -#define _map_malloc 1 -#define _mal_alloca 1 - -#undef calloc -#define calloc _ast_calloc -#undef _ast_free -#define free _ast_free -#undef malloc -#define malloc _ast_malloc -#undef mallinfo -typedef struct ______mallinfo Mallinfo_t; -#undef mallopt -#undef mstats -typedef struct ______mstats Mstats_t; -#undef realloc -#define realloc _ast_realloc - -#endif - -#if __STD_C -#define F0(f,t0) f(t0) -#define F1(f,t1,a1) f(t1 a1) -#define F2(f,t1,a1,t2,a2) f(t1 a1, t2 a2) -#else -#define F0(f,t0) f() -#define F1(f,t1,a1) f(a1) t1 a1; -#define F2(f,t1,a1,t2,a2) f(a1, a2) t1 a1; t2 a2; -#endif - -/* - * define _AST_std_malloc=1 to force the standard malloc - * if _map_malloc is also defined then _ast_malloc etc. - * will simply call malloc etc. - */ - -#if !defined(_AST_std_malloc) && __CYGWIN__ -#define _AST_std_malloc 1 -#endif - -/* malloc compatibility functions -** -** These are aware of debugging/profiling and are driven by the -** VMALLOC_OPTIONS environment variable which is a space-separated -** list of [no]name[=value] options: -** -** abort if Vmregion==Vmdebug then VM_DBABORT is set, -** otherwise _BLD_debug enabled assertions abort() -** on failure -** check if Vmregion==Vmbest then the region is checked every op -** method=m sets Vmregion=m if not defined, m (Vm prefix optional) -** may be one of { best debug last profile } -** mmap prefer mmap() over brk() for region allocation -** period=n sets Vmregion=Vmdebug if not defined, if -** Vmregion==Vmdebug the region is checked every n ops -** profile=f sets Vmregion=Vmprofile if not set, if -** Vmregion==Vmprofile then profile info printed to file f -** region if Vmregion==Vmbest then block free verifies -** that the block belongs to the region -** start=n sets Vmregion=Vmdebug if not defined, if -** Vmregion==Vmdebug region checking starts after n ops -** trace=f enables tracing to file f -** warn=f sets Vmregion=Vmdebug if not defined, if -** Vmregion==Vmdebug then warnings printed to file f -** watch=a sets Vmregion=Vmdebug if not defined, if -** Vmregion==Vmdebug then address a is watched -** -** Output files are created if they don't exist. &n and /dev/fd/n name -** the file descriptor n which must be open for writing. The pattern %p -** in a file name is replaced by the process ID. -** -** VMALLOC_OPTIONS combines the features of these previously used env vars: -** { VMDEBUG VMETHOD VMPROFILE VMTRACE } -** -** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94. -*/ - -#if _sys_stat -#include <sys/stat.h> -#endif -#include <fcntl.h> - -#ifdef S_IRUSR -#define CREAT_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) -#else -#define CREAT_MODE 0644 -#endif - -static Vmulong_t _Vmdbstart = 0; -static Vmulong_t _Vmdbcheck = 0; -static Vmulong_t _Vmdbtime = 0; -static int _Vmpffd = -1; - -#if ( !_std_malloc || !_BLD_ast ) && !_AST_std_malloc - -#if !_map_malloc -#undef calloc -#undef cfree -#undef free -#undef mallinfo -#undef malloc -#undef mallopt -#undef memalign -#undef mstats -#undef realloc -#undef valloc -#endif - -#if _WINIX - -#include <ast_windows.h> - -#if _UWIN - -#define VMRECORD(p) _vmrecord(p) -#define VMBLOCK { int _vmblock = _sigblock(); -#define VMUNBLOCK _sigunblock(_vmblock); } - -extern int _sigblock(void); -extern void _sigunblock(int); -extern unsigned long _record[2048]; - -__inline Void_t* _vmrecord(Void_t* p) -{ - register unsigned long v = ((unsigned long)p)>>16; - - _record[v>>5] |= 1<<((v&0x1f)); - return p; -} - -#else - -#define getenv(s) lcl_getenv(s) - -static char* -lcl_getenv(const char* s) -{ - int n; - static char buf[512]; - - if (!(n = GetEnvironmentVariable(s, buf, sizeof(buf))) || n > sizeof(buf)) - return 0; - return buf; -} - -#endif /* _UWIN */ - -#endif /* _WINIX */ - -#ifndef VMRECORD -#define VMRECORD(p) (p) -#define VMBLOCK -#define VMUNBLOCK -#endif - -#if defined(__EXPORT__) -#define extern extern __EXPORT__ -#endif - -static int _Vmflinit = 0; -#define VMFLINIT() \ - { if(!_Vmflinit) vmflinit(); \ - if(_Vmdbcheck) \ - { if(_Vmdbtime < _Vmdbstart) _Vmdbtime += 1; \ - else if((_Vmdbtime += 1) < _Vmdbstart) _Vmdbtime = _Vmdbstart; \ - if(_Vmdbtime >= _Vmdbstart && (_Vmdbtime % _Vmdbcheck) == 0 && \ - Vmregion->meth.meth == VM_MTDEBUG) \ - vmdbcheck(Vmregion); \ - } \ - } - -#if __STD_C -static int vmflinit(void) -#else -static int vmflinit() -#endif -{ - char* file; - int line; - Void_t* func; - - /* this must be done now to avoid any inadvertent recursion (more below) */ - _Vmflinit = 1; - VMFLF(Vmregion,file,line,func); - - /* if getenv() calls malloc(), the options may not affect the eventual region */ - VMOPTIONS(); - - /* reset file and line number to correct values for the call */ - Vmregion->file = file; - Vmregion->line = line; - Vmregion->func = func; - - return 0; -} - -#if __STD_C -extern Void_t* calloc(reg size_t n_obj, reg size_t s_obj) -#else -extern Void_t* calloc(n_obj, s_obj) -reg size_t n_obj; -reg size_t s_obj; -#endif -{ - VMFLINIT(); - return VMRECORD((*Vmregion->meth.resizef)(Vmregion,NIL(Void_t*),n_obj*s_obj,VM_RSZERO)); -} - -#if __STD_C -extern Void_t* malloc(reg size_t size) -#else -extern Void_t* malloc(size) -reg size_t size; -#endif -{ - VMFLINIT(); - return VMRECORD((*Vmregion->meth.allocf)(Vmregion,size)); -} - -#if __STD_C -extern Void_t* realloc(reg Void_t* data, reg size_t size) -#else -extern Void_t* realloc(data,size) -reg Void_t* data; /* block to be reallocated */ -reg size_t size; /* new size */ -#endif -{ -#if USE_NATIVE -#undef realloc -#if __STD_C - extern Void_t* realloc(Void_t*, size_t); -#else - extern Void_t* realloc(); -#endif -#endif - - VMFLINIT(); - -#if _PACKAGE_ast - if(data && Vmregion->meth.meth != VM_MTDEBUG && -#if !USE_NATIVE - !(Vmregion->data->mode&VM_TRUST) && -#endif - (*Vmregion->meth.addrf)(Vmregion,data) != 0 ) - { -#if USE_NATIVE - return realloc(data, size); -#else - Void_t* newdata; - if((newdata = (*Vmregion->meth.allocf)(Vmregion,size)) ) - memcpy(newdata,data,size); - return VMRECORD(newdata); -#endif - } -#endif - -#if USE_NATIVE - { Void_t* newdata; - if (newdata = (*Vmregion->meth.resizef)(Vmregion,data,size,VM_RSCOPY|VM_RSMOVE)) - return newdata; - return VMRECORD(realloc(data, size)); - } -#else - return VMRECORD((*Vmregion->meth.resizef)(Vmregion,data,size,VM_RSCOPY|VM_RSMOVE)); -#endif -} - -#if __STD_C -extern void free(reg Void_t* data) -#else -extern void free(data) -reg Void_t* data; -#endif -{ -#if USE_NATIVE -#undef free -#if __STD_C - extern void free(Void_t*); -#else - extern void free(); -#endif -#endif - - VMFLINIT(); - -#if _PACKAGE_ast - if(data && Vmregion->meth.meth != VM_MTDEBUG && -#if !USE_NATIVE - !(Vmregion->data->mode&VM_TRUST) && -#endif - (*Vmregion->meth.addrf)(Vmregion,data) != 0) - { -#if USE_NATIVE - free(data); -#endif - return; - } -#endif - -#if USE_NATIVE - if ((*Vmregion->meth.freef)(Vmregion,data) != 0) - free(data); -#else - (void)(*Vmregion->meth.freef)(Vmregion,data); -#endif -} - -#if __STD_C -extern void cfree(reg Void_t* data) -#else -extern void cfree(data) -reg Void_t* data; -#endif -{ - free(data); -} - -#if __STD_C -extern Void_t* memalign(reg size_t align, reg size_t size) -#else -extern Void_t* memalign(align, size) -reg size_t align; -reg size_t size; -#endif -{ - Void_t* addr; - - VMFLINIT(); - VMBLOCK - addr = VMRECORD((*Vmregion->meth.alignf)(Vmregion,size,align)); - VMUNBLOCK - return addr; -} - -#if __STD_C -extern int posix_memalign(reg Void_t **memptr, reg size_t align, reg size_t size) -#else -extern int posix_memalign(memptr, align, size) -reg Void_t** memptr; -reg size_t align; -reg size_t size; -#endif -{ - Void_t *mem; - - if(align == 0 || (align%sizeof(Void_t*)) != 0 || ((align-1)&align) != 0 ) - return EINVAL; - - if(!(mem = memalign(align, size)) ) - return ENOMEM; - - *memptr = mem; - return 0; -} - -#if __STD_C -extern Void_t* valloc(reg size_t size) -#else -extern Void_t* valloc(size) -reg size_t size; -#endif -{ - VMFLINIT(); - GETPAGESIZE(_Vmpagesize); - return VMRECORD((*Vmregion->meth.alignf)(Vmregion,size,_Vmpagesize)); -} - -#if __STD_C -extern Void_t* pvalloc(reg size_t size) -#else -extern Void_t* pvalloc(size) -reg size_t size; -#endif -{ - VMFLINIT(); - GETPAGESIZE(_Vmpagesize); - return VMRECORD((*Vmregion->meth.alignf)(Vmregion,ROUND(size,_Vmpagesize),_Vmpagesize)); -} - -#if !_PACKAGE_ast -#if __STD_C -char* strdup(const char* s) -#else -char* strdup(s) -char* s; -#endif -{ - char *ns; - size_t n; - - if(!s) - return NIL(char*); - else - { n = strlen(s); - if((ns = malloc(n+1)) ) - memcpy(ns,s,n+1); - return ns; - } -} -#endif /* _PACKAGE_ast */ - -#if !_lib_alloca || _mal_alloca -#ifndef _stk_down -#define _stk_down 0 -#endif -typedef struct _alloca_s Alloca_t; -union _alloca_u -{ struct - { char* addr; - Alloca_t* next; - } head; - char array[ALIGN]; -}; -struct _alloca_s -{ union _alloca_u head; - Vmuchar_t data[1]; -}; - -#if __STD_C -extern Void_t* alloca(size_t size) -#else -extern Void_t* alloca(size) -size_t size; -#endif -{ char array[ALIGN]; - char* file; - int line; - Void_t* func; - reg Alloca_t* f; - static Alloca_t* Frame; - - VMFLINIT(); - VMFLF(Vmregion,file,line,func); - while(Frame) - { if(( _stk_down && &array[0] > Frame->head.head.addr) || - (!_stk_down && &array[0] < Frame->head.head.addr) ) - { f = Frame; - Frame = f->head.head.next; - (void)(*Vmregion->meth.freef)(Vmregion,f); - } - else break; - } - - Vmregion->file = file; - Vmregion->line = line; - Vmregion->func = func; - f = (Alloca_t*)(*Vmregion->meth.allocf)(Vmregion,size+sizeof(Alloca_t)-1); - - f->head.head.addr = &array[0]; - f->head.head.next = Frame; - Frame = f; - - return (Void_t*)f->data; -} -#endif /*!_lib_alloca || _mal_alloca*/ - -#if _map_malloc - -/* not sure of all the implications -- 0 is conservative for now */ -#define USE_NATIVE 0 /* native free/realloc on non-vmalloc ptrs */ - -#else - -/* intercept _* __* __libc_* variants */ - -#if __lib__malloc -extern Void_t* F2(_calloc, size_t,n, size_t,m) { return calloc(n, m); } -extern Void_t F1(_cfree, Void_t*,p) { free(p); } -extern Void_t F1(_free, Void_t*,p) { free(p); } -extern Void_t* F1(_malloc, size_t,n) { return malloc(n); } -#if _lib_memalign -extern Void_t* F2(_memalign, size_t,a, size_t,n) { return memalign(a, n); } -#endif -#if _lib_pvalloc -extern Void_t* F1(_pvalloc, size_t,n) { return pvalloc(n); } -#endif -extern Void_t* F2(_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } -#if _lib_valloc -extern Void_t* F1(_valloc, size_t,n) { return valloc(n); } -#endif -#endif - -#if _lib___malloc -extern Void_t* F2(__calloc, size_t,n, size_t,m) { return calloc(n, m); } -extern Void_t F1(__cfree, Void_t*,p) { free(p); } -extern Void_t F1(__free, Void_t*,p) { free(p); } -extern Void_t* F1(__malloc, size_t,n) { return malloc(n); } -#if _lib_memalign -extern Void_t* F2(__memalign, size_t,a, size_t,n) { return memalign(a, n); } -#endif -#if _lib_pvalloc -extern Void_t* F1(__pvalloc, size_t,n) { return pvalloc(n); } -#endif -extern Void_t* F2(__realloc, Void_t*,p, size_t,n) { return realloc(p, n); } -#if _lib_valloc -extern Void_t* F1(__valloc, size_t,n) { return valloc(n); } -#endif -#endif - -#if _lib___libc_malloc -extern Void_t* F2(__libc_calloc, size_t,n, size_t,m) { return calloc(n, m); } -extern Void_t F1(__libc_cfree, Void_t*,p) { free(p); } -extern Void_t F1(__libc_free, Void_t*,p) { free(p); } -extern Void_t* F1(__libc_malloc, size_t,n) { return malloc(n); } -#if _lib_memalign -extern Void_t* F2(__libc_memalign, size_t,a, size_t,n) { return memalign(a, n); } -#endif -#if _lib_pvalloc -extern Void_t* F1(__libc_pvalloc, size_t,n) { return pvalloc(n); } -#endif -extern Void_t* F2(__libc_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } -#if _lib_valloc -extern Void_t* F1(__libc_valloc, size_t,n) { return valloc(n); } -#endif -#endif - -#endif /* _map_malloc */ - -#undef extern - -#if _hdr_malloc /* need the mallint interface for statistics, etc. */ - -#undef calloc -#define calloc ______calloc -#undef cfree -#define cfree ______cfree -#undef free -#define free ______free -#undef malloc -#define malloc ______malloc -#undef pvalloc -#define pvalloc ______pvalloc -#undef realloc -#define realloc ______realloc -#undef valloc -#define valloc ______valloc - -#if !_UWIN - -#include <malloc.h> - -typedef struct mallinfo Mallinfo_t; -typedef struct mstats Mstats_t; - -#endif - -#if defined(__EXPORT__) -#define extern __EXPORT__ -#endif - -#if _lib_mallopt -#if __STD_C -extern int mallopt(int cmd, int value) -#else -extern int mallopt(cmd, value) -int cmd; -int value; -#endif -{ - VMFLINIT(); - return 0; -} -#endif /*_lib_mallopt*/ - -#if _lib_mallinfo && _mem_arena_mallinfo -#if __STD_C -extern Mallinfo_t mallinfo(void) -#else -extern Mallinfo_t mallinfo() -#endif -{ - Vmstat_t sb; - Mallinfo_t mi; - - VMFLINIT(); - memset(&mi,0,sizeof(mi)); - if(vmstat(Vmregion,&sb) >= 0) - { mi.arena = sb.extent; - mi.ordblks = sb.n_busy+sb.n_free; - mi.uordblks = sb.s_busy; - mi.fordblks = sb.s_free; - } - return mi; -} -#endif /* _lib_mallinfo */ - -#if _lib_mstats && _mem_bytes_total_mstats -#if __STD_C -extern Mstats_t mstats(void) -#else -extern Mstats_t mstats() -#endif -{ - Vmstat_t sb; - Mstats_t ms; - - VMFLINIT(); - memset(&ms,0,sizeof(ms)); - if(vmstat(Vmregion,&sb) >= 0) - { ms.bytes_total = sb.extent; - ms.chunks_used = sb.n_busy; - ms.bytes_used = sb.s_busy; - ms.chunks_free = sb.n_free; - ms.bytes_free = sb.s_free; - } - return ms; -} -#endif /*_lib_mstats*/ - -#undef extern - -#endif/*_hdr_malloc*/ - -#else - -/* - * even though there is no malloc override, still provide - * _ast_* counterparts for object compatibility - */ - -#undef calloc -extern Void_t* calloc _ARG_((size_t, size_t)); - -#undef cfree -extern void cfree _ARG_((Void_t*)); - -#undef free -extern void free _ARG_((Void_t*)); - -#undef malloc -extern Void_t* malloc _ARG_((size_t)); - -#if _lib_memalign -#undef memalign -extern Void_t* memalign _ARG_((size_t, size_t)); -#endif - -#if _lib_pvalloc -#undef pvalloc -extern Void_t* pvalloc _ARG_((size_t)); -#endif - -#undef realloc -extern Void_t* realloc _ARG_((Void_t*, size_t)); - -#if _lib_valloc -#undef valloc -extern Void_t* valloc _ARG_((size_t)); -#endif - -#if defined(__EXPORT__) -#define extern __EXPORT__ -#endif - -extern Void_t* F2(_ast_calloc, size_t,n, size_t,m) { return calloc(n, m); } -extern Void_t F1(_ast_cfree, Void_t*,p) { free(p); } -extern Void_t F1(_ast_free, Void_t*,p) { free(p); } -extern Void_t* F1(_ast_malloc, size_t,n) { return malloc(n); } -#if _lib_memalign -extern Void_t* F2(_ast_memalign, size_t,a, size_t,n) { return memalign(a, n); } -#endif -#if _lib_pvalloc -extern Void_t* F1(_ast_pvalloc, size_t,n) { return pvalloc(n); } -#endif -extern Void_t* F2(_ast_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } -#if _lib_valloc -extern Void_t* F1(_ast_valloc, size_t,n) { return valloc(n); } -#endif - -#undef extern - -#if _hdr_malloc - -#undef mallinfo -#undef mallopt -#undef mstats - -#define calloc ______calloc -#define cfree ______cfree -#define free ______free -#define malloc ______malloc -#define pvalloc ______pvalloc -#define realloc ______realloc -#define valloc ______valloc - -#if !_UWIN - -#include <malloc.h> - -typedef struct mallinfo Mallinfo_t; -typedef struct mstats Mstats_t; - -#endif - -#if defined(__EXPORT__) -#define extern __EXPORT__ -#endif - -#if _lib_mallopt -extern int F2(_ast_mallopt, int,cmd, int,value) { return mallopt(cmd, value); } -#endif - -#if _lib_mallinfo && _mem_arena_mallinfo -extern Mallinfo_t F0(_ast_mallinfo, void) { return mallinfo(); } -#endif - -#if _lib_mstats && _mem_bytes_total_mstats -extern Mstats_t F0(_ast_mstats, void) { return mstats(); } -#endif - -#undef extern - -#endif /*_hdr_malloc*/ - -#endif /*!_std_malloc*/ - -#if __STD_C -static Vmulong_t atou(char** sp) -#else -static Vmulong_t atou(sp) -char** sp; -#endif -{ - char* s = *sp; - Vmulong_t v = 0; - - if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X') ) - { for(s += 2; *s; ++s) - { if(*s >= '0' && *s <= '9') - v = (v << 4) + (*s - '0'); - else if(*s >= 'a' && *s <= 'f') - v = (v << 4) + (*s - 'a') + 10; - else if(*s >= 'A' && *s <= 'F') - v = (v << 4) + (*s - 'A') + 10; - else break; - } - } - else - { for(; *s; ++s) - { if(*s >= '0' && *s <= '9') - v = v*10 + (*s - '0'); - else break; - } - } - - *sp = s; - return v; -} - -#if __STD_C -static char* insertpid(char* begs, char* ends) -#else -static char* insertpid(begs,ends) -char* begs; -char* ends; -#endif -{ int pid; - char* s; - - if((pid = getpid()) < 0) - return NIL(char*); - - s = ends; - do - { if(s == begs) - return NIL(char*); - *--s = '0' + pid%10; - } while((pid /= 10) > 0); - while(s < ends) - *begs++ = *s++; - - return begs; -} - -#if __STD_C -static int createfile(char* file) -#else -static int createfile(file) -char* file; -#endif -{ - char buf[1024]; - char *next, *endb; - int fd; - - next = buf; - endb = buf + sizeof(buf); - while(*file) - { if(*file == '%') - { switch(file[1]) - { - case 'p' : - if(!(next = insertpid(next,endb)) ) - return -1; - file += 2; - break; - default : - goto copy; - } - } - else - { copy: - *next++ = *file++; - } - - if(next >= endb) - return -1; - } - - *next = '\0'; - file = buf; - if (*file == '&' && *(file += 1) || strncmp(file, "/dev/fd/", 8) == 0 && *(file += 8)) - fd = dup((int)atou(&file)); - else if (*file) -#if _PACKAGE_ast - fd = open(file, O_WRONLY|O_CREAT|O_TRUNC, CREAT_MODE); -#else - fd = creat(file, CREAT_MODE); -#endif - else - return -1; -#if _PACKAGE_ast -#ifdef FD_CLOEXEC - if (fd >= 0) - fcntl(fd, F_SETFD, FD_CLOEXEC); -#endif -#endif - return fd; -} - -#if __STD_C -static void pfprint(void) -#else -static void pfprint() -#endif -{ - if(Vmregion->meth.meth == VM_MTPROFILE) - vmprofile(Vmregion,_Vmpffd); -} - -/* - * initialize runtime options from the VMALLOC_OPTIONS env var - */ - -#define COPY(t,e,f) while ((*t = *f++) && t < e) t++ - -#if __STD_C -void _vmoptions(void) -#else -void _vmoptions() -#endif -{ - Vmalloc_t* vm = 0; - char* trace = 0; - char* s; - char* t; - char* v; - Vmulong_t n; - int fd; - char buf[1024]; - - _Vmoptions = 1; - t = buf; - v = &buf[sizeof(buf)-1]; - if (s = getenv("VMALLOC_OPTIONS")) - COPY(t, v, s); -#if 1 /* backwards compatibility until 2011 */ - else - { - char* p; - - if (s = getenv("VMDEBUG")) - { - switch (*s++) - { - case 0: - break; - case 'a': - p = " abort"; - COPY(t, v, p); - break; - case 'w': - p = " warn"; - COPY(t, v, p); - break; - case '0': - if (*s-- == 'x') - { - p = " watch="; - COPY(t, v, p); - COPY(t, v, s); - break; - } - /*FALLTHROUGH*/ - default: - p = " period="; - COPY(t, v, p); - COPY(t, v, s); - break; - } - } - if ((s = getenv("VMETHOD")) && *s) - { - p = " method="; - COPY(t, v, p); - COPY(t, v, s); - } - if ((s = getenv("VMPROFILE")) && *s) - { - p = " profile="; - COPY(t, v, p); - COPY(t, v, s); - } - if ((s = getenv("VMTRACE")) && *s) - { - p = " trace="; - COPY(t, v, p); - COPY(t, v, s); - } - } -#endif - if (t > buf) - { - *t = 0; - s = buf; - for (;;) - { - while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') - s++; - if (!*(t = s)) - break; - v = 0; - while (*s) - if (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') - { - *s++ = 0; - break; - } - else if (!v && *s == '=') - { - *s++ = 0; - if (!*(v = s)) - v = 0; - } - else - s++; - if (t[0] == 'n' && t[1] == 'o') - continue; - switch (t[0]) - { - case 'a': /* abort */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - if (vm && vm->meth.meth == VM_MTDEBUG) - vmset(vm, VM_DBABORT, 1); - else - _Vmassert |= VM_abort; - break; - case 'c': /* check */ - _Vmassert |= VM_check; - break; - case 'm': - switch (t[1]) - { - case 'e': /* method=<method> */ - if (v && !vm) - { - if ((v[0] == 'V' || v[0] == 'v') && (v[1] == 'M' || v[1] == 'm')) - v += 2; - if (strcmp(v, "debug") == 0) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - else if (strcmp(v, "profile") == 0) - vm = vmopen(Vmdcsbrk, Vmprofile, 0); - else if (strcmp(v, "last") == 0) - vm = vmopen(Vmdcsbrk, Vmlast, 0); - else if (strcmp(v, "best") == 0) - vm = Vmheap; - } - break; - case 'm': /* mmap */ -#if _mem_mmap_anon || _mem_mmap_zero - _Vmassert |= VM_mmap; -#endif - break; - } - break; - case 'p': - if (v) - switch (t[1]) - { - case 'e': /* period=<count> */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - if (vm && vm->meth.meth == VM_MTDEBUG) - _Vmdbcheck = atou(&v); - break; - case 'r': /* profile=<path> */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmprofile, 0); - if (v && vm && vm->meth.meth == VM_MTPROFILE) - _Vmpffd = createfile(v); - break; - } - break; - case 'r': /* region */ - _Vmassert |= VM_region; - break; - case 's': /* start=<count> */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - if (v && vm && vm->meth.meth == VM_MTDEBUG) - _Vmdbstart = atou(&v); - break; - case 't': /* trace=<path> */ - trace = v; - break; - case 'w': - if (t[1] == 'a') - switch (t[2]) - { - case 'r': /* warn=<path> */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - if (v && vm && vm->meth.meth == VM_MTDEBUG && (fd = createfile(v)) >= 0) - vmdebug(fd); - break; - case 't': /* watch=<addr> */ - if (!vm) - vm = vmopen(Vmdcsbrk, Vmdebug, 0); - if (v && vm && vm->meth.meth == VM_MTDEBUG && (n = atou(&v)) >= 0) - vmdbwatch((Void_t*)n); - break; - } - break; - } - } - } - - /* slip in the new region now so that malloc() will work fine */ - - if (vm) - { - if (vm->meth.meth == VM_MTDEBUG) - _Vmdbcheck = 1; - Vmregion = vm; - } - - /* enable tracing */ - - if (trace && (fd = createfile(trace)) >= 0) - { - vmset(Vmregion, VM_TRACE, 1); - vmtrace(fd); - } - - /* make sure that profile data is output upon exiting */ - - if (vm && vm->meth.meth == VM_MTPROFILE) - { - if (_Vmpffd < 0) - _Vmpffd = 2; - /* this may wind up calling malloc(), but region is ok now */ - atexit(pfprint); - } - else if (_Vmpffd >= 0) - { - close(_Vmpffd); - _Vmpffd = -1; - } -} - -#endif /*_UWIN*/ |