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 #ifndef _VMALLOC_H 234887Schin #define _VMALLOC_H 1 244887Schin 254887Schin /* Public header file for the virtual malloc package. 264887Schin ** 274887Schin ** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94. 284887Schin */ 294887Schin 30*12068SRoger.Faulkner@Oracle.COM #define VMALLOC_VERSION 20100101L 314887Schin 324887Schin #if _PACKAGE_ast 334887Schin #include <ast_std.h> 344887Schin #else 354887Schin #include <ast_common.h> 364887Schin #endif 374887Schin 384887Schin typedef struct _vmalloc_s Vmalloc_t; 394887Schin typedef struct _vmstat_s Vmstat_t; 404887Schin typedef struct _vmdisc_s Vmdisc_t; 414887Schin typedef struct _vmethod_s Vmethod_t; 42*12068SRoger.Faulkner@Oracle.COM typedef struct _vmdata_s Vmdata_t; 434887Schin typedef Void_t* (*Vmemory_f)_ARG_((Vmalloc_t*, Void_t*, size_t, size_t, Vmdisc_t*)); 444887Schin typedef int (*Vmexcept_f)_ARG_((Vmalloc_t*, int, Void_t*, Vmdisc_t*)); 454887Schin 464887Schin struct _vmstat_s 474887Schin { int n_busy; /* number of busy blocks */ 484887Schin int n_free; /* number of free blocks */ 494887Schin size_t s_busy; /* total amount of busy space */ 504887Schin size_t s_free; /* total amount of free space */ 514887Schin size_t m_busy; /* largest busy piece */ 524887Schin size_t m_free; /* largest free piece */ 534887Schin int n_seg; /* number of segments */ 544887Schin size_t extent; /* total size of region */ 554887Schin }; 564887Schin 574887Schin struct _vmdisc_s 584887Schin { Vmemory_f memoryf; /* memory manipulator */ 594887Schin Vmexcept_f exceptf; /* exception handler */ 604887Schin size_t round; /* rounding requirement */ 614887Schin }; 624887Schin 634887Schin struct _vmethod_s 644887Schin { Void_t* (*allocf)_ARG_((Vmalloc_t*,size_t)); 654887Schin Void_t* (*resizef)_ARG_((Vmalloc_t*,Void_t*,size_t,int)); 664887Schin int (*freef)_ARG_((Vmalloc_t*,Void_t*)); 674887Schin long (*addrf)_ARG_((Vmalloc_t*,Void_t*)); 684887Schin long (*sizef)_ARG_((Vmalloc_t*,Void_t*)); 694887Schin int (*compactf)_ARG_((Vmalloc_t*)); 704887Schin Void_t* (*alignf)_ARG_((Vmalloc_t*,size_t,size_t)); 714887Schin unsigned short meth; 724887Schin }; 734887Schin 744887Schin struct _vmalloc_s 754887Schin { Vmethod_t meth; /* method for allocation */ 764887Schin char* file; /* file name */ 774887Schin int line; /* line number */ 784887Schin Void_t* func; /* calling function */ 79*12068SRoger.Faulkner@Oracle.COM Vmdisc_t* disc; /* discipline to get space */ 80*12068SRoger.Faulkner@Oracle.COM Vmdata_t* data; /* the real region data */ 81*12068SRoger.Faulkner@Oracle.COM Vmalloc_t* next; /* linked list of regions */ 824887Schin #ifdef _VM_PRIVATE_ 834887Schin _VM_PRIVATE_ 844887Schin #endif 854887Schin }; 864887Schin 874887Schin #undef VM_FLAGS /* solaris sys kernel clash */ 884887Schin 894887Schin #define VM_TRUST 0000001 /* forgo some security checks */ 904887Schin #define VM_TRACE 0000002 /* generate trace */ 914887Schin #define VM_DBCHECK 0000004 /* check for boundary overwrite */ 924887Schin #define VM_DBABORT 0000010 /* abort on any warning */ 934887Schin #define VM_FLAGS 0000017 /* user-settable flags */ 944887Schin 954887Schin #define VM_MTBEST 0000100 /* Vmbest method */ 964887Schin #define VM_MTPOOL 0000200 /* Vmpool method */ 974887Schin #define VM_MTLAST 0000400 /* Vmlast method */ 984887Schin #define VM_MTDEBUG 0001000 /* Vmdebug method */ 994887Schin #define VM_MTPROFILE 0002000 /* Vmdebug method */ 1004887Schin #define VM_METHODS 0003700 /* available allocation methods */ 1014887Schin 1024887Schin #define VM_RSCOPY 0000001 /* copy old contents */ 1034887Schin #define VM_RSMOVE 0000002 /* old contents is moveable */ 1044887Schin #define VM_RSZERO 0000004 /* clear new space */ 1054887Schin 1064887Schin /* exception types */ 1074887Schin #define VM_OPEN 0 /* region being opened */ 1084887Schin #define VM_CLOSE 1 /* announce being closed */ 1094887Schin #define VM_NOMEM 2 /* can't obtain memory */ 1104887Schin #define VM_BADADDR 3 /* bad addr in vmfree/vmresize */ 1114887Schin #define VM_DISC 4 /* discipline being changed */ 1124887Schin #define VM_ALLOC 5 /* announcement from vmalloc() */ 1134887Schin #define VM_FREE 6 /* announcement from vmfree() */ 1144887Schin #define VM_RESIZE 7 /* announcement from vmresize() */ 1154887Schin 1164887Schin _BEGIN_EXTERNS_ /* public data */ 1174887Schin #if _BLD_vmalloc && defined(__EXPORT__) 1184887Schin #define extern extern __EXPORT__ 1194887Schin #endif 1204887Schin #if !_BLD_vmalloc && defined(__IMPORT__) 1214887Schin #define extern extern __IMPORT__ 1224887Schin #endif 1234887Schin 1244887Schin extern Vmethod_t* Vmbest; /* best allocation */ 1254887Schin extern Vmethod_t* Vmlast; /* last-block allocation */ 1264887Schin extern Vmethod_t* Vmpool; /* pool allocation */ 1274887Schin extern Vmethod_t* Vmdebug; /* allocation with debugging */ 1284887Schin extern Vmethod_t* Vmprofile; /* profiling memory usage */ 1294887Schin 1304887Schin extern Vmdisc_t* Vmdcheap; /* heap discipline */ 1314887Schin extern Vmdisc_t* Vmdcsbrk; /* sbrk discipline */ 1324887Schin 1334887Schin extern Vmalloc_t* Vmheap; /* heap region */ 1344887Schin extern Vmalloc_t* Vmregion; /* malloc region */ 1354887Schin 1364887Schin #undef extern 1374887Schin _END_EXTERNS_ 1384887Schin 1394887Schin _BEGIN_EXTERNS_ /* public functions */ 1404887Schin #if _BLD_vmalloc && defined(__EXPORT__) 1414887Schin #define extern __EXPORT__ 1424887Schin #endif 1434887Schin 1444887Schin extern Vmalloc_t* vmopen _ARG_(( Vmdisc_t*, Vmethod_t*, int )); 1454887Schin extern int vmclose _ARG_(( Vmalloc_t* )); 1464887Schin extern int vmclear _ARG_(( Vmalloc_t* )); 1474887Schin extern int vmcompact _ARG_(( Vmalloc_t* )); 1484887Schin 1494887Schin extern Vmdisc_t* vmdisc _ARG_(( Vmalloc_t*, Vmdisc_t* )); 1504887Schin 1514887Schin extern Vmalloc_t* vmmopen _ARG_(( char*, Void_t*, size_t )); 1524887Schin extern Void_t* vmmset _ARG_((Vmalloc_t*, int, Void_t*, int)); 1534887Schin 1544887Schin extern Void_t* vmalloc _ARG_(( Vmalloc_t*, size_t )); 1554887Schin extern Void_t* vmalign _ARG_(( Vmalloc_t*, size_t, size_t )); 1564887Schin extern Void_t* vmresize _ARG_(( Vmalloc_t*, Void_t*, size_t, int )); 1574887Schin extern Void_t* vmgetmem _ARG_(( Vmalloc_t*, Void_t*, size_t )); 1584887Schin extern int vmfree _ARG_(( Vmalloc_t*, Void_t* )); 1594887Schin 1604887Schin extern long vmaddr _ARG_(( Vmalloc_t*, Void_t* )); 1614887Schin extern long vmsize _ARG_(( Vmalloc_t*, Void_t* )); 1624887Schin 1634887Schin extern Vmalloc_t* vmregion _ARG_(( Void_t* )); 1644887Schin extern Void_t* vmsegment _ARG_(( Vmalloc_t*, Void_t* )); 1654887Schin extern int vmset _ARG_(( Vmalloc_t*, int, int )); 1664887Schin 1674887Schin extern Void_t* vmdbwatch _ARG_(( Void_t* )); 1684887Schin extern int vmdbcheck _ARG_(( Vmalloc_t* )); 1694887Schin extern int vmdebug _ARG_(( int )); 1704887Schin 1714887Schin extern int vmprofile _ARG_(( Vmalloc_t*, int )); 1724887Schin 1734887Schin extern int vmtrace _ARG_(( int )); 1744887Schin extern int vmtrbusy _ARG_((Vmalloc_t*)); 1754887Schin 1764887Schin extern int vmstat _ARG_((Vmalloc_t*, Vmstat_t*)); 1774887Schin 1784887Schin extern int vmwalk _ARG_((Vmalloc_t*, 179*12068SRoger.Faulkner@Oracle.COM int(*)(Vmalloc_t*,Void_t*,size_t,Vmdisc_t*,Void_t*), 180*12068SRoger.Faulkner@Oracle.COM Void_t*)); 1814887Schin extern char* vmstrdup _ARG_((Vmalloc_t*, const char*)); 1824887Schin 1834887Schin #if !defined(_BLD_vmalloc) && !defined(_AST_STD_H) && \ 1844887Schin !defined(__stdlib_h) && !defined(__STDLIB_H) && \ 1854887Schin !defined(_STDLIB_INCLUDED) && !defined(_INC_STDLIB) 1864887Schin extern Void_t* malloc _ARG_(( size_t )); 1874887Schin extern Void_t* realloc _ARG_(( Void_t*, size_t )); 1884887Schin extern void free _ARG_(( Void_t* )); 1894887Schin extern void cfree _ARG_(( Void_t* )); 1904887Schin extern Void_t* calloc _ARG_(( size_t, size_t )); 1914887Schin extern Void_t* memalign _ARG_(( size_t, size_t )); 1924887Schin extern Void_t* valloc _ARG_(( size_t )); 1934887Schin #endif 1944887Schin 1954887Schin #undef extern 1964887Schin _END_EXTERNS_ 1974887Schin 1984887Schin /* to coerce any value to a Vmalloc_t*, make ANSI happy */ 1994887Schin #define _VM_(vm) ((Vmalloc_t*)(vm)) 2004887Schin 2014887Schin /* enable recording of where a call originates from */ 2024887Schin #ifdef VMFL 2034887Schin 2044887Schin #if defined(__FILE__) 2054887Schin #define _VMFILE_(vm) (_VM_(vm)->file = (char*)__FILE__) 2064887Schin #else 2074887Schin #define _VMFILE_(vm) (_VM_(vm)->file = 0) 2084887Schin #endif 2094887Schin 2104887Schin #if defined(__LINE__) 2114887Schin #define _VMLINE_(vm) (_VM_(vm)->line = __LINE__) 2124887Schin #else 2134887Schin #define _VMLINE_(vm) (_VM_(vm)->line = 0) 2144887Schin #endif 2154887Schin 2164887Schin #if defined(__FUNCTION__) 2174887Schin #define _VMFUNC_(vm) (_VM_(vm)->func = (Void_t*)__FUNCTION__) 2184887Schin #else 2194887Schin #define _VMFUNC_(vm) (_VM_(vm)->func = 0) 2204887Schin #endif 2214887Schin 2224887Schin #define _VMFL_(vm) (_VMFILE_(vm), _VMLINE_(vm), _VMFUNC_(vm)) 2234887Schin 2244887Schin #define vmalloc(vm,sz) (_VMFL_(vm), \ 2254887Schin (*(_VM_(vm)->meth.allocf))((vm),(sz)) ) 2264887Schin #define vmresize(vm,d,sz,type) (_VMFL_(vm), \ 2274887Schin (*(_VM_(vm)->meth.resizef))\ 2284887Schin ((vm),(Void_t*)(d),(sz),(type)) ) 2294887Schin #define vmfree(vm,d) (_VMFL_(vm), \ 2304887Schin (*(_VM_(vm)->meth.freef))((vm),(Void_t*)(d)) ) 2314887Schin #define vmalign(vm,sz,align) (_VMFL_(vm), \ 2324887Schin (*(_VM_(vm)->meth.alignf))((vm),(sz),(align)) ) 2334887Schin 2344887Schin #undef malloc 2354887Schin #undef realloc 2364887Schin #undef calloc 2374887Schin #undef free 2384887Schin #undef memalign 2394887Schin #undef valloc 2404887Schin 2414887Schin #if _map_malloc 2424887Schin 2434887Schin #define malloc(s) (_VMFL_(Vmregion), _ast_malloc((size_t)(s)) ) 2444887Schin #define realloc(d,s) (_VMFL_(Vmregion), _ast_realloc((Void_t*)(d),(size_t)(s)) ) 2454887Schin #define calloc(n,s) (_VMFL_(Vmregion), _ast_calloc((size_t)n, (size_t)(s)) ) 2464887Schin #define free(d) (_VMFL_(Vmregion), _ast_free((Void_t*)(d)) ) 2474887Schin #define memalign(a,s) (_VMFL_(Vmregion), _ast_memalign((size_t)(a),(size_t)(s)) ) 2484887Schin #define valloc(s) (_VMFL_(Vmregion), _ast_valloc((size_t)(s) ) 2494887Schin 2504887Schin #else 2514887Schin 2524887Schin #if !_std_malloc 2534887Schin 2544887Schin #if __STD_C || defined(__STDPP__) || defined(__GNUC__) 2554887Schin #define malloc(s) ( _VMFL_(Vmregion), (malloc)((size_t)(s)) ) 2564887Schin #define realloc(d,s) ( _VMFL_(Vmregion), (realloc)((Void_t*)(d),(size_t)(s)) ) 2574887Schin #define calloc(n,s) ( _VMFL_(Vmregion), (calloc)((size_t)n, (size_t)(s)) ) 2584887Schin #define free(d) ( _VMFL_(Vmregion), (free)((Void_t*)(d)) ) 2594887Schin #define memalign(a,s) ( _VMFL_(Vmregion), (memalign)((size_t)(a),(size_t)(s)) ) 2604887Schin #define valloc(s) ( _VMFL_(Vmregion), (valloc)((size_t)(s)) ) 2614887Schin #ifndef strdup 2624887Schin #define strdup(s) ( _VMFL_(Vmregion), (strdup)((char*)(s)) ) 2634887Schin #endif 2644887Schin 2654887Schin #else 2664887Schin 2674887Schin #define _VMNM_(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f 2684887Schin #define malloc(s) ( _VMFL_(Vmregion), _VMNM_(mallo,/,*,*,/,c)\ 2694887Schin ( (size_t)(s)) ) 2704887Schin #define realloc(d,s) ( _VMFL_(Vmregion), _VMNM_(reallo,/,*,*,/,c)\ 2714887Schin ( (Void_t*)(d),(size_t)(s)) ) 2724887Schin #define calloc(n,s) ( _VMFL_(Vmregion), _VMNM_(callo,/,*,*,/,c)\ 2734887Schin ( (size_t)n, (size_t)(s)) ) 2744887Schin #define free(d) ( _VMFL_(Vmregion), _VMNM_(fre,/,*,*,/,e)((Void_t*)(d)) ) 2754887Schin #define memalign(a,s) ( _VMFL_(Vmregion), _VMNM_(memalig,/,*,*,/,n)\ 2764887Schin ( (size_t)(a),(size_t)(s)) ) 2774887Schin #define valloc(s) ( _VMFL_(Vmregion), _VMNM_(vallo,/,*,*,/,c)\ 2784887Schin ( (size_t)(s)) ) 2794887Schin #ifndef strdup 2804887Schin #define strdup(s) ( _VMFL_(Vmregion), _VMNM_(strdu,/,*,*,/,p)\ 2814887Schin ((char*)(s)) ) 2824887Schin #endif 2834887Schin 2844887Schin #endif /*__STD_C || defined(__STDPP__) || defined(__GNUC__)*/ 2854887Schin 2864887Schin #define cfree(d) free(d) 2874887Schin 2884887Schin #endif /* !_std_malloc */ 2894887Schin 2904887Schin #endif /* _map_malloc */ 2914887Schin 2924887Schin #endif /*VMFL*/ 2934887Schin 2944887Schin /* non-debugging/profiling allocation calls */ 2954887Schin #ifndef vmalloc 2964887Schin #define vmalloc(vm,sz) (*(_VM_(vm)->meth.allocf))((vm),(sz)) 2974887Schin #endif 2984887Schin 2994887Schin #ifndef vmresize 3004887Schin #define vmresize(vm,d,sz,type) (*(_VM_(vm)->meth.resizef))\ 3014887Schin ((vm),(Void_t*)(d),(sz),(type)) 3024887Schin #endif 3034887Schin 3044887Schin #ifndef vmfree 3054887Schin #define vmfree(vm,d) (*(_VM_(vm)->meth.freef))((vm),(Void_t*)(d)) 3064887Schin #endif 3074887Schin 3084887Schin #ifndef vmalign 3094887Schin #define vmalign(vm,sz,align) (*(_VM_(vm)->meth.alignf))((vm),(sz),(align)) 3104887Schin #endif 3114887Schin 3124887Schin #define vmaddr(vm,addr) (*(_VM_(vm)->meth.addrf))((vm),(Void_t*)(addr)) 3134887Schin #define vmsize(vm,addr) (*(_VM_(vm)->meth.sizef))((vm),(Void_t*)(addr)) 3144887Schin #define vmcompact(vm) (*(_VM_(vm)->meth.compactf))((vm)) 3154887Schin #define vmoldof(v,p,t,n,x) (t*)vmresize((v), (p), sizeof(t)*(n)+(x), \ 3164887Schin (VM_RSMOVE) ) 3174887Schin #define vmnewof(v,p,t,n,x) (t*)vmresize((v), (p), sizeof(t)*(n)+(x), \ 3184887Schin (VM_RSMOVE|VM_RSCOPY|VM_RSZERO) ) 319*12068SRoger.Faulkner@Oracle.COM #define vmdata(vm) ((Void_t*)(_VM_(vm)->data)) 3204887Schin 3214887Schin #endif /* _VMALLOC_H */ 322