1/* Declarations for `malloc' and friends.
2   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
3		  Written May 1989 by Mike Haertel.
4
5This library is free software; you can redistribute it and/or
6modify it under the terms of the GNU Library General Public License as
7published by the Free Software Foundation; either version 2 of the
8License, or (at your option) any later version.
9
10This library is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13Library General Public License for more details.
14
15You should have received a copy of the GNU Library General Public
16License along with this library; see the file COPYING.LIB.  If
17not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18Cambridge, MA 02139, USA.
19
20   The author may be reached (Email) at the address mike@ai.mit.edu,
21   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
22
23#ifndef _MTRACE_H
24
25#define _MTRACE_H	1
26
27#ifdef	__cplusplus
28extern "C"
29{
30#endif
31
32#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
33#undef	__P
34#define	__P(args)	args
35#undef	__ptr_t
36#define	__ptr_t		void *
37#else /* Not C++ or ANSI C.  */
38#undef	__P
39#define	__P(args)	()
40#undef	const
41#define	const
42#undef	__ptr_t
43#define	__ptr_t		char *
44#endif /* C++ or ANSI C.  */
45
46#ifndef	NULL
47#define	NULL	0
48#endif
49
50#ifdef	__STDC__
51#include <stddef.h>
52#else
53#undef	size_t
54#define	size_t		unsigned int
55#undef	ptrdiff_t
56#define	ptrdiff_t	int
57#endif
58
59
60/* Allocate SIZE bytes of memory.  */
61extern __ptr_t malloc __P ((size_t __size));
62/* Re-allocate the previously allocated block
63   in __ptr_t, making the new block SIZE bytes long.  */
64extern __ptr_t realloc __P ((__ptr_t __ptr, size_t __size));
65/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
66extern __ptr_t calloc __P ((size_t __nmemb, size_t __size));
67/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
68extern void free __P ((__ptr_t __ptr));
69
70/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
71extern __ptr_t memalign __P ((size_t __alignment, size_t __size));
72
73/* Allocate SIZE bytes on a page boundary.  */
74extern __ptr_t valloc __P ((size_t __size));
75
76
77#ifdef _MALLOC_INTERNAL
78
79#include <stdio.h>		/* Harmless, gets __GNU_LIBRARY__ defined.  */
80
81#if	defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG)
82#include <string.h>
83#else
84#ifndef memset
85#define	memset(s, zero, n)	bzero ((s), (n))
86#endif
87#ifndef memcpy
88#define	memcpy(d, s, n)		bcopy ((s), (d), (n))
89#endif
90#endif
91
92
93#if	defined(__GNU_LIBRARY__) || defined(__STDC__)
94#include <limits.h>
95#else
96#define	CHAR_BIT	8
97#endif
98
99/* The allocator divides the heap into blocks of fixed size; large
100   requests receive one or more whole blocks, and small requests
101   receive a fragment of a block.  Fragment sizes are powers of two,
102   and all fragments of a block are the same size.  When all the
103   fragments in a block have been freed, the block itself is freed.  */
104#define INT_BIT		(CHAR_BIT * sizeof(int))
105#define BLOCKLOG	(INT_BIT > 16 ? 12 : 9)
106#define BLOCKSIZE	(1 << BLOCKLOG)
107#define BLOCKIFY(SIZE)	(((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
108
109/* Determine the amount of memory spanned by the initial heap table
110   (not an absolute limit).  */
111#define HEAP		(INT_BIT > 16 ? 4194304 : 65536)
112
113/* Number of contiguous free blocks allowed to build up at the end of
114   memory before they will be returned to the system.  */
115#define FINAL_FREE_BLOCKS	8
116
117/* Data structure giving per-block information.  */
118typedef union
119  {
120    /* Heap information for a busy block.  */
121    struct
122      {
123	/* Zero for a large block, or positive giving the
124	   logarithm to the base two of the fragment size.  */
125	int type;
126	union
127	  {
128	    struct
129	      {
130		size_t nfree;	/* Free fragments in a fragmented block.  */
131		size_t first;	/* First free fragment of the block.  */
132	      } frag;
133	    /* Size (in blocks) of a large cluster.  */
134	    size_t size;
135	  } info;
136      } busy;
137    /* Heap information for a free block
138       (that may be the first of a free cluster).  */
139    struct
140      {
141	size_t size;		/* Size (in blocks) of a free cluster.  */
142	size_t next;		/* Index of next free cluster.  */
143	size_t prev;		/* Index of previous free cluster.  */
144      } free;
145  } malloc_info;
146
147/* Pointer to first block of the heap.  */
148extern char *_heapbase;
149
150/* Table indexed by block number giving per-block information.  */
151extern malloc_info *_heapinfo;
152
153/* Address to block number and vice versa.  */
154#define BLOCK(A)	(((char *) (A) - _heapbase) / BLOCKSIZE + 1)
155#define ADDRESS(B)	((__ptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
156
157/* Current search index for the heap table.  */
158extern size_t _heapindex;
159
160/* Limit of valid info table indices.  */
161extern size_t _heaplimit;
162
163/* Doubly linked lists of free fragments.  */
164struct list
165  {
166    struct list *next;
167    struct list *prev;
168  };
169
170/* Free list headers for each fragment size.  */
171extern struct list _fraghead[];
172
173/* List of blocks allocated with `memalign' (or `valloc').  */
174struct alignlist
175  {
176    struct alignlist *next;
177    __ptr_t aligned;		/* The address that memaligned returned.  */
178    __ptr_t exact;		/* The address that malloc returned.  */
179  };
180extern struct alignlist *_aligned_blocks;
181
182/* Instrumentation.  */
183extern size_t _chunks_used;
184extern size_t _bytes_used;
185extern size_t _chunks_free;
186extern size_t _bytes_free;
187
188/* Internal version of `free' used in `morecore' (malloc.c). */
189extern void _free_internal __P ((__ptr_t __ptr));
190
191#endif /* _MALLOC_INTERNAL.  */
192
193/* Underlying allocation function; successive calls should
194   return contiguous pieces of memory.  */
195extern __ptr_t (*__morecore) __P ((ptrdiff_t __size));
196
197/* Default value of `__morecore'.  */
198extern __ptr_t __default_morecore __P ((ptrdiff_t __size));
199
200/* Nonzero if `malloc' has been called and done its initialization.  */
201extern int __malloc_initialized;
202
203/* Hooks for debugging versions.  */
204extern void (*__free_hook) __P ((__ptr_t __ptr));
205extern __ptr_t (*__malloc_hook) __P ((size_t __size));
206extern __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
207
208/* Activate a standard collection of debugging hooks.  */
209extern void mcheck __P ((void (*__func) __P ((void))));
210
211/* Activate a standard collection of tracing hooks.  */
212extern void mtrace __P ((void));
213
214/* Statistics available to the user.  */
215struct mstats
216  {
217    size_t bytes_total;		/* Total size of the heap. */
218    size_t chunks_used;		/* Chunks allocated by the user. */
219    size_t bytes_used;		/* Byte total of user-allocated chunks. */
220    size_t chunks_free;		/* Chunks in the free list. */
221    size_t bytes_free;		/* Byte total of chunks in the free list. */
222  };
223
224/* Pick up the current statistics. */
225extern struct mstats mstats __P ((void));
226
227#ifdef	__cplusplus
228}
229#endif
230
231#endif /* mtrace.h  */
232