14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #if defined(_UWIN) && defined(_BLD_ast) 234887Schin 244887Schin void _STUB_malloc(){} 254887Schin 264887Schin #else 274887Schin 284887Schin #if _UWIN 294887Schin 304887Schin #define calloc ______calloc 314887Schin #define _ast_free ______free 324887Schin #define malloc ______malloc 334887Schin #define mallinfo ______mallinfo 344887Schin #define mallopt ______mallopt 354887Schin #define mstats ______mstats 364887Schin #define realloc ______realloc 374887Schin 384887Schin #define _STDLIB_H_ 1 394887Schin 404887Schin extern int atexit(void(*)(void)); 414887Schin extern char* getenv(const char*); 424887Schin 434887Schin #endif 444887Schin 454887Schin #include "vmhdr.h" 4610898Sroland.mainz@nrubsig.org #include <errno.h> 474887Schin 484887Schin #if _UWIN 494887Schin 504887Schin #include <malloc.h> 514887Schin 524887Schin #define _map_malloc 1 534887Schin #define _mal_alloca 1 544887Schin 554887Schin #undef calloc 564887Schin #define calloc _ast_calloc 574887Schin #undef _ast_free 584887Schin #define free _ast_free 594887Schin #undef malloc 604887Schin #define malloc _ast_malloc 614887Schin #undef mallinfo 624887Schin typedef struct ______mallinfo Mallinfo_t; 634887Schin #undef mallopt 644887Schin #undef mstats 654887Schin typedef struct ______mstats Mstats_t; 664887Schin #undef realloc 674887Schin #define realloc _ast_realloc 684887Schin 694887Schin #endif 704887Schin 714887Schin #if __STD_C 724887Schin #define F0(f,t0) f(t0) 734887Schin #define F1(f,t1,a1) f(t1 a1) 744887Schin #define F2(f,t1,a1,t2,a2) f(t1 a1, t2 a2) 754887Schin #else 764887Schin #define F0(f,t0) f() 774887Schin #define F1(f,t1,a1) f(a1) t1 a1; 784887Schin #define F2(f,t1,a1,t2,a2) f(a1, a2) t1 a1; t2 a2; 794887Schin #endif 804887Schin 814887Schin /* 824887Schin * define _AST_std_malloc=1 to force the standard malloc 834887Schin * if _map_malloc is also defined then _ast_malloc etc. 844887Schin * will simply call malloc etc. 854887Schin */ 864887Schin 874887Schin #if !defined(_AST_std_malloc) && __CYGWIN__ 884887Schin #define _AST_std_malloc 1 894887Schin #endif 904887Schin 91*12068SRoger.Faulkner@Oracle.COM /* malloc compatibility functions 92*12068SRoger.Faulkner@Oracle.COM ** 93*12068SRoger.Faulkner@Oracle.COM ** These are aware of debugging/profiling and are driven by the 94*12068SRoger.Faulkner@Oracle.COM ** VMALLOC_OPTIONS environment variable which is a space-separated 95*12068SRoger.Faulkner@Oracle.COM ** list of [no]name[=value] options: 964887Schin ** 97*12068SRoger.Faulkner@Oracle.COM ** abort if Vmregion==Vmdebug then VM_DBABORT is set, 98*12068SRoger.Faulkner@Oracle.COM ** otherwise _BLD_debug enabled assertions abort() 99*12068SRoger.Faulkner@Oracle.COM ** on failure 100*12068SRoger.Faulkner@Oracle.COM ** check if Vmregion==Vmbest then the region is checked every op 101*12068SRoger.Faulkner@Oracle.COM ** method=m sets Vmregion=m if not defined, m (Vm prefix optional) 102*12068SRoger.Faulkner@Oracle.COM ** may be one of { best debug last profile } 103*12068SRoger.Faulkner@Oracle.COM ** mmap prefer mmap() over brk() for region allocation 104*12068SRoger.Faulkner@Oracle.COM ** period=n sets Vmregion=Vmdebug if not defined, if 105*12068SRoger.Faulkner@Oracle.COM ** Vmregion==Vmdebug the region is checked every n ops 106*12068SRoger.Faulkner@Oracle.COM ** profile=f sets Vmregion=Vmprofile if not set, if 107*12068SRoger.Faulkner@Oracle.COM ** Vmregion==Vmprofile then profile info printed to file f 108*12068SRoger.Faulkner@Oracle.COM ** region if Vmregion==Vmbest then block free verifies 109*12068SRoger.Faulkner@Oracle.COM ** that the block belongs to the region 110*12068SRoger.Faulkner@Oracle.COM ** start=n sets Vmregion=Vmdebug if not defined, if 111*12068SRoger.Faulkner@Oracle.COM ** Vmregion==Vmdebug region checking starts after n ops 112*12068SRoger.Faulkner@Oracle.COM ** trace=f enables tracing to file f 113*12068SRoger.Faulkner@Oracle.COM ** warn=f sets Vmregion=Vmdebug if not defined, if 114*12068SRoger.Faulkner@Oracle.COM ** Vmregion==Vmdebug then warnings printed to file f 115*12068SRoger.Faulkner@Oracle.COM ** watch=a sets Vmregion=Vmdebug if not defined, if 116*12068SRoger.Faulkner@Oracle.COM ** Vmregion==Vmdebug then address a is watched 1174887Schin ** 118*12068SRoger.Faulkner@Oracle.COM ** Output files are created if they don't exist. &n and /dev/fd/n name 119*12068SRoger.Faulkner@Oracle.COM ** the file descriptor n which must be open for writing. The pattern %p 120*12068SRoger.Faulkner@Oracle.COM ** in a file name is replaced by the process ID. 121*12068SRoger.Faulkner@Oracle.COM ** 122*12068SRoger.Faulkner@Oracle.COM ** VMALLOC_OPTIONS combines the features of these previously used env vars: 123*12068SRoger.Faulkner@Oracle.COM ** { VMDEBUG VMETHOD VMPROFILE VMTRACE } 1244887Schin ** 1254887Schin ** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94. 1264887Schin */ 1274887Schin 1284887Schin #if _sys_stat 1294887Schin #include <sys/stat.h> 1304887Schin #endif 1314887Schin #include <fcntl.h> 1324887Schin 1334887Schin #ifdef S_IRUSR 1344887Schin #define CREAT_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) 1354887Schin #else 1364887Schin #define CREAT_MODE 0644 1374887Schin #endif 1384887Schin 139*12068SRoger.Faulkner@Oracle.COM static Vmulong_t _Vmdbstart = 0; 140*12068SRoger.Faulkner@Oracle.COM static Vmulong_t _Vmdbcheck = 0; 141*12068SRoger.Faulkner@Oracle.COM static Vmulong_t _Vmdbtime = 0; 142*12068SRoger.Faulkner@Oracle.COM static int _Vmpffd = -1; 143*12068SRoger.Faulkner@Oracle.COM 144*12068SRoger.Faulkner@Oracle.COM #if ( !_std_malloc || !_BLD_ast ) && !_AST_std_malloc 145*12068SRoger.Faulkner@Oracle.COM 1464887Schin #if !_map_malloc 1474887Schin #undef calloc 1484887Schin #undef cfree 1494887Schin #undef free 1504887Schin #undef mallinfo 1514887Schin #undef malloc 1524887Schin #undef mallopt 1534887Schin #undef memalign 1544887Schin #undef mstats 1554887Schin #undef realloc 1564887Schin #undef valloc 1574887Schin #endif 1584887Schin 1594887Schin #if _WINIX 1604887Schin 1614887Schin #include <ast_windows.h> 1624887Schin 1634887Schin #if _UWIN 1644887Schin 1654887Schin #define VMRECORD(p) _vmrecord(p) 1664887Schin #define VMBLOCK { int _vmblock = _sigblock(); 1674887Schin #define VMUNBLOCK _sigunblock(_vmblock); } 1684887Schin 1694887Schin extern int _sigblock(void); 1704887Schin extern void _sigunblock(int); 1714887Schin extern unsigned long _record[2048]; 1724887Schin 1734887Schin __inline Void_t* _vmrecord(Void_t* p) 1744887Schin { 1754887Schin register unsigned long v = ((unsigned long)p)>>16; 1764887Schin 1774887Schin _record[v>>5] |= 1<<((v&0x1f)); 1784887Schin return p; 1794887Schin } 1804887Schin 1814887Schin #else 1824887Schin 1834887Schin #define getenv(s) lcl_getenv(s) 1844887Schin 1854887Schin static char* 1864887Schin lcl_getenv(const char* s) 1874887Schin { 1884887Schin int n; 1894887Schin static char buf[512]; 1904887Schin 1914887Schin if (!(n = GetEnvironmentVariable(s, buf, sizeof(buf))) || n > sizeof(buf)) 1924887Schin return 0; 1934887Schin return buf; 1944887Schin } 1954887Schin 1964887Schin #endif /* _UWIN */ 1974887Schin 1984887Schin #endif /* _WINIX */ 1994887Schin 2004887Schin #ifndef VMRECORD 2014887Schin #define VMRECORD(p) (p) 2024887Schin #define VMBLOCK 2034887Schin #define VMUNBLOCK 2044887Schin #endif 2054887Schin 2064887Schin #if defined(__EXPORT__) 2074887Schin #define extern extern __EXPORT__ 2084887Schin #endif 2094887Schin 2104887Schin static int _Vmflinit = 0; 2114887Schin #define VMFLINIT() \ 2124887Schin { if(!_Vmflinit) vmflinit(); \ 2134887Schin if(_Vmdbcheck) \ 2144887Schin { if(_Vmdbtime < _Vmdbstart) _Vmdbtime += 1; \ 2154887Schin else if((_Vmdbtime += 1) < _Vmdbstart) _Vmdbtime = _Vmdbstart; \ 2164887Schin if(_Vmdbtime >= _Vmdbstart && (_Vmdbtime % _Vmdbcheck) == 0 && \ 2174887Schin Vmregion->meth.meth == VM_MTDEBUG) \ 2184887Schin vmdbcheck(Vmregion); \ 2194887Schin } \ 2204887Schin } 2214887Schin 2224887Schin #if __STD_C 2234887Schin static int vmflinit(void) 2244887Schin #else 2254887Schin static int vmflinit() 2264887Schin #endif 2274887Schin { 2284887Schin char* file; 2294887Schin int line; 2304887Schin Void_t* func; 2314887Schin 2324887Schin /* this must be done now to avoid any inadvertent recursion (more below) */ 2334887Schin _Vmflinit = 1; 2344887Schin VMFLF(Vmregion,file,line,func); 2354887Schin 236*12068SRoger.Faulkner@Oracle.COM /* if getenv() calls malloc(), the options may not affect the eventual region */ 237*12068SRoger.Faulkner@Oracle.COM VMOPTIONS(); 2384887Schin 2394887Schin /* reset file and line number to correct values for the call */ 2404887Schin Vmregion->file = file; 2414887Schin Vmregion->line = line; 2424887Schin Vmregion->func = func; 2434887Schin 2444887Schin return 0; 2454887Schin } 2464887Schin 2474887Schin #if __STD_C 2484887Schin extern Void_t* calloc(reg size_t n_obj, reg size_t s_obj) 2494887Schin #else 2504887Schin extern Void_t* calloc(n_obj, s_obj) 2514887Schin reg size_t n_obj; 2524887Schin reg size_t s_obj; 2534887Schin #endif 2544887Schin { 2554887Schin VMFLINIT(); 2564887Schin return VMRECORD((*Vmregion->meth.resizef)(Vmregion,NIL(Void_t*),n_obj*s_obj,VM_RSZERO)); 2574887Schin } 2584887Schin 2594887Schin #if __STD_C 2604887Schin extern Void_t* malloc(reg size_t size) 2614887Schin #else 2624887Schin extern Void_t* malloc(size) 2634887Schin reg size_t size; 2644887Schin #endif 2654887Schin { 2664887Schin VMFLINIT(); 2674887Schin return VMRECORD((*Vmregion->meth.allocf)(Vmregion,size)); 2684887Schin } 2694887Schin 2704887Schin #if __STD_C 2714887Schin extern Void_t* realloc(reg Void_t* data, reg size_t size) 2724887Schin #else 2734887Schin extern Void_t* realloc(data,size) 2744887Schin reg Void_t* data; /* block to be reallocated */ 2754887Schin reg size_t size; /* new size */ 2764887Schin #endif 2774887Schin { 2784887Schin #if USE_NATIVE 2794887Schin #undef realloc 2804887Schin #if __STD_C 2814887Schin extern Void_t* realloc(Void_t*, size_t); 2824887Schin #else 2834887Schin extern Void_t* realloc(); 2844887Schin #endif 2854887Schin #endif 2864887Schin 2874887Schin VMFLINIT(); 2884887Schin 2894887Schin #if _PACKAGE_ast 2904887Schin if(data && Vmregion->meth.meth != VM_MTDEBUG && 2914887Schin #if !USE_NATIVE 2924887Schin !(Vmregion->data->mode&VM_TRUST) && 2934887Schin #endif 2944887Schin (*Vmregion->meth.addrf)(Vmregion,data) != 0 ) 2954887Schin { 2964887Schin #if USE_NATIVE 2974887Schin return realloc(data, size); 2984887Schin #else 2994887Schin Void_t* newdata; 3004887Schin if((newdata = (*Vmregion->meth.allocf)(Vmregion,size)) ) 3014887Schin memcpy(newdata,data,size); 3024887Schin return VMRECORD(newdata); 3034887Schin #endif 3044887Schin } 3054887Schin #endif 3064887Schin 3074887Schin #if USE_NATIVE 3084887Schin { Void_t* newdata; 3094887Schin if (newdata = (*Vmregion->meth.resizef)(Vmregion,data,size,VM_RSCOPY|VM_RSMOVE)) 3104887Schin return newdata; 3114887Schin return VMRECORD(realloc(data, size)); 3124887Schin } 3134887Schin #else 3144887Schin return VMRECORD((*Vmregion->meth.resizef)(Vmregion,data,size,VM_RSCOPY|VM_RSMOVE)); 3154887Schin #endif 3164887Schin } 3174887Schin 3184887Schin #if __STD_C 3194887Schin extern void free(reg Void_t* data) 3204887Schin #else 3214887Schin extern void free(data) 3224887Schin reg Void_t* data; 3234887Schin #endif 3244887Schin { 3254887Schin #if USE_NATIVE 3264887Schin #undef free 3274887Schin #if __STD_C 3284887Schin extern void free(Void_t*); 3294887Schin #else 3304887Schin extern void free(); 3314887Schin #endif 3324887Schin #endif 3334887Schin 3344887Schin VMFLINIT(); 3354887Schin 3364887Schin #if _PACKAGE_ast 3374887Schin if(data && Vmregion->meth.meth != VM_MTDEBUG && 3384887Schin #if !USE_NATIVE 3394887Schin !(Vmregion->data->mode&VM_TRUST) && 3404887Schin #endif 3414887Schin (*Vmregion->meth.addrf)(Vmregion,data) != 0) 3424887Schin { 3434887Schin #if USE_NATIVE 3444887Schin free(data); 3454887Schin #endif 3464887Schin return; 3474887Schin } 3484887Schin #endif 3494887Schin 3504887Schin #if USE_NATIVE 3514887Schin if ((*Vmregion->meth.freef)(Vmregion,data) != 0) 3524887Schin free(data); 3534887Schin #else 3544887Schin (void)(*Vmregion->meth.freef)(Vmregion,data); 3554887Schin #endif 3564887Schin } 3574887Schin 3584887Schin #if __STD_C 3594887Schin extern void cfree(reg Void_t* data) 3604887Schin #else 3614887Schin extern void cfree(data) 3624887Schin reg Void_t* data; 3634887Schin #endif 3644887Schin { 3654887Schin free(data); 3664887Schin } 3674887Schin 3684887Schin #if __STD_C 3694887Schin extern Void_t* memalign(reg size_t align, reg size_t size) 3704887Schin #else 3714887Schin extern Void_t* memalign(align, size) 3724887Schin reg size_t align; 3734887Schin reg size_t size; 3744887Schin #endif 3754887Schin { 3764887Schin Void_t* addr; 3774887Schin 3784887Schin VMFLINIT(); 3794887Schin VMBLOCK 3804887Schin addr = VMRECORD((*Vmregion->meth.alignf)(Vmregion,size,align)); 3814887Schin VMUNBLOCK 3824887Schin return addr; 3834887Schin } 3844887Schin 3854887Schin #if __STD_C 38610898Sroland.mainz@nrubsig.org extern int posix_memalign(reg Void_t **memptr, reg size_t align, reg size_t size) 38710898Sroland.mainz@nrubsig.org #else 38810898Sroland.mainz@nrubsig.org extern int posix_memalign(memptr, align, size) 38910898Sroland.mainz@nrubsig.org reg Void_t** memptr; 39010898Sroland.mainz@nrubsig.org reg size_t align; 39110898Sroland.mainz@nrubsig.org reg size_t size; 39210898Sroland.mainz@nrubsig.org #endif 39310898Sroland.mainz@nrubsig.org { 39410898Sroland.mainz@nrubsig.org Void_t *mem; 39510898Sroland.mainz@nrubsig.org 39610898Sroland.mainz@nrubsig.org if(align == 0 || (align%sizeof(Void_t*)) != 0 || ((align-1)&align) != 0 ) 39710898Sroland.mainz@nrubsig.org return EINVAL; 39810898Sroland.mainz@nrubsig.org 39910898Sroland.mainz@nrubsig.org if(!(mem = memalign(align, size)) ) 40010898Sroland.mainz@nrubsig.org return ENOMEM; 40110898Sroland.mainz@nrubsig.org 40210898Sroland.mainz@nrubsig.org *memptr = mem; 40310898Sroland.mainz@nrubsig.org return 0; 40410898Sroland.mainz@nrubsig.org } 40510898Sroland.mainz@nrubsig.org 40610898Sroland.mainz@nrubsig.org #if __STD_C 4074887Schin extern Void_t* valloc(reg size_t size) 4084887Schin #else 4094887Schin extern Void_t* valloc(size) 4104887Schin reg size_t size; 4114887Schin #endif 4124887Schin { 4134887Schin VMFLINIT(); 4144887Schin GETPAGESIZE(_Vmpagesize); 4154887Schin return VMRECORD((*Vmregion->meth.alignf)(Vmregion,size,_Vmpagesize)); 4164887Schin } 4174887Schin 4184887Schin #if __STD_C 4194887Schin extern Void_t* pvalloc(reg size_t size) 4204887Schin #else 4214887Schin extern Void_t* pvalloc(size) 4224887Schin reg size_t size; 4234887Schin #endif 4244887Schin { 4254887Schin VMFLINIT(); 4264887Schin GETPAGESIZE(_Vmpagesize); 4274887Schin return VMRECORD((*Vmregion->meth.alignf)(Vmregion,ROUND(size,_Vmpagesize),_Vmpagesize)); 4284887Schin } 4294887Schin 4304887Schin #if !_PACKAGE_ast 4314887Schin #if __STD_C 4324887Schin char* strdup(const char* s) 4334887Schin #else 4344887Schin char* strdup(s) 4354887Schin char* s; 4364887Schin #endif 4374887Schin { 4384887Schin char *ns; 4394887Schin size_t n; 4404887Schin 4414887Schin if(!s) 4424887Schin return NIL(char*); 4434887Schin else 4444887Schin { n = strlen(s); 4454887Schin if((ns = malloc(n+1)) ) 4464887Schin memcpy(ns,s,n+1); 4474887Schin return ns; 4484887Schin } 4494887Schin } 4504887Schin #endif /* _PACKAGE_ast */ 4514887Schin 4524887Schin #if !_lib_alloca || _mal_alloca 4534887Schin #ifndef _stk_down 4544887Schin #define _stk_down 0 4554887Schin #endif 4564887Schin typedef struct _alloca_s Alloca_t; 4574887Schin union _alloca_u 4584887Schin { struct 4594887Schin { char* addr; 4604887Schin Alloca_t* next; 4614887Schin } head; 4624887Schin char array[ALIGN]; 4634887Schin }; 4644887Schin struct _alloca_s 4654887Schin { union _alloca_u head; 4664887Schin Vmuchar_t data[1]; 4674887Schin }; 4684887Schin 4694887Schin #if __STD_C 4704887Schin extern Void_t* alloca(size_t size) 4714887Schin #else 4724887Schin extern Void_t* alloca(size) 4734887Schin size_t size; 4744887Schin #endif 4754887Schin { char array[ALIGN]; 4764887Schin char* file; 4774887Schin int line; 4784887Schin Void_t* func; 4794887Schin reg Alloca_t* f; 4804887Schin static Alloca_t* Frame; 4814887Schin 4824887Schin VMFLINIT(); 4834887Schin VMFLF(Vmregion,file,line,func); 4844887Schin while(Frame) 4854887Schin { if(( _stk_down && &array[0] > Frame->head.head.addr) || 4864887Schin (!_stk_down && &array[0] < Frame->head.head.addr) ) 4874887Schin { f = Frame; 4884887Schin Frame = f->head.head.next; 4894887Schin (void)(*Vmregion->meth.freef)(Vmregion,f); 4904887Schin } 4914887Schin else break; 4924887Schin } 4934887Schin 4944887Schin Vmregion->file = file; 4954887Schin Vmregion->line = line; 4964887Schin Vmregion->func = func; 4974887Schin f = (Alloca_t*)(*Vmregion->meth.allocf)(Vmregion,size+sizeof(Alloca_t)-1); 4984887Schin 4994887Schin f->head.head.addr = &array[0]; 5004887Schin f->head.head.next = Frame; 5014887Schin Frame = f; 5024887Schin 5034887Schin return (Void_t*)f->data; 5044887Schin } 5054887Schin #endif /*!_lib_alloca || _mal_alloca*/ 5064887Schin 5074887Schin #if _map_malloc 5084887Schin 5094887Schin /* not sure of all the implications -- 0 is conservative for now */ 5104887Schin #define USE_NATIVE 0 /* native free/realloc on non-vmalloc ptrs */ 5114887Schin 5124887Schin #else 5134887Schin 5144887Schin /* intercept _* __* __libc_* variants */ 5154887Schin 5164887Schin #if __lib__malloc 5174887Schin extern Void_t* F2(_calloc, size_t,n, size_t,m) { return calloc(n, m); } 5184887Schin extern Void_t F1(_cfree, Void_t*,p) { free(p); } 5194887Schin extern Void_t F1(_free, Void_t*,p) { free(p); } 5204887Schin extern Void_t* F1(_malloc, size_t,n) { return malloc(n); } 5214887Schin #if _lib_memalign 5224887Schin extern Void_t* F2(_memalign, size_t,a, size_t,n) { return memalign(a, n); } 5234887Schin #endif 5244887Schin #if _lib_pvalloc 5254887Schin extern Void_t* F1(_pvalloc, size_t,n) { return pvalloc(n); } 5264887Schin #endif 5274887Schin extern Void_t* F2(_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } 5284887Schin #if _lib_valloc 5294887Schin extern Void_t* F1(_valloc, size_t,n) { return valloc(n); } 5304887Schin #endif 5314887Schin #endif 5324887Schin 5334887Schin #if _lib___malloc 5344887Schin extern Void_t* F2(__calloc, size_t,n, size_t,m) { return calloc(n, m); } 5354887Schin extern Void_t F1(__cfree, Void_t*,p) { free(p); } 5364887Schin extern Void_t F1(__free, Void_t*,p) { free(p); } 5374887Schin extern Void_t* F1(__malloc, size_t,n) { return malloc(n); } 5384887Schin #if _lib_memalign 5394887Schin extern Void_t* F2(__memalign, size_t,a, size_t,n) { return memalign(a, n); } 5404887Schin #endif 5414887Schin #if _lib_pvalloc 5424887Schin extern Void_t* F1(__pvalloc, size_t,n) { return pvalloc(n); } 5434887Schin #endif 5444887Schin extern Void_t* F2(__realloc, Void_t*,p, size_t,n) { return realloc(p, n); } 5454887Schin #if _lib_valloc 5464887Schin extern Void_t* F1(__valloc, size_t,n) { return valloc(n); } 5474887Schin #endif 5484887Schin #endif 5494887Schin 5504887Schin #if _lib___libc_malloc 5514887Schin extern Void_t* F2(__libc_calloc, size_t,n, size_t,m) { return calloc(n, m); } 5524887Schin extern Void_t F1(__libc_cfree, Void_t*,p) { free(p); } 5534887Schin extern Void_t F1(__libc_free, Void_t*,p) { free(p); } 5544887Schin extern Void_t* F1(__libc_malloc, size_t,n) { return malloc(n); } 5554887Schin #if _lib_memalign 5564887Schin extern Void_t* F2(__libc_memalign, size_t,a, size_t,n) { return memalign(a, n); } 5574887Schin #endif 5584887Schin #if _lib_pvalloc 5594887Schin extern Void_t* F1(__libc_pvalloc, size_t,n) { return pvalloc(n); } 5604887Schin #endif 5614887Schin extern Void_t* F2(__libc_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } 5624887Schin #if _lib_valloc 5634887Schin extern Void_t* F1(__libc_valloc, size_t,n) { return valloc(n); } 5644887Schin #endif 5654887Schin #endif 5664887Schin 5674887Schin #endif /* _map_malloc */ 5684887Schin 5694887Schin #undef extern 5704887Schin 5714887Schin #if _hdr_malloc /* need the mallint interface for statistics, etc. */ 5724887Schin 5734887Schin #undef calloc 5744887Schin #define calloc ______calloc 5754887Schin #undef cfree 5764887Schin #define cfree ______cfree 5774887Schin #undef free 5784887Schin #define free ______free 5794887Schin #undef malloc 5804887Schin #define malloc ______malloc 5814887Schin #undef pvalloc 5824887Schin #define pvalloc ______pvalloc 5834887Schin #undef realloc 5844887Schin #define realloc ______realloc 5854887Schin #undef valloc 5864887Schin #define valloc ______valloc 5874887Schin 5884887Schin #if !_UWIN 5894887Schin 5904887Schin #include <malloc.h> 5914887Schin 5924887Schin typedef struct mallinfo Mallinfo_t; 5934887Schin typedef struct mstats Mstats_t; 5944887Schin 5954887Schin #endif 5964887Schin 5974887Schin #if defined(__EXPORT__) 5984887Schin #define extern __EXPORT__ 5994887Schin #endif 6004887Schin 6014887Schin #if _lib_mallopt 6024887Schin #if __STD_C 6034887Schin extern int mallopt(int cmd, int value) 6044887Schin #else 6054887Schin extern int mallopt(cmd, value) 6064887Schin int cmd; 6074887Schin int value; 6084887Schin #endif 6094887Schin { 6104887Schin VMFLINIT(); 6114887Schin return 0; 6124887Schin } 6134887Schin #endif /*_lib_mallopt*/ 6144887Schin 6154887Schin #if _lib_mallinfo && _mem_arena_mallinfo 6164887Schin #if __STD_C 6174887Schin extern Mallinfo_t mallinfo(void) 6184887Schin #else 6194887Schin extern Mallinfo_t mallinfo() 6204887Schin #endif 6214887Schin { 6224887Schin Vmstat_t sb; 6234887Schin Mallinfo_t mi; 6244887Schin 6254887Schin VMFLINIT(); 6264887Schin memset(&mi,0,sizeof(mi)); 6274887Schin if(vmstat(Vmregion,&sb) >= 0) 6284887Schin { mi.arena = sb.extent; 6294887Schin mi.ordblks = sb.n_busy+sb.n_free; 6304887Schin mi.uordblks = sb.s_busy; 6314887Schin mi.fordblks = sb.s_free; 6324887Schin } 6334887Schin return mi; 6344887Schin } 6354887Schin #endif /* _lib_mallinfo */ 6364887Schin 6374887Schin #if _lib_mstats && _mem_bytes_total_mstats 6384887Schin #if __STD_C 6394887Schin extern Mstats_t mstats(void) 6404887Schin #else 6414887Schin extern Mstats_t mstats() 6424887Schin #endif 6434887Schin { 6444887Schin Vmstat_t sb; 6454887Schin Mstats_t ms; 6464887Schin 6474887Schin VMFLINIT(); 6484887Schin memset(&ms,0,sizeof(ms)); 6494887Schin if(vmstat(Vmregion,&sb) >= 0) 6504887Schin { ms.bytes_total = sb.extent; 6514887Schin ms.chunks_used = sb.n_busy; 6524887Schin ms.bytes_used = sb.s_busy; 6534887Schin ms.chunks_free = sb.n_free; 6544887Schin ms.bytes_free = sb.s_free; 6554887Schin } 6564887Schin return ms; 6574887Schin } 6584887Schin #endif /*_lib_mstats*/ 6594887Schin 6604887Schin #undef extern 6614887Schin 6624887Schin #endif/*_hdr_malloc*/ 6634887Schin 6644887Schin #else 6654887Schin 6664887Schin /* 6674887Schin * even though there is no malloc override, still provide 6684887Schin * _ast_* counterparts for object compatibility 6694887Schin */ 6704887Schin 6714887Schin #undef calloc 6724887Schin extern Void_t* calloc _ARG_((size_t, size_t)); 6734887Schin 6744887Schin #undef cfree 6754887Schin extern void cfree _ARG_((Void_t*)); 6764887Schin 6774887Schin #undef free 6784887Schin extern void free _ARG_((Void_t*)); 6794887Schin 6804887Schin #undef malloc 6814887Schin extern Void_t* malloc _ARG_((size_t)); 6824887Schin 6834887Schin #if _lib_memalign 6844887Schin #undef memalign 6854887Schin extern Void_t* memalign _ARG_((size_t, size_t)); 6864887Schin #endif 6874887Schin 6884887Schin #if _lib_pvalloc 6894887Schin #undef pvalloc 6904887Schin extern Void_t* pvalloc _ARG_((size_t)); 6914887Schin #endif 6924887Schin 6934887Schin #undef realloc 6944887Schin extern Void_t* realloc _ARG_((Void_t*, size_t)); 6954887Schin 6964887Schin #if _lib_valloc 6974887Schin #undef valloc 6984887Schin extern Void_t* valloc _ARG_((size_t)); 6994887Schin #endif 7004887Schin 7014887Schin #if defined(__EXPORT__) 7024887Schin #define extern __EXPORT__ 7034887Schin #endif 7044887Schin 7054887Schin extern Void_t* F2(_ast_calloc, size_t,n, size_t,m) { return calloc(n, m); } 7064887Schin extern Void_t F1(_ast_cfree, Void_t*,p) { free(p); } 7074887Schin extern Void_t F1(_ast_free, Void_t*,p) { free(p); } 7084887Schin extern Void_t* F1(_ast_malloc, size_t,n) { return malloc(n); } 7094887Schin #if _lib_memalign 7104887Schin extern Void_t* F2(_ast_memalign, size_t,a, size_t,n) { return memalign(a, n); } 7114887Schin #endif 7124887Schin #if _lib_pvalloc 7134887Schin extern Void_t* F1(_ast_pvalloc, size_t,n) { return pvalloc(n); } 7144887Schin #endif 7154887Schin extern Void_t* F2(_ast_realloc, Void_t*,p, size_t,n) { return realloc(p, n); } 7164887Schin #if _lib_valloc 7174887Schin extern Void_t* F1(_ast_valloc, size_t,n) { return valloc(n); } 7184887Schin #endif 7194887Schin 7204887Schin #undef extern 7214887Schin 7224887Schin #if _hdr_malloc 7234887Schin 7244887Schin #undef mallinfo 7254887Schin #undef mallopt 7264887Schin #undef mstats 7274887Schin 7284887Schin #define calloc ______calloc 7294887Schin #define cfree ______cfree 7304887Schin #define free ______free 7314887Schin #define malloc ______malloc 7324887Schin #define pvalloc ______pvalloc 7334887Schin #define realloc ______realloc 7344887Schin #define valloc ______valloc 7354887Schin 7364887Schin #if !_UWIN 7374887Schin 7384887Schin #include <malloc.h> 7394887Schin 7404887Schin typedef struct mallinfo Mallinfo_t; 7414887Schin typedef struct mstats Mstats_t; 7424887Schin 7434887Schin #endif 7444887Schin 7454887Schin #if defined(__EXPORT__) 7464887Schin #define extern __EXPORT__ 7474887Schin #endif 7484887Schin 7494887Schin #if _lib_mallopt 7504887Schin extern int F2(_ast_mallopt, int,cmd, int,value) { return mallopt(cmd, value); } 7514887Schin #endif 7524887Schin 7534887Schin #if _lib_mallinfo && _mem_arena_mallinfo 7544887Schin extern Mallinfo_t F0(_ast_mallinfo, void) { return mallinfo(); } 7554887Schin #endif 7564887Schin 7574887Schin #if _lib_mstats && _mem_bytes_total_mstats 7584887Schin extern Mstats_t F0(_ast_mstats, void) { return mstats(); } 7594887Schin #endif 7604887Schin 7614887Schin #undef extern 7624887Schin 7634887Schin #endif /*_hdr_malloc*/ 7644887Schin 7654887Schin #endif /*!_std_malloc*/ 7664887Schin 767*12068SRoger.Faulkner@Oracle.COM #if __STD_C 768*12068SRoger.Faulkner@Oracle.COM static Vmulong_t atou(char** sp) 769*12068SRoger.Faulkner@Oracle.COM #else 770*12068SRoger.Faulkner@Oracle.COM static Vmulong_t atou(sp) 771*12068SRoger.Faulkner@Oracle.COM char** sp; 772*12068SRoger.Faulkner@Oracle.COM #endif 773*12068SRoger.Faulkner@Oracle.COM { 774*12068SRoger.Faulkner@Oracle.COM char* s = *sp; 775*12068SRoger.Faulkner@Oracle.COM Vmulong_t v = 0; 776*12068SRoger.Faulkner@Oracle.COM 777*12068SRoger.Faulkner@Oracle.COM if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X') ) 778*12068SRoger.Faulkner@Oracle.COM { for(s += 2; *s; ++s) 779*12068SRoger.Faulkner@Oracle.COM { if(*s >= '0' && *s <= '9') 780*12068SRoger.Faulkner@Oracle.COM v = (v << 4) + (*s - '0'); 781*12068SRoger.Faulkner@Oracle.COM else if(*s >= 'a' && *s <= 'f') 782*12068SRoger.Faulkner@Oracle.COM v = (v << 4) + (*s - 'a') + 10; 783*12068SRoger.Faulkner@Oracle.COM else if(*s >= 'A' && *s <= 'F') 784*12068SRoger.Faulkner@Oracle.COM v = (v << 4) + (*s - 'A') + 10; 785*12068SRoger.Faulkner@Oracle.COM else break; 786*12068SRoger.Faulkner@Oracle.COM } 787*12068SRoger.Faulkner@Oracle.COM } 788*12068SRoger.Faulkner@Oracle.COM else 789*12068SRoger.Faulkner@Oracle.COM { for(; *s; ++s) 790*12068SRoger.Faulkner@Oracle.COM { if(*s >= '0' && *s <= '9') 791*12068SRoger.Faulkner@Oracle.COM v = v*10 + (*s - '0'); 792*12068SRoger.Faulkner@Oracle.COM else break; 793*12068SRoger.Faulkner@Oracle.COM } 794*12068SRoger.Faulkner@Oracle.COM } 795*12068SRoger.Faulkner@Oracle.COM 796*12068SRoger.Faulkner@Oracle.COM *sp = s; 797*12068SRoger.Faulkner@Oracle.COM return v; 798*12068SRoger.Faulkner@Oracle.COM } 799*12068SRoger.Faulkner@Oracle.COM 800*12068SRoger.Faulkner@Oracle.COM #if __STD_C 801*12068SRoger.Faulkner@Oracle.COM static char* insertpid(char* begs, char* ends) 802*12068SRoger.Faulkner@Oracle.COM #else 803*12068SRoger.Faulkner@Oracle.COM static char* insertpid(begs,ends) 804*12068SRoger.Faulkner@Oracle.COM char* begs; 805*12068SRoger.Faulkner@Oracle.COM char* ends; 806*12068SRoger.Faulkner@Oracle.COM #endif 807*12068SRoger.Faulkner@Oracle.COM { int pid; 808*12068SRoger.Faulkner@Oracle.COM char* s; 809*12068SRoger.Faulkner@Oracle.COM 810*12068SRoger.Faulkner@Oracle.COM if((pid = getpid()) < 0) 811*12068SRoger.Faulkner@Oracle.COM return NIL(char*); 812*12068SRoger.Faulkner@Oracle.COM 813*12068SRoger.Faulkner@Oracle.COM s = ends; 814*12068SRoger.Faulkner@Oracle.COM do 815*12068SRoger.Faulkner@Oracle.COM { if(s == begs) 816*12068SRoger.Faulkner@Oracle.COM return NIL(char*); 817*12068SRoger.Faulkner@Oracle.COM *--s = '0' + pid%10; 818*12068SRoger.Faulkner@Oracle.COM } while((pid /= 10) > 0); 819*12068SRoger.Faulkner@Oracle.COM while(s < ends) 820*12068SRoger.Faulkner@Oracle.COM *begs++ = *s++; 821*12068SRoger.Faulkner@Oracle.COM 822*12068SRoger.Faulkner@Oracle.COM return begs; 823*12068SRoger.Faulkner@Oracle.COM } 824*12068SRoger.Faulkner@Oracle.COM 825*12068SRoger.Faulkner@Oracle.COM #if __STD_C 826*12068SRoger.Faulkner@Oracle.COM static int createfile(char* file) 827*12068SRoger.Faulkner@Oracle.COM #else 828*12068SRoger.Faulkner@Oracle.COM static int createfile(file) 829*12068SRoger.Faulkner@Oracle.COM char* file; 830*12068SRoger.Faulkner@Oracle.COM #endif 831*12068SRoger.Faulkner@Oracle.COM { 832*12068SRoger.Faulkner@Oracle.COM char buf[1024]; 833*12068SRoger.Faulkner@Oracle.COM char *next, *endb; 834*12068SRoger.Faulkner@Oracle.COM int fd; 835*12068SRoger.Faulkner@Oracle.COM 836*12068SRoger.Faulkner@Oracle.COM next = buf; 837*12068SRoger.Faulkner@Oracle.COM endb = buf + sizeof(buf); 838*12068SRoger.Faulkner@Oracle.COM while(*file) 839*12068SRoger.Faulkner@Oracle.COM { if(*file == '%') 840*12068SRoger.Faulkner@Oracle.COM { switch(file[1]) 841*12068SRoger.Faulkner@Oracle.COM { 842*12068SRoger.Faulkner@Oracle.COM case 'p' : 843*12068SRoger.Faulkner@Oracle.COM if(!(next = insertpid(next,endb)) ) 844*12068SRoger.Faulkner@Oracle.COM return -1; 845*12068SRoger.Faulkner@Oracle.COM file += 2; 846*12068SRoger.Faulkner@Oracle.COM break; 847*12068SRoger.Faulkner@Oracle.COM default : 848*12068SRoger.Faulkner@Oracle.COM goto copy; 849*12068SRoger.Faulkner@Oracle.COM } 850*12068SRoger.Faulkner@Oracle.COM } 851*12068SRoger.Faulkner@Oracle.COM else 852*12068SRoger.Faulkner@Oracle.COM { copy: 853*12068SRoger.Faulkner@Oracle.COM *next++ = *file++; 854*12068SRoger.Faulkner@Oracle.COM } 855*12068SRoger.Faulkner@Oracle.COM 856*12068SRoger.Faulkner@Oracle.COM if(next >= endb) 857*12068SRoger.Faulkner@Oracle.COM return -1; 858*12068SRoger.Faulkner@Oracle.COM } 859*12068SRoger.Faulkner@Oracle.COM 860*12068SRoger.Faulkner@Oracle.COM *next = '\0'; 861*12068SRoger.Faulkner@Oracle.COM file = buf; 862*12068SRoger.Faulkner@Oracle.COM if (*file == '&' && *(file += 1) || strncmp(file, "/dev/fd/", 8) == 0 && *(file += 8)) 863*12068SRoger.Faulkner@Oracle.COM fd = dup((int)atou(&file)); 864*12068SRoger.Faulkner@Oracle.COM else if (*file) 865*12068SRoger.Faulkner@Oracle.COM #if _PACKAGE_ast 866*12068SRoger.Faulkner@Oracle.COM fd = open(file, O_WRONLY|O_CREAT|O_TRUNC, CREAT_MODE); 867*12068SRoger.Faulkner@Oracle.COM #else 868*12068SRoger.Faulkner@Oracle.COM fd = creat(file, CREAT_MODE); 869*12068SRoger.Faulkner@Oracle.COM #endif 870*12068SRoger.Faulkner@Oracle.COM else 871*12068SRoger.Faulkner@Oracle.COM return -1; 872*12068SRoger.Faulkner@Oracle.COM #if _PACKAGE_ast 873*12068SRoger.Faulkner@Oracle.COM #ifdef FD_CLOEXEC 874*12068SRoger.Faulkner@Oracle.COM if (fd >= 0) 875*12068SRoger.Faulkner@Oracle.COM fcntl(fd, F_SETFD, FD_CLOEXEC); 876*12068SRoger.Faulkner@Oracle.COM #endif 877*12068SRoger.Faulkner@Oracle.COM #endif 878*12068SRoger.Faulkner@Oracle.COM return fd; 879*12068SRoger.Faulkner@Oracle.COM } 880*12068SRoger.Faulkner@Oracle.COM 881*12068SRoger.Faulkner@Oracle.COM #if __STD_C 882*12068SRoger.Faulkner@Oracle.COM static void pfprint(void) 883*12068SRoger.Faulkner@Oracle.COM #else 884*12068SRoger.Faulkner@Oracle.COM static void pfprint() 885*12068SRoger.Faulkner@Oracle.COM #endif 886*12068SRoger.Faulkner@Oracle.COM { 887*12068SRoger.Faulkner@Oracle.COM if(Vmregion->meth.meth == VM_MTPROFILE) 888*12068SRoger.Faulkner@Oracle.COM vmprofile(Vmregion,_Vmpffd); 889*12068SRoger.Faulkner@Oracle.COM } 890*12068SRoger.Faulkner@Oracle.COM 891*12068SRoger.Faulkner@Oracle.COM /* 892*12068SRoger.Faulkner@Oracle.COM * initialize runtime options from the VMALLOC_OPTIONS env var 893*12068SRoger.Faulkner@Oracle.COM */ 894*12068SRoger.Faulkner@Oracle.COM 895*12068SRoger.Faulkner@Oracle.COM #define COPY(t,e,f) while ((*t = *f++) && t < e) t++ 896*12068SRoger.Faulkner@Oracle.COM 897*12068SRoger.Faulkner@Oracle.COM #if __STD_C 898*12068SRoger.Faulkner@Oracle.COM void _vmoptions(void) 899*12068SRoger.Faulkner@Oracle.COM #else 900*12068SRoger.Faulkner@Oracle.COM void _vmoptions() 901*12068SRoger.Faulkner@Oracle.COM #endif 902*12068SRoger.Faulkner@Oracle.COM { 903*12068SRoger.Faulkner@Oracle.COM Vmalloc_t* vm = 0; 904*12068SRoger.Faulkner@Oracle.COM char* trace = 0; 905*12068SRoger.Faulkner@Oracle.COM char* s; 906*12068SRoger.Faulkner@Oracle.COM char* t; 907*12068SRoger.Faulkner@Oracle.COM char* v; 908*12068SRoger.Faulkner@Oracle.COM Vmulong_t n; 909*12068SRoger.Faulkner@Oracle.COM int fd; 910*12068SRoger.Faulkner@Oracle.COM char buf[1024]; 911*12068SRoger.Faulkner@Oracle.COM 912*12068SRoger.Faulkner@Oracle.COM _Vmoptions = 1; 913*12068SRoger.Faulkner@Oracle.COM t = buf; 914*12068SRoger.Faulkner@Oracle.COM v = &buf[sizeof(buf)-1]; 915*12068SRoger.Faulkner@Oracle.COM if (s = getenv("VMALLOC_OPTIONS")) 916*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 917*12068SRoger.Faulkner@Oracle.COM #if 1 /* backwards compatibility until 2011 */ 918*12068SRoger.Faulkner@Oracle.COM else 919*12068SRoger.Faulkner@Oracle.COM { 920*12068SRoger.Faulkner@Oracle.COM char* p; 921*12068SRoger.Faulkner@Oracle.COM 922*12068SRoger.Faulkner@Oracle.COM if (s = getenv("VMDEBUG")) 923*12068SRoger.Faulkner@Oracle.COM { 924*12068SRoger.Faulkner@Oracle.COM switch (*s++) 925*12068SRoger.Faulkner@Oracle.COM { 926*12068SRoger.Faulkner@Oracle.COM case 0: 927*12068SRoger.Faulkner@Oracle.COM break; 928*12068SRoger.Faulkner@Oracle.COM case 'a': 929*12068SRoger.Faulkner@Oracle.COM p = " abort"; 930*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 931*12068SRoger.Faulkner@Oracle.COM break; 932*12068SRoger.Faulkner@Oracle.COM case 'w': 933*12068SRoger.Faulkner@Oracle.COM p = " warn"; 934*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 935*12068SRoger.Faulkner@Oracle.COM break; 936*12068SRoger.Faulkner@Oracle.COM case '0': 937*12068SRoger.Faulkner@Oracle.COM if (*s-- == 'x') 938*12068SRoger.Faulkner@Oracle.COM { 939*12068SRoger.Faulkner@Oracle.COM p = " watch="; 940*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 941*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 942*12068SRoger.Faulkner@Oracle.COM break; 943*12068SRoger.Faulkner@Oracle.COM } 944*12068SRoger.Faulkner@Oracle.COM /*FALLTHROUGH*/ 945*12068SRoger.Faulkner@Oracle.COM default: 946*12068SRoger.Faulkner@Oracle.COM p = " period="; 947*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 948*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 949*12068SRoger.Faulkner@Oracle.COM break; 950*12068SRoger.Faulkner@Oracle.COM } 951*12068SRoger.Faulkner@Oracle.COM } 952*12068SRoger.Faulkner@Oracle.COM if ((s = getenv("VMETHOD")) && *s) 953*12068SRoger.Faulkner@Oracle.COM { 954*12068SRoger.Faulkner@Oracle.COM p = " method="; 955*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 956*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 957*12068SRoger.Faulkner@Oracle.COM } 958*12068SRoger.Faulkner@Oracle.COM if ((s = getenv("VMPROFILE")) && *s) 959*12068SRoger.Faulkner@Oracle.COM { 960*12068SRoger.Faulkner@Oracle.COM p = " profile="; 961*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 962*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 963*12068SRoger.Faulkner@Oracle.COM } 964*12068SRoger.Faulkner@Oracle.COM if ((s = getenv("VMTRACE")) && *s) 965*12068SRoger.Faulkner@Oracle.COM { 966*12068SRoger.Faulkner@Oracle.COM p = " trace="; 967*12068SRoger.Faulkner@Oracle.COM COPY(t, v, p); 968*12068SRoger.Faulkner@Oracle.COM COPY(t, v, s); 969*12068SRoger.Faulkner@Oracle.COM } 970*12068SRoger.Faulkner@Oracle.COM } 971*12068SRoger.Faulkner@Oracle.COM #endif 972*12068SRoger.Faulkner@Oracle.COM if (t > buf) 973*12068SRoger.Faulkner@Oracle.COM { 974*12068SRoger.Faulkner@Oracle.COM *t = 0; 975*12068SRoger.Faulkner@Oracle.COM s = buf; 976*12068SRoger.Faulkner@Oracle.COM for (;;) 977*12068SRoger.Faulkner@Oracle.COM { 978*12068SRoger.Faulkner@Oracle.COM while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') 979*12068SRoger.Faulkner@Oracle.COM s++; 980*12068SRoger.Faulkner@Oracle.COM if (!*(t = s)) 981*12068SRoger.Faulkner@Oracle.COM break; 982*12068SRoger.Faulkner@Oracle.COM v = 0; 983*12068SRoger.Faulkner@Oracle.COM while (*s) 984*12068SRoger.Faulkner@Oracle.COM if (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') 985*12068SRoger.Faulkner@Oracle.COM { 986*12068SRoger.Faulkner@Oracle.COM *s++ = 0; 987*12068SRoger.Faulkner@Oracle.COM break; 988*12068SRoger.Faulkner@Oracle.COM } 989*12068SRoger.Faulkner@Oracle.COM else if (!v && *s == '=') 990*12068SRoger.Faulkner@Oracle.COM { 991*12068SRoger.Faulkner@Oracle.COM *s++ = 0; 992*12068SRoger.Faulkner@Oracle.COM if (!*(v = s)) 993*12068SRoger.Faulkner@Oracle.COM v = 0; 994*12068SRoger.Faulkner@Oracle.COM } 995*12068SRoger.Faulkner@Oracle.COM else 996*12068SRoger.Faulkner@Oracle.COM s++; 997*12068SRoger.Faulkner@Oracle.COM if (t[0] == 'n' && t[1] == 'o') 998*12068SRoger.Faulkner@Oracle.COM continue; 999*12068SRoger.Faulkner@Oracle.COM switch (t[0]) 1000*12068SRoger.Faulkner@Oracle.COM { 1001*12068SRoger.Faulkner@Oracle.COM case 'a': /* abort */ 1002*12068SRoger.Faulkner@Oracle.COM if (!vm) 1003*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1004*12068SRoger.Faulkner@Oracle.COM if (vm && vm->meth.meth == VM_MTDEBUG) 1005*12068SRoger.Faulkner@Oracle.COM vmset(vm, VM_DBABORT, 1); 1006*12068SRoger.Faulkner@Oracle.COM else 1007*12068SRoger.Faulkner@Oracle.COM _Vmassert |= VM_abort; 1008*12068SRoger.Faulkner@Oracle.COM break; 1009*12068SRoger.Faulkner@Oracle.COM case 'c': /* check */ 1010*12068SRoger.Faulkner@Oracle.COM _Vmassert |= VM_check; 1011*12068SRoger.Faulkner@Oracle.COM break; 1012*12068SRoger.Faulkner@Oracle.COM case 'm': 1013*12068SRoger.Faulkner@Oracle.COM switch (t[1]) 1014*12068SRoger.Faulkner@Oracle.COM { 1015*12068SRoger.Faulkner@Oracle.COM case 'e': /* method=<method> */ 1016*12068SRoger.Faulkner@Oracle.COM if (v && !vm) 1017*12068SRoger.Faulkner@Oracle.COM { 1018*12068SRoger.Faulkner@Oracle.COM if ((v[0] == 'V' || v[0] == 'v') && (v[1] == 'M' || v[1] == 'm')) 1019*12068SRoger.Faulkner@Oracle.COM v += 2; 1020*12068SRoger.Faulkner@Oracle.COM if (strcmp(v, "debug") == 0) 1021*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1022*12068SRoger.Faulkner@Oracle.COM else if (strcmp(v, "profile") == 0) 1023*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmprofile, 0); 1024*12068SRoger.Faulkner@Oracle.COM else if (strcmp(v, "last") == 0) 1025*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmlast, 0); 1026*12068SRoger.Faulkner@Oracle.COM else if (strcmp(v, "best") == 0) 1027*12068SRoger.Faulkner@Oracle.COM vm = Vmheap; 1028*12068SRoger.Faulkner@Oracle.COM } 1029*12068SRoger.Faulkner@Oracle.COM break; 1030*12068SRoger.Faulkner@Oracle.COM case 'm': /* mmap */ 1031*12068SRoger.Faulkner@Oracle.COM #if _mem_mmap_anon || _mem_mmap_zero 1032*12068SRoger.Faulkner@Oracle.COM _Vmassert |= VM_mmap; 1033*12068SRoger.Faulkner@Oracle.COM #endif 1034*12068SRoger.Faulkner@Oracle.COM break; 1035*12068SRoger.Faulkner@Oracle.COM } 1036*12068SRoger.Faulkner@Oracle.COM break; 1037*12068SRoger.Faulkner@Oracle.COM case 'p': 1038*12068SRoger.Faulkner@Oracle.COM if (v) 1039*12068SRoger.Faulkner@Oracle.COM switch (t[1]) 1040*12068SRoger.Faulkner@Oracle.COM { 1041*12068SRoger.Faulkner@Oracle.COM case 'e': /* period=<count> */ 1042*12068SRoger.Faulkner@Oracle.COM if (!vm) 1043*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1044*12068SRoger.Faulkner@Oracle.COM if (vm && vm->meth.meth == VM_MTDEBUG) 1045*12068SRoger.Faulkner@Oracle.COM _Vmdbcheck = atou(&v); 1046*12068SRoger.Faulkner@Oracle.COM break; 1047*12068SRoger.Faulkner@Oracle.COM case 'r': /* profile=<path> */ 1048*12068SRoger.Faulkner@Oracle.COM if (!vm) 1049*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmprofile, 0); 1050*12068SRoger.Faulkner@Oracle.COM if (v && vm && vm->meth.meth == VM_MTPROFILE) 1051*12068SRoger.Faulkner@Oracle.COM _Vmpffd = createfile(v); 1052*12068SRoger.Faulkner@Oracle.COM break; 1053*12068SRoger.Faulkner@Oracle.COM } 1054*12068SRoger.Faulkner@Oracle.COM break; 1055*12068SRoger.Faulkner@Oracle.COM case 'r': /* region */ 1056*12068SRoger.Faulkner@Oracle.COM _Vmassert |= VM_region; 1057*12068SRoger.Faulkner@Oracle.COM break; 1058*12068SRoger.Faulkner@Oracle.COM case 's': /* start=<count> */ 1059*12068SRoger.Faulkner@Oracle.COM if (!vm) 1060*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1061*12068SRoger.Faulkner@Oracle.COM if (v && vm && vm->meth.meth == VM_MTDEBUG) 1062*12068SRoger.Faulkner@Oracle.COM _Vmdbstart = atou(&v); 1063*12068SRoger.Faulkner@Oracle.COM break; 1064*12068SRoger.Faulkner@Oracle.COM case 't': /* trace=<path> */ 1065*12068SRoger.Faulkner@Oracle.COM trace = v; 1066*12068SRoger.Faulkner@Oracle.COM break; 1067*12068SRoger.Faulkner@Oracle.COM case 'w': 1068*12068SRoger.Faulkner@Oracle.COM if (t[1] == 'a') 1069*12068SRoger.Faulkner@Oracle.COM switch (t[2]) 1070*12068SRoger.Faulkner@Oracle.COM { 1071*12068SRoger.Faulkner@Oracle.COM case 'r': /* warn=<path> */ 1072*12068SRoger.Faulkner@Oracle.COM if (!vm) 1073*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1074*12068SRoger.Faulkner@Oracle.COM if (v && vm && vm->meth.meth == VM_MTDEBUG && (fd = createfile(v)) >= 0) 1075*12068SRoger.Faulkner@Oracle.COM vmdebug(fd); 1076*12068SRoger.Faulkner@Oracle.COM break; 1077*12068SRoger.Faulkner@Oracle.COM case 't': /* watch=<addr> */ 1078*12068SRoger.Faulkner@Oracle.COM if (!vm) 1079*12068SRoger.Faulkner@Oracle.COM vm = vmopen(Vmdcsbrk, Vmdebug, 0); 1080*12068SRoger.Faulkner@Oracle.COM if (v && vm && vm->meth.meth == VM_MTDEBUG && (n = atou(&v)) >= 0) 1081*12068SRoger.Faulkner@Oracle.COM vmdbwatch((Void_t*)n); 1082*12068SRoger.Faulkner@Oracle.COM break; 1083*12068SRoger.Faulkner@Oracle.COM } 1084*12068SRoger.Faulkner@Oracle.COM break; 1085*12068SRoger.Faulkner@Oracle.COM } 1086*12068SRoger.Faulkner@Oracle.COM } 1087*12068SRoger.Faulkner@Oracle.COM } 1088*12068SRoger.Faulkner@Oracle.COM 1089*12068SRoger.Faulkner@Oracle.COM /* slip in the new region now so that malloc() will work fine */ 1090*12068SRoger.Faulkner@Oracle.COM 1091*12068SRoger.Faulkner@Oracle.COM if (vm) 1092*12068SRoger.Faulkner@Oracle.COM { 1093*12068SRoger.Faulkner@Oracle.COM if (vm->meth.meth == VM_MTDEBUG) 1094*12068SRoger.Faulkner@Oracle.COM _Vmdbcheck = 1; 1095*12068SRoger.Faulkner@Oracle.COM Vmregion = vm; 1096*12068SRoger.Faulkner@Oracle.COM } 1097*12068SRoger.Faulkner@Oracle.COM 1098*12068SRoger.Faulkner@Oracle.COM /* enable tracing */ 1099*12068SRoger.Faulkner@Oracle.COM 1100*12068SRoger.Faulkner@Oracle.COM if (trace && (fd = createfile(trace)) >= 0) 1101*12068SRoger.Faulkner@Oracle.COM { 1102*12068SRoger.Faulkner@Oracle.COM vmset(Vmregion, VM_TRACE, 1); 1103*12068SRoger.Faulkner@Oracle.COM vmtrace(fd); 1104*12068SRoger.Faulkner@Oracle.COM } 1105*12068SRoger.Faulkner@Oracle.COM 1106*12068SRoger.Faulkner@Oracle.COM /* make sure that profile data is output upon exiting */ 1107*12068SRoger.Faulkner@Oracle.COM 1108*12068SRoger.Faulkner@Oracle.COM if (vm && vm->meth.meth == VM_MTPROFILE) 1109*12068SRoger.Faulkner@Oracle.COM { 1110*12068SRoger.Faulkner@Oracle.COM if (_Vmpffd < 0) 1111*12068SRoger.Faulkner@Oracle.COM _Vmpffd = 2; 1112*12068SRoger.Faulkner@Oracle.COM /* this may wind up calling malloc(), but region is ok now */ 1113*12068SRoger.Faulkner@Oracle.COM atexit(pfprint); 1114*12068SRoger.Faulkner@Oracle.COM } 1115*12068SRoger.Faulkner@Oracle.COM else if (_Vmpffd >= 0) 1116*12068SRoger.Faulkner@Oracle.COM { 1117*12068SRoger.Faulkner@Oracle.COM close(_Vmpffd); 1118*12068SRoger.Faulkner@Oracle.COM _Vmpffd = -1; 1119*12068SRoger.Faulkner@Oracle.COM } 1120*12068SRoger.Faulkner@Oracle.COM } 1121*12068SRoger.Faulkner@Oracle.COM 11224887Schin #endif /*_UWIN*/ 1123