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