xref: /onnv-gate/usr/src/lib/libast/amd64/include/ast/vmalloc.h (revision 12068:08a39a083754)
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