annotate src/vmsgmalloc.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents daa4784ba863
children 1fc792473491
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2877
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* DO NOT EDIT THIS FILE -- it is automagically generated. -*- C -*- */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5 /* The malloc headers and source files from the C library follow here. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 /* Declarations for `malloc' and friends.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 #ifndef _MALLOC_H
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 #define _MALLOC_H 1
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 #ifdef __cplusplus
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 extern "C"
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 #if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 #undef __P
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 #define __P(args) args
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 #undef __const
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 #define __const const
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 #undef __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 #define __ptr_t void *
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 #else /* Not C++ or ANSI C. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 #undef __P
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 #define __P(args) ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 #undef __const
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 #define __const
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 #undef __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 #define __ptr_t char *
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 #endif /* C++ or ANSI C. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 #ifndef NULL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 #define NULL 0
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 #ifdef __STDC__
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 #include <stddef.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 #ifdef VMS /* The following are defined in stdio.h, but we need it NOW!
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 But do NOT do it with defines here, for then, VAX C is going
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 to barf when it gets to stdio.h and the typedefs in there! */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 typedef unsigned int size_t;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 typedef int ptrdiff_t;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 #else /* not VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 #undef size_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 #define size_t unsigned int
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 #undef ptrdiff_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 #define ptrdiff_t int
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 #endif /* VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 /* Allocate SIZE bytes of memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 extern __ptr_t malloc __P ((size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 /* Re-allocate the previously allocated block
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 in __ptr_t, making the new block SIZE bytes long. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 extern __ptr_t realloc __P ((__ptr_t __ptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 /* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 extern __ptr_t calloc __P ((size_t __nmemb, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 /* Free a block allocated by `malloc', `realloc' or `calloc'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 extern void free __P ((__ptr_t __ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 /* Allocate SIZE bytes allocated to ALIGNMENT bytes. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 extern __ptr_t memalign __P ((size_t __alignment, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 /* Allocate SIZE bytes on a page boundary. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 extern __ptr_t valloc __P ((size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 /* VMS hooks to deal with two heaps */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 /* Allocate SIZE bytes of memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 extern __ptr_t __vms_malloc __P ((size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 /* Re-allocate the previously allocated block
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 in __ptr_t, making the new block SIZE bytes long. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 extern __ptr_t __vms_realloc __P ((__ptr_t __ptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 /* Free a block allocated by `malloc', `realloc' or `calloc'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 extern void __vms_free __P ((__ptr_t __ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 #ifdef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 #include <stdio.h> /* Harmless, gets __GNU_LIBRARY__ defined. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 #if defined(HAVE_CONFIG_H) || defined(emacs)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 #include "config.h"
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 #if defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 #include <string.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 #ifndef memset
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 #define memset(s, zero, n) bzero ((s), (n))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 #ifndef memcpy
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 #define memcpy(d, s, n) bcopy ((s), (d), (n))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 #ifndef memmove
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 #define memmove(d, s, n) bcopy ((s), (d), (n))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 #if defined(__GNU_LIBRARY__) || defined(__STDC__)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 #include <limits.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 #define CHAR_BIT 8
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 /* The allocator divides the heap into blocks of fixed size; large
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 requests receive one or more whole blocks, and small requests
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 receive a fragment of a block. Fragment sizes are powers of two,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 and all fragments of a block are the same size. When all the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 fragments in a block have been freed, the block itself is freed. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 #define INT_BIT (CHAR_BIT * sizeof(int))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 #define BLOCKLOG 9
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 #define BLOCKLOG (INT_BIT > 16 ? 12 : 9)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 #define BLOCKSIZE (1 << BLOCKLOG)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 #define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 /* Determine the amount of memory spanned by the initial heap table
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 (not an absolute limit). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 #define HEAP (INT_BIT > 16 ? 4194304 : 65536)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 /* Number of contiguous free blocks allowed to build up at the end of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 memory before they will be returned to the system. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151 #define FINAL_FREE_BLOCKS 8
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 /* Data structure giving per-block information. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 typedef union
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 /* Heap information for a busy block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 struct
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 /* Zero for a large block, or positive giving the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 logarithm to the base two of the fragment size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 int type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 union
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 struct
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 size_t nfree; /* Free fragments in a fragmented block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 size_t first; /* First free fragment of the block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 } frag;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 /* Size (in blocks) of a large cluster. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 } info;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 } busy;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 /* Heap information for a free block
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 (that may be the first of a free cluster). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 struct
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 size_t size; /* Size (in blocks) of a free cluster. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 size_t next; /* Index of next free cluster. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 size_t prev; /* Index of previous free cluster. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 } free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 } malloc_info;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 /* Pointer to first block of the heap. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 extern char *_heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 /* Table indexed by block number giving per-block information. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 extern malloc_info *_heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 /* Address to block number and vice versa. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 #define BLOCK(A) (((char *) (A) - _heapbase) / BLOCKSIZE + 1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 #define ADDRESS(B) ((__ptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 /* Current search index for the heap table. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 extern size_t _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 /* Limit of valid info table indices. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 extern size_t _heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 /* Doubly linked lists of free fragments. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200 struct list
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 struct list *next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 struct list *prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 /* Free list headers for each fragment size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 extern struct list _fraghead[];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 /* List of blocks allocated with `memalign' (or `valloc'). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 struct alignlist
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 struct alignlist *next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 __ptr_t aligned; /* The address that memaligned returned. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 __ptr_t exact; /* The address that malloc returned. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 extern struct alignlist *_aligned_blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 /* Instrumentation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 extern size_t _chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 extern size_t _bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 extern size_t _chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 extern size_t _bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 /* Internal version of `free' used in `morecore' (malloc.c). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 extern void _free_internal __P ((__ptr_t __ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 #endif /* _MALLOC_INTERNAL. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 /* Underlying allocation function; successive calls should
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 return contiguous pieces of memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 /* It does NOT always return contiguous pieces of memory on VMS. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 extern __ptr_t (*__morecore) __P ((ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 /* Underlying deallocation function. It accepts both a pointer and
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 a size to back up. It is implementation dependent what is really
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 used. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 extern __ptr_t (*__lesscore) __P ((__ptr_t __ptr, ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 /* Default value of `__morecore'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 extern __ptr_t __default_morecore __P ((ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 /* Default value of `__lesscore'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 extern __ptr_t __default_lesscore __P ((__ptr_t __ptr, ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 /* Default value of `__morecore'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 extern __ptr_t __vms_morecore __P ((ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 /* Default value of `__lesscore'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 extern __ptr_t __vms_lesscore __P ((__ptr_t __ptr, ptrdiff_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 /* If not NULL, this function is called after each time
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 `__morecore' is called to increase the data size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 extern void (*__after_morecore_hook) __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 /* If not NULL, this function is called after each time
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 `__lesscore' is called to increase the data size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 extern void (*__after_lesscore_hook) __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 /* Nonzero if `malloc' has been called and done its initialization. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 extern int __malloc_initialized;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 /* Hooks for debugging versions. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 extern void (*__free_hook) __P ((__ptr_t __ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 extern __ptr_t (*__malloc_hook) __P ((size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 extern __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 /* Activate a standard collection of debugging hooks. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 extern int mcheck __P ((void (*__func) __P ((void))));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 /* Activate a standard collection of tracing hooks. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 extern void mtrace __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 /* Statistics available to the user. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 struct mstats
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 size_t bytes_total; /* Total size of the heap. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 size_t chunks_used; /* Chunks allocated by the user. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 size_t bytes_used; /* Byte total of user-allocated chunks. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 size_t chunks_free; /* Chunks in the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 size_t bytes_free; /* Byte total of chunks in the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 /* Pick up the current statistics. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 extern struct mstats mstats __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 /* Call WARNFUN with a warning message when memory usage is high. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 extern void memory_warnings __P ((__ptr_t __start,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 void (*__warnfun) __P ((__const char *))));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 /* Relocating allocator. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295 /* Allocate SIZE bytes, and store the address in *HANDLEPTR. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 extern __ptr_t r_alloc __P ((__ptr_t *__handleptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
297
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 /* Free the storage allocated in HANDLEPTR. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 extern void r_alloc_free __P ((__ptr_t *__handleptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 /* Adjust the block at HANDLEPTR to be SIZE bytes long. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 extern __ptr_t r_re_alloc __P ((__ptr_t *__handleptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 #ifdef __cplusplus
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 #endif /* malloc.h */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 /* Memory allocator `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 Copyright 1990, 1991, 1992, 1993 Free Software Foundation
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 /* How to really get more memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 __ptr_t (*__morecore) __P ((ptrdiff_t __size)) = __vms_morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 /* How to really get more memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342 __ptr_t (*__morecore) __P ((ptrdiff_t __size)) = __default_morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
343 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 /* Debugging hook for `malloc'. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 __ptr_t (*__malloc_hook) __P ((size_t __size)) = __vms_malloc;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349 __ptr_t (*__malloc_hook) __P ((size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 /* Pointer to the base of the first block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 char *_heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355 /* Block information table. Allocated with align/__free (not malloc/free). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 malloc_info *_heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358 /* Number of info entries. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359 static size_t heapsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 /* Search index in the info table. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
362 size_t _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 /* Limit of valid info table indices. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 size_t _heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 /* Free lists for each fragment size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368 struct list _fraghead[BLOCKLOG];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 /* Instrumentation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 size_t _chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 size_t _bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 size_t _chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 size_t _bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 /* Are you experienced? */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 int __malloc_initialized;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 void (*__after_morecore_hook) __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 /* Aligned allocation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 static __ptr_t align __P ((size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384 align (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
385 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
388 unsigned long int adj;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390 result = (*__morecore) (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391 adj = (unsigned long int) ((unsigned long int) ((char *) result -
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392 (char *) NULL)) % BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 if (adj != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 adj = BLOCKSIZE - adj;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 (void) (*__morecore) (adj);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 result = (char *) result + adj;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 if (__after_morecore_hook)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 (*__after_morecore_hook) ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 /* Set everything up and remember that we have. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 static int initialize __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 static int
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 initialize ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
411 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412 extern VMS_present_buffer();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
413 printf("__malloc_initialized = %d\n", __malloc_initialized);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
414 VMS_present_buffer();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
415 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
416 heapsize = HEAP / BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
417 _heapinfo = (malloc_info *) align (heapsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418 if (_heapinfo == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
419 return 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
420 memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
421 _heapinfo[0].free.size = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
422 _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
423 _heapindex = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424 _heapbase = (char *) _heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
426 /* debug */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
427 printf("_heapbase = 0%o/0x%x/%d\n", _heapbase, _heapbase, _heapbase);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428 /* end debug */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 __malloc_initialized = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 return 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434 /* Get neatly aligned memory, initializing or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435 growing the heap info table as necessary. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436 static __ptr_t morecore __P ((size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
438 morecore (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
440 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
441 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
442 malloc_info *newinfo, *oldinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
443 size_t newsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
445 result = align (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
446 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 /* Check if we need to grow the info table. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 if ((size_t) BLOCK ((char *) result + size) > heapsize)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
451 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
452 newsize = heapsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
453 while ((size_t) BLOCK ((char *) result + size) > newsize)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 newsize *= 2;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455 newinfo = (malloc_info *) align (newsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 if (newinfo == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
458 (*__lesscore) (result, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 memset (newinfo, 0, newsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
462 memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 oldinfo = _heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464 newinfo[BLOCK (oldinfo)].busy.type = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465 newinfo[BLOCK (oldinfo)].busy.info.size
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466 = BLOCKIFY (heapsize * sizeof (malloc_info));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467 _heapinfo = newinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 _free_internal (oldinfo);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
469 heapsize = newsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
470 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472 _heaplimit = BLOCK ((char *) result + size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
474 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
475
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
476 /* Allocate memory from the heap. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
477 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
478 malloc (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
479 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
480 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
482 size_t block, blocks, lastblocks, start;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
483 register size_t i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484 struct list *next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 if (size == 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 if (__malloc_hook != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 return (*__malloc_hook) (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
492 if (!__malloc_initialized)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 if (!initialize ())
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496 if (size < sizeof (struct list))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
497 size = sizeof (struct list);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
498
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
499 /* Determine the allocation policy based on the request size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 if (size <= BLOCKSIZE / 2)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 /* Small allocation to receive a fragment of a block.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503 Determine the logarithm to base two of the fragment size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 register size_t log = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505 --size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
506 while ((size /= 2) != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507 ++log;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 /* Look in the fragment lists for a
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 free fragment of the desired size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 next = _fraghead[log].next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
512 if (next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
513 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
514 /* There are free fragments of this size.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 Pop a fragment out of the fragment list and return it.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 Update the block's nfree and first counters. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 result = (__ptr_t) next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 next->prev->next = next->next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 if (next->next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520 next->next->prev = next->prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
521 block = BLOCK (result);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
522 if (--_heapinfo[block].busy.info.frag.nfree != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523 _heapinfo[block].busy.info.frag.first = (unsigned long int)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
524 ((unsigned long int) ((char *) next->next - (char *) NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
525 % BLOCKSIZE) >> log;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527 /* Update the statistics. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 ++_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
529 _bytes_used += 1 << log;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
530 --_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 _bytes_free -= 1 << log;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
532 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 /* No free fragments of the desired size, so get a new block
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 and break it into fragments, returning the first. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 result = malloc (BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
538 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
539 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
540
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 /* Link all fragments but the first into the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
542 for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
543 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
544 next = (struct list *) ((char *) result + (i << log));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546 printf("DEBUG: malloc (%d): next = %p\n", size, next);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 next->next = _fraghead[log].next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549 next->prev = &_fraghead[log];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 next->prev->next = next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551 if (next->next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 next->next->prev = next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
555 /* Initialize the nfree and first counters for this block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 block = BLOCK (result);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 _heapinfo[block].busy.type = log;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 _heapinfo[block].busy.info.frag.nfree = i - 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559 _heapinfo[block].busy.info.frag.first = i - 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 _chunks_free += (BLOCKSIZE >> log) - 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562 _bytes_free += BLOCKSIZE - (1 << log);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 _bytes_used -= BLOCKSIZE - (1 << log);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 /* Large allocation to receive one or more blocks.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 Search the free list in a circle starting at the last place visited.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 If we loop completely around without finding a large enough
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
571 space we will have to get more memory from the system. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 blocks = BLOCKIFY (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 start = block = _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574 while (_heapinfo[block].free.size < blocks)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 block = _heapinfo[block].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577 if (block == start)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 /* Need to get more from the system. Check to see if
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 the new core will be contiguous with the final free
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
581 block; if so we don't need to get as much. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582 block = _heapinfo[0].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583 lastblocks = _heapinfo[block].free.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
585 (*__morecore) (0) == ADDRESS (block + lastblocks) &&
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
586 (morecore ((blocks - lastblocks) * BLOCKSIZE)) != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
587 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588 _heapinfo[block].free.size = blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589 _bytes_free += (blocks - lastblocks) * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
590 continue;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592 result = morecore (blocks * BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
593 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595 block = BLOCK (result);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
596 _heapinfo[block].busy.type = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597 _heapinfo[block].busy.info.size = blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
598 ++_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
599 _bytes_used += blocks * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
602 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 /* At this point we have found a suitable free list entry.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
605 Figure out how to remove what we need from the list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
606 result = ADDRESS (block);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 if (_heapinfo[block].free.size > blocks)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 /* The block we found has a bit left over,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 so relink the tail end back into the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 _heapinfo[block + blocks].free.size
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 = _heapinfo[block].free.size - blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 _heapinfo[block + blocks].free.next
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614 = _heapinfo[block].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615 _heapinfo[block + blocks].free.prev
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
616 = _heapinfo[block].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617 _heapinfo[_heapinfo[block].free.prev].free.next
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618 = _heapinfo[_heapinfo[block].free.next].free.prev
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 = _heapindex = block + blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
623 /* The block exactly matches our requirements,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
624 so just remove it from the list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
625 _heapinfo[_heapinfo[block].free.next].free.prev
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
626 = _heapinfo[block].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
627 _heapinfo[_heapinfo[block].free.prev].free.next
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 = _heapindex = _heapinfo[block].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 --_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 _heapinfo[block].busy.type = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 _heapinfo[block].busy.info.size = blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 ++_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 _bytes_used += blocks * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 _bytes_free -= blocks * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 /* Free a block of memory allocated by `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 Copyright 1990, 1991, 1992 Free Software Foundation
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
646 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
647 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
648 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
649
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
650 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
651 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
652 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
653 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
654
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
655 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
656 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
657 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
658 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
659
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
660 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
662
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
666 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
667
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
668 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
669 /* How to really get more memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670 __ptr_t (*__lesscore) __P ((__ptr_t __ptr,ptrdiff_t __size)) = __vms_lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
671 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
672 /* How to really get more memory. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
673 __ptr_t (*__lesscore) __P ((__ptr_t __ptr,ptrdiff_t __size)) = __default_lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
674 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
675
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
676 /* Debugging hook for free. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
677 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
678 void (*__free_hook) __P ((__ptr_t __ptr)) = __vms_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
679 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
680 void (*__free_hook) __P ((__ptr_t __ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
681 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
682
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
683 /* List of blocks allocated by memalign. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
684 struct alignlist *_aligned_blocks = NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
685
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
686 /* Return memory to the heap.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
687 Like `free' but don't call a __free_hook if there is one. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
688 void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
689 _free_internal (ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
690 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
691 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
692 int type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
693 size_t block, blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
694 register size_t i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695 struct list *prev, *next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 block = BLOCK (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 type = _heapinfo[block].busy.type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 switch (type)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
701 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
702 case 0:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 /* Get as many statistics as early as we can. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
704 --_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
705 _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
706 _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708 /* Find the free cluster previous to this one in the free list.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
709 Start searching at the last block referenced; this may benefit
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 programs with locality of allocation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
711 i = _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
712 if (i > block)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 while (i > block)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714 i = _heapinfo[i].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
715 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
717 do
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
718 i = _heapinfo[i].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
719 while (i > 0 && i < block);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
720 i = _heapinfo[i].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
721 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
722
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 /* Determine how to link this block into the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724 if (block == i + _heapinfo[i].free.size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
725 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
726 /* Coalesce this block with its predecessor. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
727 _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728 block = i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
729 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 /* Really link this block back into the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
734 _heapinfo[block].free.next = _heapinfo[i].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
735 _heapinfo[block].free.prev = i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
736 _heapinfo[i].free.next = block;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
737 _heapinfo[_heapinfo[block].free.next].free.prev = block;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738 ++_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
740
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741 /* Now that the block is linked in, see if we can coalesce it
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 with its successor (by deleting its successor from the list
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 and adding in its size). */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
744 if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
745 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
746 _heapinfo[block].free.size
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
747 += _heapinfo[_heapinfo[block].free.next].free.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 _heapinfo[block].free.next
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 = _heapinfo[_heapinfo[block].free.next].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750 _heapinfo[_heapinfo[block].free.next].free.prev = block;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 --_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
752 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
753
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
754 /* Now see if we can return stuff to the system. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755 blocks = _heapinfo[block].free.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 if (blocks >= FINAL_FREE_BLOCKS && block + blocks == _heaplimit
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757 && (*__morecore) (0) == ADDRESS (block + blocks))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
759 register size_t bytes = blocks * BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
760 _heaplimit -= blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
761 (*__lesscore) (ADDRESS(block), bytes);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
762 _heapinfo[_heapinfo[block].free.prev].free.next
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
763 = _heapinfo[block].free.next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
764 _heapinfo[_heapinfo[block].free.next].free.prev
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
765 = _heapinfo[block].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
766 block = _heapinfo[block].free.prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
767 --_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
768 _bytes_free -= bytes;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
769 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
770
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
771 /* Set the next search to begin at this block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 _heapindex = block;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
774
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
775 default:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
776 /* Do some of the statistics. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
777 --_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
778 _bytes_used -= 1 << type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
779 ++_chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
780 _bytes_free += 1 << type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
782 /* Get the address of the first free fragment in this block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
783 prev = (struct list *) ((char *) ADDRESS (block) +
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
784 (_heapinfo[block].busy.info.frag.first << type));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
785 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
786 printf("_free_internal(0%o/0x%x/%d) :\n", ptr, ptr, ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
787 printf(" block = %d, type = %d, prev = 0%o/0x%x/%d\n",
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
788 block, type, prev, prev, prev);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
789 printf(" _heapinfo[block=%d].busy.info.frag.nfree = %d\n",
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
790 block,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
791 _heapinfo[block].busy.info.frag.nfree);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
792 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
794 if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
795 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
796 /* If all fragments of this block are free, remove them
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
797 from the fragment list and free the whole block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
798 next = prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
799 for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
800 next = next->next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
801 prev->prev->next = next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
802 if (next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
803 next->prev = prev->prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
804 _heapinfo[block].busy.type = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
805 _heapinfo[block].busy.info.size = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
806
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
807 /* Keep the statistics accurate. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808 ++_chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
809 _bytes_used += BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
810 _chunks_free -= BLOCKSIZE >> type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
811 _bytes_free -= BLOCKSIZE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
812
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
813 free (ADDRESS (block));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
814 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 else if (_heapinfo[block].busy.info.frag.nfree != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
816 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
817 /* If some fragments of this block are free, link this
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
818 fragment into the fragment list after the first free
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
819 fragment of this block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
820 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
821 printf("There's a bug hiding here (%s:%d), so I will print some values\n", __FILE__, __LINE__);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
822 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
823 next = (struct list *) ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
824 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
825 printf(" (struct list *)next (0%o / 0x%x / %d) ->\n", next, next, next);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
826 printf(" next = 0%o / 0x%x / %d\n", next->next,next->next,next->next);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
827 printf(" prev = 0%o / 0x%x / %d\n", next->prev,next->prev,next->prev);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
828 printf(" (struct list *)prev (0%o / 0x%x / %d)->\n", prev, prev, prev);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
829 printf(" next = 0%o / 0x%x / %d\n", prev->next,prev->next,prev->next);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
830 printf(" prev = 0%o / 0x%x / %d\n", prev->prev,prev->prev,prev->prev);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
831 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
832 next->next = prev->next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
833 next->prev = prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
834 prev->next = next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
835 if (next->next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
836 next->next->prev = next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
837 ++_heapinfo[block].busy.info.frag.nfree;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
838 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
839 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
840 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
841 /* No fragments of this block are free, so link this
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
842 fragment into the fragment list and announce that
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
843 it is the first free fragment of this block. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
844 prev = (struct list *) ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
845 _heapinfo[block].busy.info.frag.nfree = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
846 _heapinfo[block].busy.info.frag.first = (unsigned long int)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
847 ((unsigned long int) ((char *) ptr - (char *) NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
848 % BLOCKSIZE >> type);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
849 prev->next = _fraghead[type].next;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 prev->prev = &_fraghead[type];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851 prev->prev->next = prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 if (prev->next != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
853 prev->next->prev = prev;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
854 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
855 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
856 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
857 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
859 /* Return memory to the heap. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860 void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 free (ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864 register struct alignlist *l;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 if (ptr == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 return;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 for (l = _aligned_blocks; l != NULL; l = l->next)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870 if (l->aligned == ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
871 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
872 l->aligned = NULL; /* Mark the slot in the list as free. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
873 ptr = l->exact;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
874 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
876
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
877 if (__free_hook != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
878 (*__free_hook) (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
879 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
880 _free_internal (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
881 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
882 /* Change the size of a block allocated by `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
883 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
884 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
885
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
886 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
887 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
888 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
889 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
890
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
891 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
892 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
894 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
895
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
896 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
897 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
900
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
901 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
902 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
903
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
905 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
906 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
907 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
909 #define min(A, B) ((A) < (B) ? (A) : (B))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
910
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
911 /* Debugging hook for realloc. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
912 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
913 __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size)) = __vms_realloc;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
914 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
915 __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
916 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
917
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
918 /* Resize the given region to the new size, returning a pointer
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
919 to the (possibly moved) region. This is optimized for speed;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 some benchmarks seem to indicate that greater compactness is
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
921 achieved by unconditionally allocating and copying to a
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
922 new region. This module has incestuous knowledge of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923 internals of both free and malloc. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 realloc (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
929 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
930 int type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
931 size_t block, blocks, oldlimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
932
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
933 if (size == 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
934 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
935 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
936 return malloc (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
937 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
938 else if (ptr == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 return malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
941 if (__realloc_hook != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
942 return (*__realloc_hook) (ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
943
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
944 block = BLOCK (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
945
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
946 type = _heapinfo[block].busy.type;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
947 switch (type)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
948 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 case 0:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 /* Maybe reallocate a large block to a small fragment. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 if (size <= BLOCKSIZE / 2)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
952 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
953 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
954 if (result != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
955 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
956 memcpy (result, ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
957 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
958 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
959 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
960 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 /* The new size is a large allocation as well;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 see if we can hold it in place. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964 blocks = BLOCKIFY (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 if (blocks < _heapinfo[block].busy.info.size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
966 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 /* The new size is smaller; return
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 excess memory to the free list. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 _heapinfo[block + blocks].busy.type = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
970 _heapinfo[block + blocks].busy.info.size
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 = _heapinfo[block].busy.info.size - blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 _heapinfo[block].busy.info.size = blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 free (ADDRESS (block + blocks));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 result = ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 else if (blocks == _heapinfo[block].busy.info.size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
977 /* No size change necessary. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 result = ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 /* Won't fit, so allocate a new region that will.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 Free the old region first in case there is sufficient
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 adjacent free space to grow without moving. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 blocks = _heapinfo[block].busy.info.size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 /* Prevent free from actually returning memory to the system. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 oldlimit = _heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 _heaplimit = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 _heaplimit = oldlimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 /* Now we're really in trouble. We have to unfree
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 the thing we just freed. Unfortunately it might
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 have been coalesced with its neighbors. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996 if (_heapindex == block)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 (void) malloc (blocks * BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 __ptr_t previous = malloc ((block - _heapindex) * BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 (void) malloc (blocks * BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 free (previous);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1005 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006 if (ptr != result)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007 memmove (result, ptr, blocks * BLOCKSIZE);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1010
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011 default:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1012 /* Old size is a fragment; type is logarithm
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 to base two of the fragment size. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014 if (size > (size_t) (1 << (type - 1)) && size <= (size_t) (1 << type))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1015 /* The new size is the same kind of fragment. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1016 result = ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1018 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1019 /* The new size is different; allocate a new space,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020 and copy the lesser of the new size and the old. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024 memcpy (result, ptr, min (size, (size_t) 1 << type));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1026 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1036 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1039 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1040 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1041 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1042 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1043
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1044 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1045 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1046 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1047 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1048
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1049 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1053 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1054 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1055 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1056
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1057 /* Allocate an array of NMEMB elements each SIZE bytes long.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1058 The entire array is initialized to zeros. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1059 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1060 calloc (nmemb, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1061 register size_t nmemb;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1062 register size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1063 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1064 register __ptr_t result = malloc (nmemb * size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1065
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1066 if (result != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 (void) memset (result, 0, nmemb * size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1068
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072 This file is part of the GNU C Library.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1073
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1074 The GNU C Library is free software; you can redistribute it and/or modify
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1075 it under the terms of the GNU General Public License as published by
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1076 the Free Software Foundation; either version 2, or (at your option)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1077 any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1078
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1079 The GNU C Library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1080 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1081 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1082 GNU General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1083
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1084 You should have received a copy of the GNU General Public License
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1085 along with the GNU C Library; see the file COPYING. If not, write to
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1086 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1087
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1088 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1090 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1091 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1092
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1093 #ifndef __GNU_LIBRARY__
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1094 #define __sbrk sbrk
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1095 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1096 #define __brk brk
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1097 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1098 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1099
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1100 extern __ptr_t __sbrk __P ((int increment));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1101
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1102 #ifndef NULL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1103 #define NULL 0
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1104 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1105
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1106 #if defined(emacs) && defined(VMS)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1107 /* Dumping of Emacs on VMS does not include the heap!
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1108 So let's make a huge array from which initial data will be
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1109 allocated.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1110
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1111 VMS_ALLOCATION_SIZE is the amount of memory we preallocate.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1112 We don't want it to be too large, because it only gives a larger
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1113 dump file. The way to check how much is really used is to
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1114 make VMS_ALLOCATION_SIZE very large, to link Emacs with the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1115 debugger, run Emacs, check how much was allocated. Then set
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1116 VMS_ALLOCATION_SIZE to something suitable, recompile gmalloc,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1117 relink Emacs, and you should be off.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1118
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1119 N.B. This is experimental, but it worked quite fine on Emacs 18.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1120 */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1121 #ifndef VMS_ALLOCATION_SIZE
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1122 #define VMS_ALLOCATION_SIZE (512*(512+128))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1123 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1124
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1125 int vms_out_initial = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1126 char vms_initial_buffer[VMS_ALLOCATION_SIZE];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1127 char *vms_current_brk = vms_initial_buffer;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1128 char *vms_end_brk = &vms_initial_buffer[VMS_ALLOCATION_SIZE-1];
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1129
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1130 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1131 __vms_initial_morecore (increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1132 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1133 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1134 __ptr_t result = NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1135 __ptr_t temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1136
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1137 /* It's far easier to make the alignment here than to make a
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1138 kludge in align () */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1139 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1140 printf(">>>foo... %p...", vms_current_brk);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1141 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1142 vms_current_brk += (BLOCKSIZE - ((unsigned long) vms_current_brk
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1143 & (BLOCKSIZE - 1))) & (BLOCKSIZE - 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1144 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1145 printf("bar... %p. (%d)\n", vms_current_brk, increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1146 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1147 temp = vms_current_brk + (int) increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1148 if (temp <= vms_end_brk)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1149 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1150 if (increment >= 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1151 result = vms_current_brk;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1152 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1153 result = temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1154 vms_current_brk = temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1155 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1156 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1157 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1158
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1159 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1160 __vms_initial_lesscore (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1161 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1162 ptrdiff_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1163 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1164 if (ptr >= vms_initial_buffer
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1165 && ptr < vms_initial_buffer+VMS_ALLOCATION_SIZE)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1166 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1167 vms_current_brk = ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1168 return vms_current_brk;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1169 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1170 return vms_current_brk;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1171 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1172
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1173 VMS_present_buffer()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1174 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1175 printf("Vms initial buffer starts at 0%o/0x%x/%d and ends at 0%o/0x%x/%d\n",
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1176 vms_initial_buffer, vms_initial_buffer, vms_initial_buffer,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1177 vms_end_brk, vms_end_brk, vms_end_brk);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1178 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1179 #endif /* defined(emacs) && defined(VMS) */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1180
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1181 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1182 /* Unfortunatelly, the VAX C sbrk() is buggy. For example, it returns
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1183 memory in 512 byte chunks (not a bug, but there's more), AND it
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1184 adds an extra 512 byte chunk if you ask for a multiple of 512
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1185 bytes (you ask for 512 bytes, you get 1024 bytes...). And also,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1186 the VAX C sbrk does not handle negative increments...
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1187 There's a similar problem with brk(). Even if you set the break
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1188 to an even page boundary, it gives you one extra page... */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1189
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1190 static char vms_brk_info_fetched = -1; /* -1 if this is the first time, otherwise
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1191 bit 0 set if 'increment' needs adjustment
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1192 bit 1 set if the value to brk() needs adjustment */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1193 static char *vms_brk_start = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1194 static char *vms_brk_end = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1195 static char *vms_brk_current = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1196 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1197
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1198 /* Allocate INCREMENT more bytes of data space,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1199 and return the start of data space, or NULL on errors.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1200 If INCREMENT is negative, shrink data space. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1201 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1202 __default_morecore (increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1203 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1204 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1205 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1206 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1207 __ptr_t temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1208
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1209 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1210 printf("DEBUG: morecore: increment = %x\n", increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1211 printf(" @ start: vms_brk_info_fetched = %x\n", vms_brk_info_fetched);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1212 printf(" vms_brk_start = %p\n", vms_brk_start);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1213 printf(" vms_brk_current = %p\n", vms_brk_current);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1214 printf(" vms_brk_end = %p\n", vms_brk_end);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1215 printf(" @ end: ");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1216 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1217
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1218 if (vms_brk_info_fetched < 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1219 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1220 vms_brk_current = vms_brk_start = __sbrk (512);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1221 vms_brk_end = __sbrk (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1222 if (vms_brk_end - vms_brk_current == 1024)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1223 vms_brk_info_fetched = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1224 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1225 vms_brk_info_fetched = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1226 vms_brk_end = brk(vms_brk_start);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1227 if (vms_brk_end != vms_brk_start)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1228 vms_brk_info_fetched |= 2;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1229 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1230 printf("vms_brk_info_fetched = %x\n", vms_brk_info_fetched);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1231 printf(" vms_brk_start = %p\n", vms_brk_start);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1232 printf(" vms_brk_current = %p\n", vms_brk_current);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1233 printf(" vms_brk_end = %p\n", vms_brk_end);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1234 printf(" ");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1235 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1236 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1237
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1238 if (increment < 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1239 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1240 printf("BZZZZZT! ERROR: __default_morecore does NOT take negative args\n");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1241 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1242 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1243
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1244 if (increment > 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1245 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1246 result = vms_brk_current;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1247 temp = vms_brk_current + increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1248
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1249 if (temp > vms_brk_end)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1250 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1251 __ptr_t foo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1252
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1253 foo = __sbrk (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1254 if (foo == vms_brk_end)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1255 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1256 increment = temp - vms_brk_end;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1257 if (increment > (vms_brk_info_fetched & 1))
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1258 increment -= (vms_brk_info_fetched & 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1259 foo = __sbrk(increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1260 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1261 printf("__sbrk(%d) --> %p\n", increment, foo);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1262 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1263 if (foo == (__ptr_t) -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1264 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1265 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1266 printf(" ");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1267 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1268 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1269 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1270 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1271 result = __sbrk (increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1272
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1273 if (result == (__ptr_t) -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1274 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1275
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1276 temp = result + increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1277 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1278
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1279 vms_brk_end = __sbrk(0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1280 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1281 vms_brk_current = temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1282 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1283 printf("vms_brk_current = %p\n", vms_brk_current);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1284 printf(" vms_brk_end = %p\n", vms_brk_end);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1285 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1286 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1287 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1288 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1289 printf(" nothing more...\n");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1290 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1291
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1292 /* OK, so the user wanted to check where the heap limit is. Let's
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1293 see if the system thinks it is where we think it is. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1294 temp = __sbrk (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1295 if (temp != vms_brk_end)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1296 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1297 /* the value has changed.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1298 Let's trust the system and modify our value */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1299 vms_brk_current = vms_brk_end = temp;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1300 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1301 return vms_brk_current;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1302
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1303 #else /* not VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1304 result = __sbrk ((int) increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1305 if (result == (__ptr_t) -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1306 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1307 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1308 #endif /* VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1309 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1310
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1311 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1312 __default_lesscore (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1313 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1314 ptrdiff_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1315 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1316 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1317 if (vms_brk_end != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1318 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1319 vms_brk_current = ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1320 if (vms_brk_current < vms_brk_start)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1321 vms_brk_current = vms_brk_start;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1322 vms_brk_end = (char *) vms_brk_current -
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1323 ((vms_brk_info_fetched >> 1) & 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1324 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1325 printf("<<<bar... %p (%p (%p, %d))...",
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1326 vms_brk_end, vms_brk_current, ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1327 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1328 vms_brk_end = __brk (vms_brk_end);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1329 #ifdef RL_DEBUG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1330 printf("foo... %p.\n", vms_brk_end);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1331 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1332 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1333
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1334 return vms_brk_current;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1335 #else /* not VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1336 __default_morecore (-size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1337 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1338 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1339
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1340 /* Allocate memory on a page boundary.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1341 Copyright (C) 1991, 1992 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1342
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1343 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1344 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1345 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1346 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1347
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1348 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1349 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1350 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1351 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1352
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1353 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1354 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1355 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1356 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1357
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1358 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1359 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1360
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1361 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1362 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1363 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1364 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1365
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1366 #if defined (emacs) || defined (HAVE_CONFIG_H)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1367 #include "config.h"
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1368 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1369
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1370 #ifdef __GNU_LIBRARY__
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1371 extern size_t __getpagesize __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1372 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1373 #if !defined(USG) && !defined(VMS)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1374 extern size_t getpagesize __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1375 #define __getpagesize() getpagesize()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1376 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1377 #include <sys/param.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1378 #ifdef EXEC_PAGESIZE
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1379 #define __getpagesize() EXEC_PAGESIZE
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1380 #else /* No EXEC_PAGESIZE. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1381 #ifdef NBPG
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1382 #ifndef CLSIZE
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1383 #define CLSIZE 1
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1384 #endif /* No CLSIZE. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1385 #define __getpagesize() (NBPG * CLSIZE)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1386 #else /* No NBPG. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1387 #define __getpagesize() NBPC
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1388 #endif /* NBPG. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1389 #endif /* EXEC_PAGESIZE. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1390 #endif /* USG. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1391 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1392
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1393 static size_t pagesize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1394
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1395 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1396 valloc (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1397 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1398 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1399 if (pagesize == 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1400 pagesize = __getpagesize ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1401
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1402 return memalign (pagesize, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1403 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1404 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1405
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1406 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1407 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1408 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1409 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1410
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1411 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1412 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1413 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1414 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1415
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1416 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1417 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1418 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1419 Cambridge, MA 02139, USA. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1420
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1421 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1422 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1423 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1424 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1425
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1426 __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1427 memalign (alignment, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1428 size_t alignment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1429 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1430 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1431 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1432 unsigned long int adj;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1433
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1434 size = ((size + alignment - 1) / alignment) * alignment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1435
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1436 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1437 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1438 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1439 adj = (unsigned long int) ((unsigned long int) ((char *) result -
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1440 (char *) NULL)) % alignment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1441 if (adj != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1442 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1443 struct alignlist *l;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1444 for (l = _aligned_blocks; l != NULL; l = l->next)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1445 if (l->aligned == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1446 /* This slot is free. Use it. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1447 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1448 if (l == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1449 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1450 l = (struct alignlist *) malloc (sizeof (struct alignlist));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1451 if (l == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1452 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1453 free (result);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1454 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1455 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1456 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1457 l->exact = result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1458 result = l->aligned = (char *) result + alignment - adj;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1459 l->next = _aligned_blocks;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1460 _aligned_blocks = l;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1461 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1462
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1463 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1464 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1465
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1466 #ifdef VMS
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1467 struct vms_malloc_data
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1468 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1469 int __malloc_initialized;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1470 char *_heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1471 malloc_info *_heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1472 size_t heapsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1473 size_t _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1474 size_t _heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1475 size_t _chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1476 size_t _bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1477 size_t _chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1478 size_t _bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1479 } ____vms_malloc_data[] =
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1480 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1481 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1482 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1483 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1484
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1485 struct vms_core_routines
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1486 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1487 __ptr_t (*__morecore) __P ((ptrdiff_t increment));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1488 __ptr_t (*__lesscore) __P ((__ptr_t address, ptrdiff_t increment));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1489 } ____vms_core_routines[] =
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1490 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1491 { __vms_initial_morecore, __vms_initial_lesscore },
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1492 { __default_morecore, __default_lesscore },
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1493 { 0, 0 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1494 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1495
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1496 static int current_vms_data = -1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1497 static int current_vms_core_routines = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1498
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1499 static void use_vms_core_routines (int i)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1500 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1501 current_vms_core_routines = i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1502 current_vms_data = i;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1503 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1504
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1505 static void use_vms_data (int i)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1506 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1507 use_vms_core_routines (i);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1508 __malloc_initialized = ____vms_malloc_data[i].__malloc_initialized;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1509 _heapbase = ____vms_malloc_data[i]._heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1510 _heapinfo = ____vms_malloc_data[i]._heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1511 heapsize = ____vms_malloc_data[i].heapsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1512 _heapindex = ____vms_malloc_data[i]._heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1513 _heaplimit = ____vms_malloc_data[i]._heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1514 _chunks_used = ____vms_malloc_data[i]._chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1515 _bytes_used = ____vms_malloc_data[i]._bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1516 _chunks_free = ____vms_malloc_data[i]._chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1517 _bytes_free = ____vms_malloc_data[i]._bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1518 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1519
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1520 static void store_vms_data (int i)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1521 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1522 ____vms_malloc_data[i].__malloc_initialized = __malloc_initialized;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1523 ____vms_malloc_data[i]._heapbase = _heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1524 ____vms_malloc_data[i]._heapinfo = _heapinfo;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1525 ____vms_malloc_data[i].heapsize = heapsize;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1526 ____vms_malloc_data[i]._heapindex = _heapindex;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1527 ____vms_malloc_data[i]._heaplimit = _heaplimit;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1528 ____vms_malloc_data[i]._chunks_used = _chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1529 ____vms_malloc_data[i]._bytes_used = _bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1530 ____vms_malloc_data[i]._chunks_free = _chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1531 ____vms_malloc_data[i]._bytes_free = _bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1532 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1533
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1534 static void store_current_vms_data ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1535 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1536 switch (current_vms_data)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1537 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1538 case 0:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1539 case 1:
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1540 store_vms_data (current_vms_data);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1541 break;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1542 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1543 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1544
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1545 __ptr_t __vms_morecore (increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1546 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1547 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1548 return
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1549 (*____vms_core_routines[current_vms_core_routines].__morecore) (increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1550 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1551
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1552 __ptr_t __vms_lesscore (ptr, increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1553 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1554 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1555 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1556 return
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1557 (*____vms_core_routines[current_vms_core_routines].__lesscore) (ptr,increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1558 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1559
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1560 __ptr_t __vms_malloc (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1561 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1562 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1563 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1564 int old_current_vms_data = current_vms_data;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1565
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1566 __malloc_hook = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1567
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1568 store_current_vms_data ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1569
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1570 if (____vms_malloc_data[0]._heapbase != 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1571 use_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1572 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1573 use_vms_core_routines (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1574 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1575 store_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1576 if (result == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1577 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1578 use_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1579 result = malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1580 store_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1581 vms_out_initial = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1582 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1583 __malloc_hook = __vms_malloc;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1584 if (old_current_vms_data != -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1585 use_vms_data (current_vms_data);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1586 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1587 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1588
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1589 void __vms_free (ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1590 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1591 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1592 int old_current_vms_data = current_vms_data;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1593
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1594 __free_hook = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1595
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1596 store_current_vms_data ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1597
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1598 if (ptr >= vms_initial_buffer && ptr <= vms_end_brk)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1599 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1600 use_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1601 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1602 store_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1603 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1604 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1605 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1606 use_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1607 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1608 store_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1609 if (_chunks_free == 0 && _chunks_used == 0)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1610 vms_out_initial = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1611 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1612 __free_hook = __vms_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1613 if (old_current_vms_data != -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1614 use_vms_data (current_vms_data);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1615 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1616
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1617 __ptr_t __vms_realloc (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1618 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1619 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1620 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1621 __ptr_t result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1622 int old_current_vms_data = current_vms_data;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1623
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1624 __realloc_hook = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1625
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1626 store_current_vms_data ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1627
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1628 if (ptr >= vms_initial_buffer && ptr <= vms_end_brk)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1629 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1630 use_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1631 result = realloc (ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1632 store_vms_data (0);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1633 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1634 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1635 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1636 use_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1637 result = realloc (ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1638 store_vms_data (1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1639 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1640 __realloc_hook = __vms_realloc;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1641 if (old_current_vms_data != -1)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1642 use_vms_data (current_vms_data);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1643 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1644 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1645 #endif /* VMS */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1646 /* Standard debugging hooks for `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1647 Copyright 1990, 1991, 1992 Free Software Foundation
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1648 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1649
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1650 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1651 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1652 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1653 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1654
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1655 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1656 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1657 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1658 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1659
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1660 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1661 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1662 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1663 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1664
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1665 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1666 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1667
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1668 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1669 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1670 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1671 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1672
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1673 /* Old hook values. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1674 static void (*old_free_hook) __P ((__ptr_t ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1675 static __ptr_t (*old_malloc_hook) __P ((size_t size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1676 static __ptr_t (*old_realloc_hook) __P ((__ptr_t ptr, size_t size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1677
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1678 /* Function to call when something awful happens. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1679 static void (*abortfunc) __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1680
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1681 /* Arbitrary magical numbers. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1682 #define MAGICWORD 0xfedabeeb
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1683 #define MAGICBYTE ((char) 0xd7)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1684
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1685 struct hdr
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1686 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1687 size_t size; /* Exact size requested by user. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1688 unsigned long int magic; /* Magic number to check header integrity. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1689 };
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1690
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1691 static void checkhdr __P ((__const struct hdr *));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1692 static void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1693 checkhdr (hdr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1694 __const struct hdr *hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1695 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1696 if (hdr->magic != MAGICWORD || ((char *) &hdr[1])[hdr->size] != MAGICBYTE)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1697 (*abortfunc) ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1698 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1699
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1700 static void freehook __P ((__ptr_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1701 static void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1702 freehook (ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1703 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1704 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1705 struct hdr *hdr = ((struct hdr *) ptr) - 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1706 checkhdr (hdr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1707 hdr->magic = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1708 __free_hook = old_free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1709 free (hdr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1710 __free_hook = freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1711 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1712
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1713 static __ptr_t mallochook __P ((size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1714 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1715 mallochook (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1716 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1717 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1718 struct hdr *hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1719
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1720 __malloc_hook = old_malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1721 hdr = (struct hdr *) malloc (sizeof (struct hdr) + size + 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1722 __malloc_hook = mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1723 if (hdr == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1724 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1725
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1726 hdr->size = size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1727 hdr->magic = MAGICWORD;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1728 ((char *) &hdr[1])[size] = MAGICBYTE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1729 return (__ptr_t) (hdr + 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1730 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1731
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1732 static __ptr_t reallochook __P ((__ptr_t, size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1733 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1734 reallochook (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1735 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1736 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1737 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1738 struct hdr *hdr = ((struct hdr *) ptr) - 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1739
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1740 checkhdr (hdr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1741 __free_hook = old_free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1742 __malloc_hook = old_malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1743 __realloc_hook = old_realloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1744 hdr = (struct hdr *) realloc ((__ptr_t) hdr, sizeof (struct hdr) + size + 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1745 __free_hook = freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1746 __malloc_hook = mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1747 __realloc_hook = reallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1748 if (hdr == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1749 return NULL;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1750
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1751 hdr->size = size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1752 ((char *) &hdr[1])[size] = MAGICBYTE;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1753 return (__ptr_t) (hdr + 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1754 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1755
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1756 int
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1757 mcheck (func)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1758 void (*func) __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1759 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1760 extern void abort __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1761 static int mcheck_used = 0;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1762
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1763 abortfunc = (func != NULL) ? func : abort;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1764
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1765 /* These hooks may not be safely inserted if malloc is already in use. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1766 if (!__malloc_initialized && !mcheck_used)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1767 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1768 old_free_hook = __free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1769 __free_hook = freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1770 old_malloc_hook = __malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1771 __malloc_hook = mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1772 old_realloc_hook = __realloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1773 __realloc_hook = reallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1774 mcheck_used = 1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1775 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1776
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1777 return mcheck_used ? 0 : -1;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1778 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1779 /* More debugging hooks for `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1780 Copyright (C) 1991, 1992 Free Software Foundation, Inc.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1781 Written April 2, 1991 by John Gilmore of Cygnus Support.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1782 Based on mcheck.c by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1783
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1784 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1785 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1786 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1787 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1788
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1789 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1790 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1791 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1792 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1793
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1794 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1795 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1796 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1797 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1798
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1799 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1800 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1801
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1802 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1803 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1804 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1805 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1806
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1807 #include <stdio.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1808
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1809 #ifndef __GNU_LIBRARY__
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1810 extern char *getenv ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1811 #else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1812 #include <stdlib.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1813 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1814
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1815 static FILE *mallstream;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1816 static char mallenv[]= "MALLOC_TRACE";
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1817 static char mallbuf[BUFSIZ]; /* Buffer for the output. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1818
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1819 /* Address to breakpoint on accesses to... */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1820 __ptr_t mallwatch;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1821
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1822 /* Old hook values. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1823 static __ptr_t (*tr_old_morecore) __P ((ptrdiff_t increment));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1824 static __ptr_t (*tr_old_lesscore) __P ((__ptr_t ptr, ptrdiff_t increment));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1825 static void (*tr_old_free_hook) __P ((__ptr_t ptr));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1826 static __ptr_t (*tr_old_malloc_hook) __P ((size_t size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1827 static __ptr_t (*tr_old_realloc_hook) __P ((__ptr_t ptr, size_t size));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1828
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1829 /* This function is called when the block being alloc'd, realloc'd, or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1830 freed has an address matching the variable "mallwatch". In a debugger,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1831 set "mallwatch" to the address of interest, then put a breakpoint on
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1832 tr_break. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1833
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1834 void tr_break __P ((void));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1835 void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1836 tr_break ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1837 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1838 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1839
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1840 static void tr_freehook __P ((__ptr_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1841 static void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1842 tr_freehook (ptr)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1843 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1844 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1845 fprintf (mallstream, "- %p\n", ptr); /* Be sure to print it first. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1846 if (ptr == mallwatch)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1847 tr_break ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1848 __free_hook = tr_old_free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1849 free (ptr);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1850 __free_hook = tr_freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1851 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1852
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1853 static __ptr_t tr_morecore __P ((ptrdiff_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1854 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1855 tr_morecore (increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1856 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1857 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1858 __ptr_t p;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1859
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1860 __morecore = tr_old_morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1861 p = (__ptr_t) (*__morecore) (increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1862 __morecore = tr_morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1863
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1864 fprintf (mallstream, "$ %p %d\n", p, increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1865
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1866 return p;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1867 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1868
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1869 static __ptr_t tr_lesscore __P ((__ptr_t, ptrdiff_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1870 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1871 tr_lesscore (ptr, increment)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1872 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1873 ptrdiff_t increment;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1874 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1875 __ptr_t p;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1876
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1877 __lesscore = tr_old_lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1878 p = (__ptr_t) (*__lesscore) (ptr, increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1879 __lesscore = tr_lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1880
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1881 fprintf (mallstream, "* %p (%p, %d)\n", p, ptr, increment);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1882
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1883 return p;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1884 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1885
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1886 static __ptr_t tr_mallochook __P ((size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1887 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1888 tr_mallochook (size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1889 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1890 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1891 __ptr_t hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1892
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1893 __malloc_hook = tr_old_malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1894 hdr = (__ptr_t) malloc (size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1895 __malloc_hook = tr_mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1896
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1897 /* We could be printing a NULL here; that's OK. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1898 fprintf (mallstream, "+ %p %x\n", hdr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1899
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1900 if (hdr == mallwatch)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1901 tr_break ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1902
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1903 return hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1904 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1905
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1906 static __ptr_t tr_reallochook __P ((__ptr_t, size_t));
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1907 static __ptr_t
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1908 tr_reallochook (ptr, size)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1909 __ptr_t ptr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1910 size_t size;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1911 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1912 __ptr_t hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1913
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1914 if (ptr == mallwatch)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1915 tr_break ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1916
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1917 __free_hook = tr_old_free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1918 __malloc_hook = tr_old_malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1919 __realloc_hook = tr_old_realloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1920 hdr = (__ptr_t) realloc (ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1921 __free_hook = tr_freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1922 __malloc_hook = tr_mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1923 __realloc_hook = tr_reallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1924 if (hdr == NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1925 /* Failed realloc. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1926 fprintf (mallstream, "! %p %x\n", ptr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1927 else
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1928 fprintf (mallstream, "< %p\n> %p %x\n", ptr, hdr, size);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1929
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1930 if (hdr == mallwatch)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1931 tr_break ();
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1932
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1933 return hdr;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1934 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1935
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1936 /* We enable tracing if either the environment variable MALLOC_TRACE
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1937 is set, or if the variable mallwatch has been patched to an address
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1938 that the debugging user wants us to stop on. When patching mallwatch,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1939 don't forget to set a breakpoint on tr_break! */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1940
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1941 void
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1942 mtrace ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1943 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1944 char *mallfile;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1945
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1946 mallfile = getenv (mallenv);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1947 if (mallfile != NULL || mallwatch != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1948 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1949 mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1950 if (mallstream != NULL)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1951 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1952 /* Be sure it doesn't malloc its buffer! */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1953 setbuf (mallstream, mallbuf);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1954 fprintf (mallstream, "= Start\n");
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1955 #if defined(emacs) && defined(VMS)
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1956 fprintf (mallstream, "= Initial buffer spans %p -- %p\n",
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1957 vms_initial_buffer, vms_end_brk + 1);
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1958 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1959 tr_old_morecore = __morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1960 __morecore = tr_morecore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1961 tr_old_lesscore = __lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1962 __lesscore = tr_lesscore;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1963 tr_old_free_hook = __free_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1964 __free_hook = tr_freehook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1965 tr_old_malloc_hook = __malloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1966 __malloc_hook = tr_mallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1967 tr_old_realloc_hook = __realloc_hook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1968 __realloc_hook = tr_reallochook;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1969 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1970 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1971 }
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1972 /* Access the statistics maintained by `malloc'.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1973 Copyright 1990, 1991, 1992 Free Software Foundation
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1974 Written May 1989 by Mike Haertel.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1975
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1976 This library is free software; you can redistribute it and/or
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1977 modify it under the terms of the GNU Library General Public License as
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1978 published by the Free Software Foundation; either version 2 of the
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1979 License, or (at your option) any later version.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1980
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1981 This library is distributed in the hope that it will be useful,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1982 but WITHOUT ANY WARRANTY; without even the implied warranty of
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1983 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1984 Library General Public License for more details.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1985
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1986 You should have received a copy of the GNU Library General Public
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1987 License along with this library; see the file COPYING.LIB. If
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1988 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1989 Cambridge, MA 02139, USA.
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1990
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1991 The author may be reached (Email) at the address mike@ai.mit.edu,
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1992 or (US mail) as Mike Haertel c/o Free Software Foundation. */
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1993
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1994 #ifndef _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1995 #define _MALLOC_INTERNAL
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1996 #include <malloc.h>
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1997 #endif
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1998
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1999 struct mstats
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2000 mstats ()
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2001 {
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2002 struct mstats result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2003
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2004 result.bytes_total = (char *) (*__morecore) (0) - _heapbase;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2005 result.chunks_used = _chunks_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2006 result.bytes_used = _bytes_used;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2007 result.chunks_free = _chunks_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2008 result.bytes_free = _bytes_free;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2009 return result;
daa4784ba863 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2010 }