annotate src/gmalloc.c @ 69571:4f6b547120ec

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