]> sourceware.org Git - glibc.git/blob - malloc/malloc.c
* malloc/malloc.c (do_check_malloc_state): Only require for empty
[glibc.git] / malloc / malloc.c
1 /* Malloc implementation for multiple threads without lock contention.
2 Copyright (C) 1996-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Wolfram Gloger <wg@malloc.de>
5 and Doug Lea <dl@cs.oswego.edu>, 2001.
6
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
11
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library; see the file COPYING.LIB. If not,
19 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 /*
23 This is a version (aka ptmalloc2) of malloc/free/realloc written by
24 Doug Lea and adapted to multiple threads/arenas by Wolfram Gloger.
25
26 * Version ptmalloc2-20011215
27 based on:
28 VERSION 2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
29
30 Note: There may be an updated version of this malloc obtainable at
31 http://www.malloc.de/malloc/ptmalloc2.tar.gz
32 Check before installing!
33
34 * Quickstart
35
36 In order to compile this implementation, a Makefile is provided with
37 the ptmalloc2 distribution, which has pre-defined targets for some
38 popular systems (e.g. "make posix" for Posix threads). All that is
39 typically required with regard to compiler flags is the selection of
40 the thread package via defining one out of USE_PTHREADS, USE_THR or
41 USE_SPROC. Check the thread-m.h file for what effects this has.
42 Many/most systems will additionally require USE_TSD_DATA_HACK to be
43 defined, so this is the default for "make posix".
44
45 * Why use this malloc?
46
47 This is not the fastest, most space-conserving, most portable, or
48 most tunable malloc ever written. However it is among the fastest
49 while also being among the most space-conserving, portable and tunable.
50 Consistent balance across these factors results in a good general-purpose
51 allocator for malloc-intensive programs.
52
53 The main properties of the algorithms are:
54 * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
55 with ties normally decided via FIFO (i.e. least recently used).
56 * For small (<= 64 bytes by default) requests, it is a caching
57 allocator, that maintains pools of quickly recycled chunks.
58 * In between, and for combinations of large and small requests, it does
59 the best it can trying to meet both goals at once.
60 * For very large requests (>= 128KB by default), it relies on system
61 memory mapping facilities, if supported.
62
63 For a longer but slightly out of date high-level description, see
64 http://gee.cs.oswego.edu/dl/html/malloc.html
65
66 You may already by default be using a C library containing a malloc
67 that is based on some version of this malloc (for example in
68 linux). You might still want to use the one in this file in order to
69 customize settings or to avoid overheads associated with library
70 versions.
71
72 * Contents, described in more detail in "description of public routines" below.
73
74 Standard (ANSI/SVID/...) functions:
75 malloc(size_t n);
76 calloc(size_t n_elements, size_t element_size);
77 free(Void_t* p);
78 realloc(Void_t* p, size_t n);
79 memalign(size_t alignment, size_t n);
80 valloc(size_t n);
81 mallinfo()
82 mallopt(int parameter_number, int parameter_value)
83
84 Additional functions:
85 independent_calloc(size_t n_elements, size_t size, Void_t* chunks[]);
86 independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
87 pvalloc(size_t n);
88 cfree(Void_t* p);
89 malloc_trim(size_t pad);
90 malloc_usable_size(Void_t* p);
91 malloc_stats();
92
93 * Vital statistics:
94
95 Supported pointer representation: 4 or 8 bytes
96 Supported size_t representation: 4 or 8 bytes
97 Note that size_t is allowed to be 4 bytes even if pointers are 8.
98 You can adjust this by defining INTERNAL_SIZE_T
99
100 Alignment: 2 * sizeof(size_t) (default)
101 (i.e., 8 byte alignment with 4byte size_t). This suffices for
102 nearly all current machines and C compilers. However, you can
103 define MALLOC_ALIGNMENT to be wider than this if necessary.
104
105 Minimum overhead per allocated chunk: 4 or 8 bytes
106 Each malloced chunk has a hidden word of overhead holding size
107 and status information.
108
109 Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
110 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
111
112 When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
113 ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
114 needed; 4 (8) for a trailing size field and 8 (16) bytes for
115 free list pointers. Thus, the minimum allocatable size is
116 16/24/32 bytes.
117
118 Even a request for zero bytes (i.e., malloc(0)) returns a
119 pointer to something of the minimum allocatable size.
120
121 The maximum overhead wastage (i.e., number of extra bytes
122 allocated than were requested in malloc) is less than or equal
123 to the minimum size, except for requests >= mmap_threshold that
124 are serviced via mmap(), where the worst case wastage is 2 *
125 sizeof(size_t) bytes plus the remainder from a system page (the
126 minimal mmap unit); typically 4096 or 8192 bytes.
127
128 Maximum allocated size: 4-byte size_t: 2^32 minus about two pages
129 8-byte size_t: 2^64 minus about two pages
130
131 It is assumed that (possibly signed) size_t values suffice to
132 represent chunk sizes. `Possibly signed' is due to the fact
133 that `size_t' may be defined on a system as either a signed or
134 an unsigned type. The ISO C standard says that it must be
135 unsigned, but a few systems are known not to adhere to this.
136 Additionally, even when size_t is unsigned, sbrk (which is by
137 default used to obtain memory from system) accepts signed
138 arguments, and may not be able to handle size_t-wide arguments
139 with negative sign bit. Generally, values that would
140 appear as negative after accounting for overhead and alignment
141 are supported only via mmap(), which does not have this
142 limitation.
143
144 Requests for sizes outside the allowed range will perform an optional
145 failure action and then return null. (Requests may also
146 also fail because a system is out of memory.)
147
148 Thread-safety: thread-safe unless NO_THREADS is defined
149
150 Compliance: I believe it is compliant with the 1997 Single Unix Specification
151 (See http://www.opennc.org). Also SVID/XPG, ANSI C, and probably
152 others as well.
153
154 * Synopsis of compile-time options:
155
156 People have reported using previous versions of this malloc on all
157 versions of Unix, sometimes by tweaking some of the defines
158 below. It has been tested most extensively on Solaris and
159 Linux. It is also reported to work on WIN32 platforms.
160 People also report using it in stand-alone embedded systems.
161
162 The implementation is in straight, hand-tuned ANSI C. It is not
163 at all modular. (Sorry!) It uses a lot of macros. To be at all
164 usable, this code should be compiled using an optimizing compiler
165 (for example gcc -O3) that can simplify expressions and control
166 paths. (FAQ: some macros import variables as arguments rather than
167 declare locals because people reported that some debuggers
168 otherwise get confused.)
169
170 OPTION DEFAULT VALUE
171
172 Compilation Environment options:
173
174 __STD_C derived from C compiler defines
175 WIN32 NOT defined
176 HAVE_MEMCPY defined
177 USE_MEMCPY 1 if HAVE_MEMCPY is defined
178 HAVE_MMAP defined as 1
179 MMAP_CLEARS 1
180 HAVE_MREMAP 0 unless linux defined
181 USE_ARENAS the same as HAVE_MMAP
182 malloc_getpagesize derived from system #includes, or 4096 if not
183 HAVE_USR_INCLUDE_MALLOC_H NOT defined
184 LACKS_UNISTD_H NOT defined unless WIN32
185 LACKS_SYS_PARAM_H NOT defined unless WIN32
186 LACKS_SYS_MMAN_H NOT defined unless WIN32
187
188 Changing default word sizes:
189
190 INTERNAL_SIZE_T size_t
191 MALLOC_ALIGNMENT MAX (2 * sizeof(INTERNAL_SIZE_T),
192 __alignof__ (long double))
193
194 Configuration and functionality options:
195
196 USE_DL_PREFIX NOT defined
197 USE_PUBLIC_MALLOC_WRAPPERS NOT defined
198 USE_MALLOC_LOCK NOT defined
199 MALLOC_DEBUG NOT defined
200 REALLOC_ZERO_BYTES_FREES 1
201 MALLOC_FAILURE_ACTION errno = ENOMEM, if __STD_C defined, else no-op
202 TRIM_FASTBINS 0
203
204 Options for customizing MORECORE:
205
206 MORECORE sbrk
207 MORECORE_FAILURE -1
208 MORECORE_CONTIGUOUS 1
209 MORECORE_CANNOT_TRIM NOT defined
210 MORECORE_CLEARS 1
211 MMAP_AS_MORECORE_SIZE (1024 * 1024)
212
213 Tuning options that are also dynamically changeable via mallopt:
214
215 DEFAULT_MXFAST 64
216 DEFAULT_TRIM_THRESHOLD 128 * 1024
217 DEFAULT_TOP_PAD 0
218 DEFAULT_MMAP_THRESHOLD 128 * 1024
219 DEFAULT_MMAP_MAX 65536
220
221 There are several other #defined constants and macros that you
222 probably don't want to touch unless you are extending or adapting malloc. */
223
224 /*
225 __STD_C should be nonzero if using ANSI-standard C compiler, a C++
226 compiler, or a C compiler sufficiently close to ANSI to get away
227 with it.
228 */
229
230 #ifndef __STD_C
231 #if defined(__STDC__) || defined(__cplusplus)
232 #define __STD_C 1
233 #else
234 #define __STD_C 0
235 #endif
236 #endif /*__STD_C*/
237
238
239 /*
240 Void_t* is the pointer type that malloc should say it returns
241 */
242
243 #ifndef Void_t
244 #if (__STD_C || defined(WIN32))
245 #define Void_t void
246 #else
247 #define Void_t char
248 #endif
249 #endif /*Void_t*/
250
251 #if __STD_C
252 #include <stddef.h> /* for size_t */
253 #include <stdlib.h> /* for getenv(), abort() */
254 #else
255 #include <sys/types.h>
256 #endif
257
258 #include <malloc-machine.h>
259
260 #ifdef _LIBC
261 #include <stdio-common/_itoa.h>
262 #include <bits/wordsize.h>
263 #endif
264
265 #ifdef __cplusplus
266 extern "C" {
267 #endif
268
269 /* define LACKS_UNISTD_H if your system does not have a <unistd.h>. */
270
271 /* #define LACKS_UNISTD_H */
272
273 #ifndef LACKS_UNISTD_H
274 #include <unistd.h>
275 #endif
276
277 /* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. */
278
279 /* #define LACKS_SYS_PARAM_H */
280
281
282 #include <stdio.h> /* needed for malloc_stats */
283 #include <errno.h> /* needed for optional MALLOC_FAILURE_ACTION */
284
285 /* For uintptr_t. */
286 #include <stdint.h>
287
288 /* For va_arg, va_start, va_end. */
289 #include <stdarg.h>
290
291 /* For writev and struct iovec. */
292 #include <sys/uio.h>
293 /* For syslog. */
294 #include <sys/syslog.h>
295
296 /* For various dynamic linking things. */
297 #include <dlfcn.h>
298
299
300 /*
301 Debugging:
302
303 Because freed chunks may be overwritten with bookkeeping fields, this
304 malloc will often die when freed memory is overwritten by user
305 programs. This can be very effective (albeit in an annoying way)
306 in helping track down dangling pointers.
307
308 If you compile with -DMALLOC_DEBUG, a number of assertion checks are
309 enabled that will catch more memory errors. You probably won't be
310 able to make much sense of the actual assertion errors, but they
311 should help you locate incorrectly overwritten memory. The checking
312 is fairly extensive, and will slow down execution
313 noticeably. Calling malloc_stats or mallinfo with MALLOC_DEBUG set
314 will attempt to check every non-mmapped allocated and free chunk in
315 the course of computing the summmaries. (By nature, mmapped regions
316 cannot be checked very much automatically.)
317
318 Setting MALLOC_DEBUG may also be helpful if you are trying to modify
319 this code. The assertions in the check routines spell out in more
320 detail the assumptions and invariants underlying the algorithms.
321
322 Setting MALLOC_DEBUG does NOT provide an automated mechanism for
323 checking that all accesses to malloced memory stay within their
324 bounds. However, there are several add-ons and adaptations of this
325 or other mallocs available that do this.
326 */
327
328 #if MALLOC_DEBUG
329 #include <assert.h>
330 #else
331 #undef assert
332 #define assert(x) ((void)0)
333 #endif
334
335
336 /*
337 INTERNAL_SIZE_T is the word-size used for internal bookkeeping
338 of chunk sizes.
339
340 The default version is the same as size_t.
341
342 While not strictly necessary, it is best to define this as an
343 unsigned type, even if size_t is a signed type. This may avoid some
344 artificial size limitations on some systems.
345
346 On a 64-bit machine, you may be able to reduce malloc overhead by
347 defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the
348 expense of not being able to handle more than 2^32 of malloced
349 space. If this limitation is acceptable, you are encouraged to set
350 this unless you are on a platform requiring 16byte alignments. In
351 this case the alignment requirements turn out to negate any
352 potential advantages of decreasing size_t word size.
353
354 Implementors: Beware of the possible combinations of:
355 - INTERNAL_SIZE_T might be signed or unsigned, might be 32 or 64 bits,
356 and might be the same width as int or as long
357 - size_t might have different width and signedness as INTERNAL_SIZE_T
358 - int and long might be 32 or 64 bits, and might be the same width
359 To deal with this, most comparisons and difference computations
360 among INTERNAL_SIZE_Ts should cast them to unsigned long, being
361 aware of the fact that casting an unsigned int to a wider long does
362 not sign-extend. (This also makes checking for negative numbers
363 awkward.) Some of these casts result in harmless compiler warnings
364 on some systems.
365 */
366
367 #ifndef INTERNAL_SIZE_T
368 #define INTERNAL_SIZE_T size_t
369 #endif
370
371 /* The corresponding word size */
372 #define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
373
374
375 /*
376 MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.
377 It must be a power of two at least 2 * SIZE_SZ, even on machines
378 for which smaller alignments would suffice. It may be defined as
379 larger than this though. Note however that code and data structures
380 are optimized for the case of 8-byte alignment.
381 */
382
383
384 #ifndef MALLOC_ALIGNMENT
385 /* XXX This is the correct definition. It differs from 2*SIZE_SZ only on
386 powerpc32. For the time being, changing this is causing more
387 compatibility problems due to malloc_get_state/malloc_set_state than
388 will returning blocks not adequately aligned for long double objects
389 under -mlong-double-128.
390
391 #define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
392 ? __alignof__ (long double) : 2 * SIZE_SZ)
393 */
394 #define MALLOC_ALIGNMENT (2 * SIZE_SZ)
395 #endif
396
397 /* The corresponding bit mask value */
398 #define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
399
400
401
402 /*
403 REALLOC_ZERO_BYTES_FREES should be set if a call to
404 realloc with zero bytes should be the same as a call to free.
405 This is required by the C standard. Otherwise, since this malloc
406 returns a unique pointer for malloc(0), so does realloc(p, 0).
407 */
408
409 #ifndef REALLOC_ZERO_BYTES_FREES
410 #define REALLOC_ZERO_BYTES_FREES 1
411 #endif
412
413 /*
414 TRIM_FASTBINS controls whether free() of a very small chunk can
415 immediately lead to trimming. Setting to true (1) can reduce memory
416 footprint, but will almost always slow down programs that use a lot
417 of small chunks.
418
419 Define this only if you are willing to give up some speed to more
420 aggressively reduce system-level memory footprint when releasing
421 memory in programs that use many small chunks. You can get
422 essentially the same effect by setting MXFAST to 0, but this can
423 lead to even greater slowdowns in programs using many small chunks.
424 TRIM_FASTBINS is an in-between compile-time option, that disables
425 only those chunks bordering topmost memory from being placed in
426 fastbins.
427 */
428
429 #ifndef TRIM_FASTBINS
430 #define TRIM_FASTBINS 0
431 #endif
432
433
434 /*
435 USE_DL_PREFIX will prefix all public routines with the string 'dl'.
436 This is necessary when you only want to use this malloc in one part
437 of a program, using your regular system malloc elsewhere.
438 */
439
440 /* #define USE_DL_PREFIX */
441
442
443 /*
444 Two-phase name translation.
445 All of the actual routines are given mangled names.
446 When wrappers are used, they become the public callable versions.
447 When DL_PREFIX is used, the callable names are prefixed.
448 */
449
450 #ifdef USE_DL_PREFIX
451 #define public_cALLOc dlcalloc
452 #define public_fREe dlfree
453 #define public_cFREe dlcfree
454 #define public_mALLOc dlmalloc
455 #define public_mEMALIGn dlmemalign
456 #define public_rEALLOc dlrealloc
457 #define public_vALLOc dlvalloc
458 #define public_pVALLOc dlpvalloc
459 #define public_mALLINFo dlmallinfo
460 #define public_mALLOPt dlmallopt
461 #define public_mTRIm dlmalloc_trim
462 #define public_mSTATs dlmalloc_stats
463 #define public_mUSABLe dlmalloc_usable_size
464 #define public_iCALLOc dlindependent_calloc
465 #define public_iCOMALLOc dlindependent_comalloc
466 #define public_gET_STATe dlget_state
467 #define public_sET_STATe dlset_state
468 #else /* USE_DL_PREFIX */
469 #ifdef _LIBC
470
471 /* Special defines for the GNU C library. */
472 #define public_cALLOc __libc_calloc
473 #define public_fREe __libc_free
474 #define public_cFREe __libc_cfree
475 #define public_mALLOc __libc_malloc
476 #define public_mEMALIGn __libc_memalign
477 #define public_rEALLOc __libc_realloc
478 #define public_vALLOc __libc_valloc
479 #define public_pVALLOc __libc_pvalloc
480 #define public_mALLINFo __libc_mallinfo
481 #define public_mALLOPt __libc_mallopt
482 #define public_mTRIm __malloc_trim
483 #define public_mSTATs __malloc_stats
484 #define public_mUSABLe __malloc_usable_size
485 #define public_iCALLOc __libc_independent_calloc
486 #define public_iCOMALLOc __libc_independent_comalloc
487 #define public_gET_STATe __malloc_get_state
488 #define public_sET_STATe __malloc_set_state
489 #define malloc_getpagesize __getpagesize()
490 #define open __open
491 #define mmap __mmap
492 #define munmap __munmap
493 #define mremap __mremap
494 #define mprotect __mprotect
495 #define MORECORE (*__morecore)
496 #define MORECORE_FAILURE 0
497
498 Void_t * __default_morecore (ptrdiff_t);
499 Void_t *(*__morecore)(ptrdiff_t) = __default_morecore;
500
501 #else /* !_LIBC */
502 #define public_cALLOc calloc
503 #define public_fREe free
504 #define public_cFREe cfree
505 #define public_mALLOc malloc
506 #define public_mEMALIGn memalign
507 #define public_rEALLOc realloc
508 #define public_vALLOc valloc
509 #define public_pVALLOc pvalloc
510 #define public_mALLINFo mallinfo
511 #define public_mALLOPt mallopt
512 #define public_mTRIm malloc_trim
513 #define public_mSTATs malloc_stats
514 #define public_mUSABLe malloc_usable_size
515 #define public_iCALLOc independent_calloc
516 #define public_iCOMALLOc independent_comalloc
517 #define public_gET_STATe malloc_get_state
518 #define public_sET_STATe malloc_set_state
519 #endif /* _LIBC */
520 #endif /* USE_DL_PREFIX */
521
522 #ifndef _LIBC
523 #define __builtin_expect(expr, val) (expr)
524
525 #define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
526 #endif
527
528 /*
529 HAVE_MEMCPY should be defined if you are not otherwise using
530 ANSI STD C, but still have memcpy and memset in your C library
531 and want to use them in calloc and realloc. Otherwise simple
532 macro versions are defined below.
533
534 USE_MEMCPY should be defined as 1 if you actually want to
535 have memset and memcpy called. People report that the macro
536 versions are faster than libc versions on some systems.
537
538 Even if USE_MEMCPY is set to 1, loops to copy/clear small chunks
539 (of <= 36 bytes) are manually unrolled in realloc and calloc.
540 */
541
542 #define HAVE_MEMCPY
543
544 #ifndef USE_MEMCPY
545 #ifdef HAVE_MEMCPY
546 #define USE_MEMCPY 1
547 #else
548 #define USE_MEMCPY 0
549 #endif
550 #endif
551
552
553 #if (__STD_C || defined(HAVE_MEMCPY))
554
555 #ifdef _LIBC
556 # include <string.h>
557 #else
558 #ifdef WIN32
559 /* On Win32 memset and memcpy are already declared in windows.h */
560 #else
561 #if __STD_C
562 void* memset(void*, int, size_t);
563 void* memcpy(void*, const void*, size_t);
564 #else
565 Void_t* memset();
566 Void_t* memcpy();
567 #endif
568 #endif
569 #endif
570 #endif
571
572 /*
573 MALLOC_FAILURE_ACTION is the action to take before "return 0" when
574 malloc fails to be able to return memory, either because memory is
575 exhausted or because of illegal arguments.
576
577 By default, sets errno if running on STD_C platform, else does nothing.
578 */
579
580 #ifndef MALLOC_FAILURE_ACTION
581 #if __STD_C
582 #define MALLOC_FAILURE_ACTION \
583 errno = ENOMEM;
584
585 #else
586 #define MALLOC_FAILURE_ACTION
587 #endif
588 #endif
589
590 /*
591 MORECORE-related declarations. By default, rely on sbrk
592 */
593
594
595 #ifdef LACKS_UNISTD_H
596 #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
597 #if __STD_C
598 extern Void_t* sbrk(ptrdiff_t);
599 #else
600 extern Void_t* sbrk();
601 #endif
602 #endif
603 #endif
604
605 /*
606 MORECORE is the name of the routine to call to obtain more memory
607 from the system. See below for general guidance on writing
608 alternative MORECORE functions, as well as a version for WIN32 and a
609 sample version for pre-OSX macos.
610 */
611
612 #ifndef MORECORE
613 #define MORECORE sbrk
614 #endif
615
616 /*
617 MORECORE_FAILURE is the value returned upon failure of MORECORE
618 as well as mmap. Since it cannot be an otherwise valid memory address,
619 and must reflect values of standard sys calls, you probably ought not
620 try to redefine it.
621 */
622
623 #ifndef MORECORE_FAILURE
624 #define MORECORE_FAILURE (-1)
625 #endif
626
627 /*
628 If MORECORE_CONTIGUOUS is true, take advantage of fact that
629 consecutive calls to MORECORE with positive arguments always return
630 contiguous increasing addresses. This is true of unix sbrk. Even
631 if not defined, when regions happen to be contiguous, malloc will
632 permit allocations spanning regions obtained from different
633 calls. But defining this when applicable enables some stronger
634 consistency checks and space efficiencies.
635 */
636
637 #ifndef MORECORE_CONTIGUOUS
638 #define MORECORE_CONTIGUOUS 1
639 #endif
640
641 /*
642 Define MORECORE_CANNOT_TRIM if your version of MORECORE
643 cannot release space back to the system when given negative
644 arguments. This is generally necessary only if you are using
645 a hand-crafted MORECORE function that cannot handle negative arguments.
646 */
647
648 /* #define MORECORE_CANNOT_TRIM */
649
650 /* MORECORE_CLEARS (default 1)
651 The degree to which the routine mapped to MORECORE zeroes out
652 memory: never (0), only for newly allocated space (1) or always
653 (2). The distinction between (1) and (2) is necessary because on
654 some systems, if the application first decrements and then
655 increments the break value, the contents of the reallocated space
656 are unspecified.
657 */
658
659 #ifndef MORECORE_CLEARS
660 #define MORECORE_CLEARS 1
661 #endif
662
663
664 /*
665 Define HAVE_MMAP as true to optionally make malloc() use mmap() to
666 allocate very large blocks. These will be returned to the
667 operating system immediately after a free(). Also, if mmap
668 is available, it is used as a backup strategy in cases where
669 MORECORE fails to provide space from system.
670
671 This malloc is best tuned to work with mmap for large requests.
672 If you do not have mmap, operations involving very large chunks (1MB
673 or so) may be slower than you'd like.
674 */
675
676 #ifndef HAVE_MMAP
677 #define HAVE_MMAP 1
678
679 /*
680 Standard unix mmap using /dev/zero clears memory so calloc doesn't
681 need to.
682 */
683
684 #ifndef MMAP_CLEARS
685 #define MMAP_CLEARS 1
686 #endif
687
688 #else /* no mmap */
689 #ifndef MMAP_CLEARS
690 #define MMAP_CLEARS 0
691 #endif
692 #endif
693
694
695 /*
696 MMAP_AS_MORECORE_SIZE is the minimum mmap size argument to use if
697 sbrk fails, and mmap is used as a backup (which is done only if
698 HAVE_MMAP). The value must be a multiple of page size. This
699 backup strategy generally applies only when systems have "holes" in
700 address space, so sbrk cannot perform contiguous expansion, but
701 there is still space available on system. On systems for which
702 this is known to be useful (i.e. most linux kernels), this occurs
703 only when programs allocate huge amounts of memory. Between this,
704 and the fact that mmap regions tend to be limited, the size should
705 be large, to avoid too many mmap calls and thus avoid running out
706 of kernel resources.
707 */
708
709 #ifndef MMAP_AS_MORECORE_SIZE
710 #define MMAP_AS_MORECORE_SIZE (1024 * 1024)
711 #endif
712
713 /*
714 Define HAVE_MREMAP to make realloc() use mremap() to re-allocate
715 large blocks. This is currently only possible on Linux with
716 kernel versions newer than 1.3.77.
717 */
718
719 #ifndef HAVE_MREMAP
720 #ifdef linux
721 #define HAVE_MREMAP 1
722 #else
723 #define HAVE_MREMAP 0
724 #endif
725
726 #endif /* HAVE_MMAP */
727
728 /* Define USE_ARENAS to enable support for multiple `arenas'. These
729 are allocated using mmap(), are necessary for threads and
730 occasionally useful to overcome address space limitations affecting
731 sbrk(). */
732
733 #ifndef USE_ARENAS
734 #define USE_ARENAS HAVE_MMAP
735 #endif
736
737
738 /*
739 The system page size. To the extent possible, this malloc manages
740 memory from the system in page-size units. Note that this value is
741 cached during initialization into a field of malloc_state. So even
742 if malloc_getpagesize is a function, it is only called once.
743
744 The following mechanics for getpagesize were adapted from bsd/gnu
745 getpagesize.h. If none of the system-probes here apply, a value of
746 4096 is used, which should be OK: If they don't apply, then using
747 the actual value probably doesn't impact performance.
748 */
749
750
751 #ifndef malloc_getpagesize
752
753 #ifndef LACKS_UNISTD_H
754 # include <unistd.h>
755 #endif
756
757 # ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
758 # ifndef _SC_PAGE_SIZE
759 # define _SC_PAGE_SIZE _SC_PAGESIZE
760 # endif
761 # endif
762
763 # ifdef _SC_PAGE_SIZE
764 # define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
765 # else
766 # if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
767 extern size_t getpagesize();
768 # define malloc_getpagesize getpagesize()
769 # else
770 # ifdef WIN32 /* use supplied emulation of getpagesize */
771 # define malloc_getpagesize getpagesize()
772 # else
773 # ifndef LACKS_SYS_PARAM_H
774 # include <sys/param.h>
775 # endif
776 # ifdef EXEC_PAGESIZE
777 # define malloc_getpagesize EXEC_PAGESIZE
778 # else
779 # ifdef NBPG
780 # ifndef CLSIZE
781 # define malloc_getpagesize NBPG
782 # else
783 # define malloc_getpagesize (NBPG * CLSIZE)
784 # endif
785 # else
786 # ifdef NBPC
787 # define malloc_getpagesize NBPC
788 # else
789 # ifdef PAGESIZE
790 # define malloc_getpagesize PAGESIZE
791 # else /* just guess */
792 # define malloc_getpagesize (4096)
793 # endif
794 # endif
795 # endif
796 # endif
797 # endif
798 # endif
799 # endif
800 #endif
801
802 /*
803 This version of malloc supports the standard SVID/XPG mallinfo
804 routine that returns a struct containing usage properties and
805 statistics. It should work on any SVID/XPG compliant system that has
806 a /usr/include/malloc.h defining struct mallinfo. (If you'd like to
807 install such a thing yourself, cut out the preliminary declarations
808 as described above and below and save them in a malloc.h file. But
809 there's no compelling reason to bother to do this.)
810
811 The main declaration needed is the mallinfo struct that is returned
812 (by-copy) by mallinfo(). The SVID/XPG malloinfo struct contains a
813 bunch of fields that are not even meaningful in this version of
814 malloc. These fields are are instead filled by mallinfo() with
815 other numbers that might be of interest.
816
817 HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
818 /usr/include/malloc.h file that includes a declaration of struct
819 mallinfo. If so, it is included; else an SVID2/XPG2 compliant
820 version is declared below. These must be precisely the same for
821 mallinfo() to work. The original SVID version of this struct,
822 defined on most systems with mallinfo, declares all fields as
823 ints. But some others define as unsigned long. If your system
824 defines the fields using a type of different width than listed here,
825 you must #include your system version and #define
826 HAVE_USR_INCLUDE_MALLOC_H.
827 */
828
829 /* #define HAVE_USR_INCLUDE_MALLOC_H */
830
831 #ifdef HAVE_USR_INCLUDE_MALLOC_H
832 #include "/usr/include/malloc.h"
833 #endif
834
835
836 /* ---------- description of public routines ------------ */
837
838 /*
839 malloc(size_t n)
840 Returns a pointer to a newly allocated chunk of at least n bytes, or null
841 if no space is available. Additionally, on failure, errno is
842 set to ENOMEM on ANSI C systems.
843
844 If n is zero, malloc returns a minumum-sized chunk. (The minimum
845 size is 16 bytes on most 32bit systems, and 24 or 32 bytes on 64bit
846 systems.) On most systems, size_t is an unsigned type, so calls
847 with negative arguments are interpreted as requests for huge amounts
848 of space, which will often fail. The maximum supported value of n
849 differs across systems, but is in all cases less than the maximum
850 representable value of a size_t.
851 */
852 #if __STD_C
853 Void_t* public_mALLOc(size_t);
854 #else
855 Void_t* public_mALLOc();
856 #endif
857 #ifdef libc_hidden_proto
858 libc_hidden_proto (public_mALLOc)
859 #endif
860
861 /*
862 free(Void_t* p)
863 Releases the chunk of memory pointed to by p, that had been previously
864 allocated using malloc or a related routine such as realloc.
865 It has no effect if p is null. It can have arbitrary (i.e., bad!)
866 effects if p has already been freed.
867
868 Unless disabled (using mallopt), freeing very large spaces will
869 when possible, automatically trigger operations that give
870 back unused memory to the system, thus reducing program footprint.
871 */
872 #if __STD_C
873 void public_fREe(Void_t*);
874 #else
875 void public_fREe();
876 #endif
877 #ifdef libc_hidden_proto
878 libc_hidden_proto (public_fREe)
879 #endif
880
881 /*
882 calloc(size_t n_elements, size_t element_size);
883 Returns a pointer to n_elements * element_size bytes, with all locations
884 set to zero.
885 */
886 #if __STD_C
887 Void_t* public_cALLOc(size_t, size_t);
888 #else
889 Void_t* public_cALLOc();
890 #endif
891
892 /*
893 realloc(Void_t* p, size_t n)
894 Returns a pointer to a chunk of size n that contains the same data
895 as does chunk p up to the minimum of (n, p's size) bytes, or null
896 if no space is available.
897
898 The returned pointer may or may not be the same as p. The algorithm
899 prefers extending p when possible, otherwise it employs the
900 equivalent of a malloc-copy-free sequence.
901
902 If p is null, realloc is equivalent to malloc.
903
904 If space is not available, realloc returns null, errno is set (if on
905 ANSI) and p is NOT freed.
906
907 if n is for fewer bytes than already held by p, the newly unused
908 space is lopped off and freed if possible. Unless the #define
909 REALLOC_ZERO_BYTES_FREES is set, realloc with a size argument of
910 zero (re)allocates a minimum-sized chunk.
911
912 Large chunks that were internally obtained via mmap will always
913 be reallocated using malloc-copy-free sequences unless
914 the system supports MREMAP (currently only linux).
915
916 The old unix realloc convention of allowing the last-free'd chunk
917 to be used as an argument to realloc is not supported.
918 */
919 #if __STD_C
920 Void_t* public_rEALLOc(Void_t*, size_t);
921 #else
922 Void_t* public_rEALLOc();
923 #endif
924 #ifdef libc_hidden_proto
925 libc_hidden_proto (public_rEALLOc)
926 #endif
927
928 /*
929 memalign(size_t alignment, size_t n);
930 Returns a pointer to a newly allocated chunk of n bytes, aligned
931 in accord with the alignment argument.
932
933 The alignment argument should be a power of two. If the argument is
934 not a power of two, the nearest greater power is used.
935 8-byte alignment is guaranteed by normal malloc calls, so don't
936 bother calling memalign with an argument of 8 or less.
937
938 Overreliance on memalign is a sure way to fragment space.
939 */
940 #if __STD_C
941 Void_t* public_mEMALIGn(size_t, size_t);
942 #else
943 Void_t* public_mEMALIGn();
944 #endif
945 #ifdef libc_hidden_proto
946 libc_hidden_proto (public_mEMALIGn)
947 #endif
948
949 /*
950 valloc(size_t n);
951 Equivalent to memalign(pagesize, n), where pagesize is the page
952 size of the system. If the pagesize is unknown, 4096 is used.
953 */
954 #if __STD_C
955 Void_t* public_vALLOc(size_t);
956 #else
957 Void_t* public_vALLOc();
958 #endif
959
960
961
962 /*
963 mallopt(int parameter_number, int parameter_value)
964 Sets tunable parameters The format is to provide a
965 (parameter-number, parameter-value) pair. mallopt then sets the
966 corresponding parameter to the argument value if it can (i.e., so
967 long as the value is meaningful), and returns 1 if successful else
968 0. SVID/XPG/ANSI defines four standard param numbers for mallopt,
969 normally defined in malloc.h. Only one of these (M_MXFAST) is used
970 in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply,
971 so setting them has no effect. But this malloc also supports four
972 other options in mallopt. See below for details. Briefly, supported
973 parameters are as follows (listed defaults are for "typical"
974 configurations).
975
976 Symbol param # default allowed param values
977 M_MXFAST 1 64 0-80 (0 disables fastbins)
978 M_TRIM_THRESHOLD -1 128*1024 any (-1U disables trimming)
979 M_TOP_PAD -2 0 any
980 M_MMAP_THRESHOLD -3 128*1024 any (or 0 if no MMAP support)
981 M_MMAP_MAX -4 65536 any (0 disables use of mmap)
982 */
983 #if __STD_C
984 int public_mALLOPt(int, int);
985 #else
986 int public_mALLOPt();
987 #endif
988
989
990 /*
991 mallinfo()
992 Returns (by copy) a struct containing various summary statistics:
993
994 arena: current total non-mmapped bytes allocated from system
995 ordblks: the number of free chunks
996 smblks: the number of fastbin blocks (i.e., small chunks that
997 have been freed but not use resused or consolidated)
998 hblks: current number of mmapped regions
999 hblkhd: total bytes held in mmapped regions
1000 usmblks: the maximum total allocated space. This will be greater
1001 than current total if trimming has occurred.
1002 fsmblks: total bytes held in fastbin blocks
1003 uordblks: current total allocated space (normal or mmapped)
1004 fordblks: total free space
1005 keepcost: the maximum number of bytes that could ideally be released
1006 back to system via malloc_trim. ("ideally" means that
1007 it ignores page restrictions etc.)
1008
1009 Because these fields are ints, but internal bookkeeping may
1010 be kept as longs, the reported values may wrap around zero and
1011 thus be inaccurate.
1012 */
1013 #if __STD_C
1014 struct mallinfo public_mALLINFo(void);
1015 #else
1016 struct mallinfo public_mALLINFo();
1017 #endif
1018
1019 #ifndef _LIBC
1020 /*
1021 independent_calloc(size_t n_elements, size_t element_size, Void_t* chunks[]);
1022
1023 independent_calloc is similar to calloc, but instead of returning a
1024 single cleared space, it returns an array of pointers to n_elements
1025 independent elements that can hold contents of size elem_size, each
1026 of which starts out cleared, and can be independently freed,
1027 realloc'ed etc. The elements are guaranteed to be adjacently
1028 allocated (this is not guaranteed to occur with multiple callocs or
1029 mallocs), which may also improve cache locality in some
1030 applications.
1031
1032 The "chunks" argument is optional (i.e., may be null, which is
1033 probably the most typical usage). If it is null, the returned array
1034 is itself dynamically allocated and should also be freed when it is
1035 no longer needed. Otherwise, the chunks array must be of at least
1036 n_elements in length. It is filled in with the pointers to the
1037 chunks.
1038
1039 In either case, independent_calloc returns this pointer array, or
1040 null if the allocation failed. If n_elements is zero and "chunks"
1041 is null, it returns a chunk representing an array with zero elements
1042 (which should be freed if not wanted).
1043
1044 Each element must be individually freed when it is no longer
1045 needed. If you'd like to instead be able to free all at once, you
1046 should instead use regular calloc and assign pointers into this
1047 space to represent elements. (In this case though, you cannot
1048 independently free elements.)
1049
1050 independent_calloc simplifies and speeds up implementations of many
1051 kinds of pools. It may also be useful when constructing large data
1052 structures that initially have a fixed number of fixed-sized nodes,
1053 but the number is not known at compile time, and some of the nodes
1054 may later need to be freed. For example:
1055
1056 struct Node { int item; struct Node* next; };
1057
1058 struct Node* build_list() {
1059 struct Node** pool;
1060 int n = read_number_of_nodes_needed();
1061 if (n <= 0) return 0;
1062 pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
1063 if (pool == 0) die();
1064 // organize into a linked list...
1065 struct Node* first = pool[0];
1066 for (i = 0; i < n-1; ++i)
1067 pool[i]->next = pool[i+1];
1068 free(pool); // Can now free the array (or not, if it is needed later)
1069 return first;
1070 }
1071 */
1072 #if __STD_C
1073 Void_t** public_iCALLOc(size_t, size_t, Void_t**);
1074 #else
1075 Void_t** public_iCALLOc();
1076 #endif
1077
1078 /*
1079 independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
1080
1081 independent_comalloc allocates, all at once, a set of n_elements
1082 chunks with sizes indicated in the "sizes" array. It returns
1083 an array of pointers to these elements, each of which can be
1084 independently freed, realloc'ed etc. The elements are guaranteed to
1085 be adjacently allocated (this is not guaranteed to occur with
1086 multiple callocs or mallocs), which may also improve cache locality
1087 in some applications.
1088
1089 The "chunks" argument is optional (i.e., may be null). If it is null
1090 the returned array is itself dynamically allocated and should also
1091 be freed when it is no longer needed. Otherwise, the chunks array
1092 must be of at least n_elements in length. It is filled in with the
1093 pointers to the chunks.
1094
1095 In either case, independent_comalloc returns this pointer array, or
1096 null if the allocation failed. If n_elements is zero and chunks is
1097 null, it returns a chunk representing an array with zero elements
1098 (which should be freed if not wanted).
1099
1100 Each element must be individually freed when it is no longer
1101 needed. If you'd like to instead be able to free all at once, you
1102 should instead use a single regular malloc, and assign pointers at
1103 particular offsets in the aggregate space. (In this case though, you
1104 cannot independently free elements.)
1105
1106 independent_comallac differs from independent_calloc in that each
1107 element may have a different size, and also that it does not
1108 automatically clear elements.
1109
1110 independent_comalloc can be used to speed up allocation in cases
1111 where several structs or objects must always be allocated at the
1112 same time. For example:
1113
1114 struct Head { ... }
1115 struct Foot { ... }
1116
1117 void send_message(char* msg) {
1118 int msglen = strlen(msg);
1119 size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
1120 void* chunks[3];
1121 if (independent_comalloc(3, sizes, chunks) == 0)
1122 die();
1123 struct Head* head = (struct Head*)(chunks[0]);
1124 char* body = (char*)(chunks[1]);
1125 struct Foot* foot = (struct Foot*)(chunks[2]);
1126 // ...
1127 }
1128
1129 In general though, independent_comalloc is worth using only for
1130 larger values of n_elements. For small values, you probably won't
1131 detect enough difference from series of malloc calls to bother.
1132
1133 Overuse of independent_comalloc can increase overall memory usage,
1134 since it cannot reuse existing noncontiguous small chunks that
1135 might be available for some of the elements.
1136 */
1137 #if __STD_C
1138 Void_t** public_iCOMALLOc(size_t, size_t*, Void_t**);
1139 #else
1140 Void_t** public_iCOMALLOc();
1141 #endif
1142
1143 #endif /* _LIBC */
1144
1145
1146 /*
1147 pvalloc(size_t n);
1148 Equivalent to valloc(minimum-page-that-holds(n)), that is,
1149 round up n to nearest pagesize.
1150 */
1151 #if __STD_C
1152 Void_t* public_pVALLOc(size_t);
1153 #else
1154 Void_t* public_pVALLOc();
1155 #endif
1156
1157 /*
1158 cfree(Void_t* p);
1159 Equivalent to free(p).
1160
1161 cfree is needed/defined on some systems that pair it with calloc,
1162 for odd historical reasons (such as: cfree is used in example
1163 code in the first edition of K&R).
1164 */
1165 #if __STD_C
1166 void public_cFREe(Void_t*);
1167 #else
1168 void public_cFREe();
1169 #endif
1170
1171 /*
1172 malloc_trim(size_t pad);
1173
1174 If possible, gives memory back to the system (via negative
1175 arguments to sbrk) if there is unused memory at the `high' end of
1176 the malloc pool. You can call this after freeing large blocks of
1177 memory to potentially reduce the system-level memory requirements
1178 of a program. However, it cannot guarantee to reduce memory. Under
1179 some allocation patterns, some large free blocks of memory will be
1180 locked between two used chunks, so they cannot be given back to
1181 the system.
1182
1183 The `pad' argument to malloc_trim represents the amount of free
1184 trailing space to leave untrimmed. If this argument is zero,
1185 only the minimum amount of memory to maintain internal data
1186 structures will be left (one page or less). Non-zero arguments
1187 can be supplied to maintain enough trailing space to service
1188 future expected allocations without having to re-obtain memory
1189 from the system.
1190
1191 Malloc_trim returns 1 if it actually released any memory, else 0.
1192 On systems that do not support "negative sbrks", it will always
1193 rreturn 0.
1194 */
1195 #if __STD_C
1196 int public_mTRIm(size_t);
1197 #else
1198 int public_mTRIm();
1199 #endif
1200
1201 /*
1202 malloc_usable_size(Void_t* p);
1203
1204 Returns the number of bytes you can actually use in
1205 an allocated chunk, which may be more than you requested (although
1206 often not) due to alignment and minimum size constraints.
1207 You can use this many bytes without worrying about
1208 overwriting other allocated objects. This is not a particularly great
1209 programming practice. malloc_usable_size can be more useful in
1210 debugging and assertions, for example:
1211
1212 p = malloc(n);
1213 assert(malloc_usable_size(p) >= 256);
1214
1215 */
1216 #if __STD_C
1217 size_t public_mUSABLe(Void_t*);
1218 #else
1219 size_t public_mUSABLe();
1220 #endif
1221
1222 /*
1223 malloc_stats();
1224 Prints on stderr the amount of space obtained from the system (both
1225 via sbrk and mmap), the maximum amount (which may be more than
1226 current if malloc_trim and/or munmap got called), and the current
1227 number of bytes allocated via malloc (or realloc, etc) but not yet
1228 freed. Note that this is the number of bytes allocated, not the
1229 number requested. It will be larger than the number requested
1230 because of alignment and bookkeeping overhead. Because it includes
1231 alignment wastage as being in use, this figure may be greater than
1232 zero even when no user-level chunks are allocated.
1233
1234 The reported current and maximum system memory can be inaccurate if
1235 a program makes other calls to system memory allocation functions
1236 (normally sbrk) outside of malloc.
1237
1238 malloc_stats prints only the most commonly interesting statistics.
1239 More information can be obtained by calling mallinfo.
1240
1241 */
1242 #if __STD_C
1243 void public_mSTATs(void);
1244 #else
1245 void public_mSTATs();
1246 #endif
1247
1248 /*
1249 malloc_get_state(void);
1250
1251 Returns the state of all malloc variables in an opaque data
1252 structure.
1253 */
1254 #if __STD_C
1255 Void_t* public_gET_STATe(void);
1256 #else
1257 Void_t* public_gET_STATe();
1258 #endif
1259
1260 /*
1261 malloc_set_state(Void_t* state);
1262
1263 Restore the state of all malloc variables from data obtained with
1264 malloc_get_state().
1265 */
1266 #if __STD_C
1267 int public_sET_STATe(Void_t*);
1268 #else
1269 int public_sET_STATe();
1270 #endif
1271
1272 #ifdef _LIBC
1273 /*
1274 posix_memalign(void **memptr, size_t alignment, size_t size);
1275
1276 POSIX wrapper like memalign(), checking for validity of size.
1277 */
1278 int __posix_memalign(void **, size_t, size_t);
1279 #endif
1280
1281 /* mallopt tuning options */
1282
1283 /*
1284 M_MXFAST is the maximum request size used for "fastbins", special bins
1285 that hold returned chunks without consolidating their spaces. This
1286 enables future requests for chunks of the same size to be handled
1287 very quickly, but can increase fragmentation, and thus increase the
1288 overall memory footprint of a program.
1289
1290 This malloc manages fastbins very conservatively yet still
1291 efficiently, so fragmentation is rarely a problem for values less
1292 than or equal to the default. The maximum supported value of MXFAST
1293 is 80. You wouldn't want it any higher than this anyway. Fastbins
1294 are designed especially for use with many small structs, objects or
1295 strings -- the default handles structs/objects/arrays with sizes up
1296 to 8 4byte fields, or small strings representing words, tokens,
1297 etc. Using fastbins for larger objects normally worsens
1298 fragmentation without improving speed.
1299
1300 M_MXFAST is set in REQUEST size units. It is internally used in
1301 chunksize units, which adds padding and alignment. You can reduce
1302 M_MXFAST to 0 to disable all use of fastbins. This causes the malloc
1303 algorithm to be a closer approximation of fifo-best-fit in all cases,
1304 not just for larger requests, but will generally cause it to be
1305 slower.
1306 */
1307
1308
1309 /* M_MXFAST is a standard SVID/XPG tuning option, usually listed in malloc.h */
1310 #ifndef M_MXFAST
1311 #define M_MXFAST 1
1312 #endif
1313
1314 #ifndef DEFAULT_MXFAST
1315 #define DEFAULT_MXFAST 64
1316 #endif
1317
1318
1319 /*
1320 M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
1321 to keep before releasing via malloc_trim in free().
1322
1323 Automatic trimming is mainly useful in long-lived programs.
1324 Because trimming via sbrk can be slow on some systems, and can
1325 sometimes be wasteful (in cases where programs immediately
1326 afterward allocate more large chunks) the value should be high
1327 enough so that your overall system performance would improve by
1328 releasing this much memory.
1329
1330 The trim threshold and the mmap control parameters (see below)
1331 can be traded off with one another. Trimming and mmapping are
1332 two different ways of releasing unused memory back to the
1333 system. Between these two, it is often possible to keep
1334 system-level demands of a long-lived program down to a bare
1335 minimum. For example, in one test suite of sessions measuring
1336 the XF86 X server on Linux, using a trim threshold of 128K and a
1337 mmap threshold of 192K led to near-minimal long term resource
1338 consumption.
1339
1340 If you are using this malloc in a long-lived program, it should
1341 pay to experiment with these values. As a rough guide, you
1342 might set to a value close to the average size of a process
1343 (program) running on your system. Releasing this much memory
1344 would allow such a process to run in memory. Generally, it's
1345 worth it to tune for trimming rather tham memory mapping when a
1346 program undergoes phases where several large chunks are
1347 allocated and released in ways that can reuse each other's
1348 storage, perhaps mixed with phases where there are no such
1349 chunks at all. And in well-behaved long-lived programs,
1350 controlling release of large blocks via trimming versus mapping
1351 is usually faster.
1352
1353 However, in most programs, these parameters serve mainly as
1354 protection against the system-level effects of carrying around
1355 massive amounts of unneeded memory. Since frequent calls to
1356 sbrk, mmap, and munmap otherwise degrade performance, the default
1357 parameters are set to relatively high values that serve only as
1358 safeguards.
1359
1360 The trim value It must be greater than page size to have any useful
1361 effect. To disable trimming completely, you can set to
1362 (unsigned long)(-1)
1363
1364 Trim settings interact with fastbin (MXFAST) settings: Unless
1365 TRIM_FASTBINS is defined, automatic trimming never takes place upon
1366 freeing a chunk with size less than or equal to MXFAST. Trimming is
1367 instead delayed until subsequent freeing of larger chunks. However,
1368 you can still force an attempted trim by calling malloc_trim.
1369
1370 Also, trimming is not generally possible in cases where
1371 the main arena is obtained via mmap.
1372
1373 Note that the trick some people use of mallocing a huge space and
1374 then freeing it at program startup, in an attempt to reserve system
1375 memory, doesn't have the intended effect under automatic trimming,
1376 since that memory will immediately be returned to the system.
1377 */
1378
1379 #define M_TRIM_THRESHOLD -1
1380
1381 #ifndef DEFAULT_TRIM_THRESHOLD
1382 #define DEFAULT_TRIM_THRESHOLD (128 * 1024)
1383 #endif
1384
1385 /*
1386 M_TOP_PAD is the amount of extra `padding' space to allocate or
1387 retain whenever sbrk is called. It is used in two ways internally:
1388
1389 * When sbrk is called to extend the top of the arena to satisfy
1390 a new malloc request, this much padding is added to the sbrk
1391 request.
1392
1393 * When malloc_trim is called automatically from free(),
1394 it is used as the `pad' argument.
1395
1396 In both cases, the actual amount of padding is rounded
1397 so that the end of the arena is always a system page boundary.
1398
1399 The main reason for using padding is to avoid calling sbrk so
1400 often. Having even a small pad greatly reduces the likelihood
1401 that nearly every malloc request during program start-up (or
1402 after trimming) will invoke sbrk, which needlessly wastes
1403 time.
1404
1405 Automatic rounding-up to page-size units is normally sufficient
1406 to avoid measurable overhead, so the default is 0. However, in
1407 systems where sbrk is relatively slow, it can pay to increase
1408 this value, at the expense of carrying around more memory than
1409 the program needs.
1410 */
1411
1412 #define M_TOP_PAD -2
1413
1414 #ifndef DEFAULT_TOP_PAD
1415 #define DEFAULT_TOP_PAD (0)
1416 #endif
1417
1418 /*
1419 MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
1420 adjusted MMAP_THRESHOLD.
1421 */
1422
1423 #ifndef DEFAULT_MMAP_THRESHOLD_MIN
1424 #define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
1425 #endif
1426
1427 #ifndef DEFAULT_MMAP_THRESHOLD_MAX
1428 /* For 32-bit platforms we cannot increase the maximum mmap
1429 threshold much because it is also the minimum value for the
1430 maximum heap size and its alignment. Going above 512k (i.e., 1M
1431 for new heaps) wastes too much address space. */
1432 # if __WORDSIZE == 32
1433 # define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
1434 # else
1435 # define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
1436 # endif
1437 #endif
1438
1439 /*
1440 M_MMAP_THRESHOLD is the request size threshold for using mmap()
1441 to service a request. Requests of at least this size that cannot
1442 be allocated using already-existing space will be serviced via mmap.
1443 (If enough normal freed space already exists it is used instead.)
1444
1445 Using mmap segregates relatively large chunks of memory so that
1446 they can be individually obtained and released from the host
1447 system. A request serviced through mmap is never reused by any
1448 other request (at least not directly; the system may just so
1449 happen to remap successive requests to the same locations).
1450
1451 Segregating space in this way has the benefits that:
1452
1453 1. Mmapped space can ALWAYS be individually released back
1454 to the system, which helps keep the system level memory
1455 demands of a long-lived program low.
1456 2. Mapped memory can never become `locked' between
1457 other chunks, as can happen with normally allocated chunks, which
1458 means that even trimming via malloc_trim would not release them.
1459 3. On some systems with "holes" in address spaces, mmap can obtain
1460 memory that sbrk cannot.
1461
1462 However, it has the disadvantages that:
1463
1464 1. The space cannot be reclaimed, consolidated, and then
1465 used to service later requests, as happens with normal chunks.
1466 2. It can lead to more wastage because of mmap page alignment
1467 requirements
1468 3. It causes malloc performance to be more dependent on host
1469 system memory management support routines which may vary in
1470 implementation quality and may impose arbitrary
1471 limitations. Generally, servicing a request via normal
1472 malloc steps is faster than going through a system's mmap.
1473
1474 The advantages of mmap nearly always outweigh disadvantages for
1475 "large" chunks, but the value of "large" varies across systems. The
1476 default is an empirically derived value that works well in most
1477 systems.
1478
1479
1480 Update in 2006:
1481 The above was written in 2001. Since then the world has changed a lot.
1482 Memory got bigger. Applications got bigger. The virtual address space
1483 layout in 32 bit linux changed.
1484
1485 In the new situation, brk() and mmap space is shared and there are no
1486 artificial limits on brk size imposed by the kernel. What is more,
1487 applications have started using transient allocations larger than the
1488 128Kb as was imagined in 2001.
1489
1490 The price for mmap is also high now; each time glibc mmaps from the
1491 kernel, the kernel is forced to zero out the memory it gives to the
1492 application. Zeroing memory is expensive and eats a lot of cache and
1493 memory bandwidth. This has nothing to do with the efficiency of the
1494 virtual memory system, by doing mmap the kernel just has no choice but
1495 to zero.
1496
1497 In 2001, the kernel had a maximum size for brk() which was about 800
1498 megabytes on 32 bit x86, at that point brk() would hit the first
1499 mmaped shared libaries and couldn't expand anymore. With current 2.6
1500 kernels, the VA space layout is different and brk() and mmap
1501 both can span the entire heap at will.
1502
1503 Rather than using a static threshold for the brk/mmap tradeoff,
1504 we are now using a simple dynamic one. The goal is still to avoid
1505 fragmentation. The old goals we kept are
1506 1) try to get the long lived large allocations to use mmap()
1507 2) really large allocations should always use mmap()
1508 and we're adding now:
1509 3) transient allocations should use brk() to avoid forcing the kernel
1510 having to zero memory over and over again
1511
1512 The implementation works with a sliding threshold, which is by default
1513 limited to go between 128Kb and 32Mb (64Mb for 64 bitmachines) and starts
1514 out at 128Kb as per the 2001 default.
1515
1516 This allows us to satisfy requirement 1) under the assumption that long
1517 lived allocations are made early in the process' lifespan, before it has
1518 started doing dynamic allocations of the same size (which will
1519 increase the threshold).
1520
1521 The upperbound on the threshold satisfies requirement 2)
1522
1523 The threshold goes up in value when the application frees memory that was
1524 allocated with the mmap allocator. The idea is that once the application
1525 starts freeing memory of a certain size, it's highly probable that this is
1526 a size the application uses for transient allocations. This estimator
1527 is there to satisfy the new third requirement.
1528
1529 */
1530
1531 #define M_MMAP_THRESHOLD -3
1532
1533 #ifndef DEFAULT_MMAP_THRESHOLD
1534 #define DEFAULT_MMAP_THRESHOLD DEFAULT_MMAP_THRESHOLD_MIN
1535 #endif
1536
1537 /*
1538 M_MMAP_MAX is the maximum number of requests to simultaneously
1539 service using mmap. This parameter exists because
1540 some systems have a limited number of internal tables for
1541 use by mmap, and using more than a few of them may degrade
1542 performance.
1543
1544 The default is set to a value that serves only as a safeguard.
1545 Setting to 0 disables use of mmap for servicing large requests. If
1546 HAVE_MMAP is not set, the default value is 0, and attempts to set it
1547 to non-zero values in mallopt will fail.
1548 */
1549
1550 #define M_MMAP_MAX -4
1551
1552 #ifndef DEFAULT_MMAP_MAX
1553 #if HAVE_MMAP
1554 #define DEFAULT_MMAP_MAX (65536)
1555 #else
1556 #define DEFAULT_MMAP_MAX (0)
1557 #endif
1558 #endif
1559
1560 #ifdef __cplusplus
1561 } /* end of extern "C" */
1562 #endif
1563
1564 #include <malloc.h>
1565
1566 #ifndef BOUNDED_N
1567 #define BOUNDED_N(ptr, sz) (ptr)
1568 #endif
1569 #ifndef RETURN_ADDRESS
1570 #define RETURN_ADDRESS(X_) (NULL)
1571 #endif
1572
1573 /* On some platforms we can compile internal, not exported functions better.
1574 Let the environment provide a macro and define it to be empty if it
1575 is not available. */
1576 #ifndef internal_function
1577 # define internal_function
1578 #endif
1579
1580 /* Forward declarations. */
1581 struct malloc_chunk;
1582 typedef struct malloc_chunk* mchunkptr;
1583
1584 /* Internal routines. */
1585
1586 #if __STD_C
1587
1588 Void_t* _int_malloc(mstate, size_t);
1589 void _int_free(mstate, Void_t*);
1590 Void_t* _int_realloc(mstate, Void_t*, size_t);
1591 Void_t* _int_memalign(mstate, size_t, size_t);
1592 Void_t* _int_valloc(mstate, size_t);
1593 static Void_t* _int_pvalloc(mstate, size_t);
1594 /*static Void_t* cALLOc(size_t, size_t);*/
1595 #ifndef _LIBC
1596 static Void_t** _int_icalloc(mstate, size_t, size_t, Void_t**);
1597 static Void_t** _int_icomalloc(mstate, size_t, size_t*, Void_t**);
1598 #endif
1599 static int mTRIm(size_t);
1600 static size_t mUSABLe(Void_t*);
1601 static void mSTATs(void);
1602 static int mALLOPt(int, int);
1603 static struct mallinfo mALLINFo(mstate);
1604 static void malloc_printerr(int action, const char *str, void *ptr);
1605
1606 static Void_t* internal_function mem2mem_check(Void_t *p, size_t sz);
1607 static int internal_function top_check(void);
1608 static void internal_function munmap_chunk(mchunkptr p);
1609 #if HAVE_MREMAP
1610 static mchunkptr internal_function mremap_chunk(mchunkptr p, size_t new_size);
1611 #endif
1612
1613 static Void_t* malloc_check(size_t sz, const Void_t *caller);
1614 static void free_check(Void_t* mem, const Void_t *caller);
1615 static Void_t* realloc_check(Void_t* oldmem, size_t bytes,
1616 const Void_t *caller);
1617 static Void_t* memalign_check(size_t alignment, size_t bytes,
1618 const Void_t *caller);
1619 #ifndef NO_THREADS
1620 # ifdef _LIBC
1621 # if USE___THREAD || (defined USE_TLS && !defined SHARED)
1622 /* These routines are never needed in this configuration. */
1623 # define NO_STARTER
1624 # endif
1625 # endif
1626 # ifdef NO_STARTER
1627 # undef NO_STARTER
1628 # else
1629 static Void_t* malloc_starter(size_t sz, const Void_t *caller);
1630 static Void_t* memalign_starter(size_t aln, size_t sz, const Void_t *caller);
1631 static void free_starter(Void_t* mem, const Void_t *caller);
1632 # endif
1633 static Void_t* malloc_atfork(size_t sz, const Void_t *caller);
1634 static void free_atfork(Void_t* mem, const Void_t *caller);
1635 #endif
1636
1637 #else
1638
1639 Void_t* _int_malloc();
1640 void _int_free();
1641 Void_t* _int_realloc();
1642 Void_t* _int_memalign();
1643 Void_t* _int_valloc();
1644 Void_t* _int_pvalloc();
1645 /*static Void_t* cALLOc();*/
1646 static Void_t** _int_icalloc();
1647 static Void_t** _int_icomalloc();
1648 static int mTRIm();
1649 static size_t mUSABLe();
1650 static void mSTATs();
1651 static int mALLOPt();
1652 static struct mallinfo mALLINFo();
1653
1654 #endif
1655
1656
1657
1658
1659 /* ------------- Optional versions of memcopy ---------------- */
1660
1661
1662 #if USE_MEMCPY
1663
1664 /*
1665 Note: memcpy is ONLY invoked with non-overlapping regions,
1666 so the (usually slower) memmove is not needed.
1667 */
1668
1669 #define MALLOC_COPY(dest, src, nbytes) memcpy(dest, src, nbytes)
1670 #define MALLOC_ZERO(dest, nbytes) memset(dest, 0, nbytes)
1671
1672 #else /* !USE_MEMCPY */
1673
1674 /* Use Duff's device for good zeroing/copying performance. */
1675
1676 #define MALLOC_ZERO(charp, nbytes) \
1677 do { \
1678 INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp); \
1679 unsigned long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
1680 long mcn; \
1681 if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
1682 switch (mctmp) { \
1683 case 0: for(;;) { *mzp++ = 0; \
1684 case 7: *mzp++ = 0; \
1685 case 6: *mzp++ = 0; \
1686 case 5: *mzp++ = 0; \
1687 case 4: *mzp++ = 0; \
1688 case 3: *mzp++ = 0; \
1689 case 2: *mzp++ = 0; \
1690 case 1: *mzp++ = 0; if(mcn <= 0) break; mcn--; } \
1691 } \
1692 } while(0)
1693
1694 #define MALLOC_COPY(dest,src,nbytes) \
1695 do { \
1696 INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src; \
1697 INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest; \
1698 unsigned long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
1699 long mcn; \
1700 if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
1701 switch (mctmp) { \
1702 case 0: for(;;) { *mcdst++ = *mcsrc++; \
1703 case 7: *mcdst++ = *mcsrc++; \
1704 case 6: *mcdst++ = *mcsrc++; \
1705 case 5: *mcdst++ = *mcsrc++; \
1706 case 4: *mcdst++ = *mcsrc++; \
1707 case 3: *mcdst++ = *mcsrc++; \
1708 case 2: *mcdst++ = *mcsrc++; \
1709 case 1: *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; } \
1710 } \
1711 } while(0)
1712
1713 #endif
1714
1715 /* ------------------ MMAP support ------------------ */
1716
1717
1718 #if HAVE_MMAP
1719
1720 #include <fcntl.h>
1721 #ifndef LACKS_SYS_MMAN_H
1722 #include <sys/mman.h>
1723 #endif
1724
1725 #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
1726 # define MAP_ANONYMOUS MAP_ANON
1727 #endif
1728 #if !defined(MAP_FAILED)
1729 # define MAP_FAILED ((char*)-1)
1730 #endif
1731
1732 #ifndef MAP_NORESERVE
1733 # ifdef MAP_AUTORESRV
1734 # define MAP_NORESERVE MAP_AUTORESRV
1735 # else
1736 # define MAP_NORESERVE 0
1737 # endif
1738 #endif
1739
1740 /*
1741 Nearly all versions of mmap support MAP_ANONYMOUS,
1742 so the following is unlikely to be needed, but is
1743 supplied just in case.
1744 */
1745
1746 #ifndef MAP_ANONYMOUS
1747
1748 static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
1749
1750 #define MMAP(addr, size, prot, flags) ((dev_zero_fd < 0) ? \
1751 (dev_zero_fd = open("/dev/zero", O_RDWR), \
1752 mmap((addr), (size), (prot), (flags), dev_zero_fd, 0)) : \
1753 mmap((addr), (size), (prot), (flags), dev_zero_fd, 0))
1754
1755 #else
1756
1757 #define MMAP(addr, size, prot, flags) \
1758 (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0))
1759
1760 #endif
1761
1762
1763 #endif /* HAVE_MMAP */
1764
1765
1766 /*
1767 ----------------------- Chunk representations -----------------------
1768 */
1769
1770
1771 /*
1772 This struct declaration is misleading (but accurate and necessary).
1773 It declares a "view" into memory allowing access to necessary
1774 fields at known offsets from a given base. See explanation below.
1775 */
1776
1777 struct malloc_chunk {
1778
1779 INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
1780 INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
1781
1782 struct malloc_chunk* fd; /* double links -- used only if free. */
1783 struct malloc_chunk* bk;
1784 };
1785
1786
1787 /*
1788 malloc_chunk details:
1789
1790 (The following includes lightly edited explanations by Colin Plumb.)
1791
1792 Chunks of memory are maintained using a `boundary tag' method as
1793 described in e.g., Knuth or Standish. (See the paper by Paul
1794 Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a
1795 survey of such techniques.) Sizes of free chunks are stored both
1796 in the front of each chunk and at the end. This makes
1797 consolidating fragmented chunks into bigger chunks very fast. The
1798 size fields also hold bits representing whether chunks are free or
1799 in use.
1800
1801 An allocated chunk looks like this:
1802
1803
1804 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1805 | Size of previous chunk, if allocated | |
1806 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1807 | Size of chunk, in bytes |M|P|
1808 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1809 | User data starts here... .
1810 . .
1811 . (malloc_usable_size() bytes) .
1812 . |
1813 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1814 | Size of chunk |
1815 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1816
1817
1818 Where "chunk" is the front of the chunk for the purpose of most of
1819 the malloc code, but "mem" is the pointer that is returned to the
1820 user. "Nextchunk" is the beginning of the next contiguous chunk.
1821
1822 Chunks always begin on even word boundries, so the mem portion
1823 (which is returned to the user) is also on an even word boundary, and
1824 thus at least double-word aligned.
1825
1826 Free chunks are stored in circular doubly-linked lists, and look like this:
1827
1828 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1829 | Size of previous chunk |
1830 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1831 `head:' | Size of chunk, in bytes |P|
1832 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1833 | Forward pointer to next chunk in list |
1834 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1835 | Back pointer to previous chunk in list |
1836 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1837 | Unused space (may be 0 bytes long) .
1838 . .
1839 . |
1840 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1841 `foot:' | Size of chunk, in bytes |
1842 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1843
1844 The P (PREV_INUSE) bit, stored in the unused low-order bit of the
1845 chunk size (which is always a multiple of two words), is an in-use
1846 bit for the *previous* chunk. If that bit is *clear*, then the
1847 word before the current chunk size contains the previous chunk
1848 size, and can be used to find the front of the previous chunk.
1849 The very first chunk allocated always has this bit set,
1850 preventing access to non-existent (or non-owned) memory. If
1851 prev_inuse is set for any given chunk, then you CANNOT determine
1852 the size of the previous chunk, and might even get a memory
1853 addressing fault when trying to do so.
1854
1855 Note that the `foot' of the current chunk is actually represented
1856 as the prev_size of the NEXT chunk. This makes it easier to
1857 deal with alignments etc but can be very confusing when trying
1858 to extend or adapt this code.
1859
1860 The two exceptions to all this are
1861
1862 1. The special chunk `top' doesn't bother using the
1863 trailing size field since there is no next contiguous chunk
1864 that would have to index off it. After initialization, `top'
1865 is forced to always exist. If it would become less than
1866 MINSIZE bytes long, it is replenished.
1867
1868 2. Chunks allocated via mmap, which have the second-lowest-order
1869 bit M (IS_MMAPPED) set in their size fields. Because they are
1870 allocated one-by-one, each must contain its own trailing size field.
1871
1872 */
1873
1874 /*
1875 ---------- Size and alignment checks and conversions ----------
1876 */
1877
1878 /* conversion from malloc headers to user pointers, and back */
1879
1880 #define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ))
1881 #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
1882
1883 /* The smallest possible chunk */
1884 #define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk))
1885
1886 /* The smallest size we can malloc is an aligned minimal chunk */
1887
1888 #define MINSIZE \
1889 (unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
1890
1891 /* Check if m has acceptable alignment */
1892
1893 #define aligned_OK(m) (((unsigned long)(m) & MALLOC_ALIGN_MASK) == 0)
1894
1895 #define misaligned_chunk(p) \
1896 ((uintptr_t)(MALLOC_ALIGNMENT == 2 * SIZE_SZ ? (p) : chunk2mem (p)) \
1897 & MALLOC_ALIGN_MASK)
1898
1899
1900 /*
1901 Check if a request is so large that it would wrap around zero when
1902 padded and aligned. To simplify some other code, the bound is made
1903 low enough so that adding MINSIZE will also not wrap around zero.
1904 */
1905
1906 #define REQUEST_OUT_OF_RANGE(req) \
1907 ((unsigned long)(req) >= \
1908 (unsigned long)(INTERNAL_SIZE_T)(-2 * MINSIZE))
1909
1910 /* pad request bytes into a usable size -- internal version */
1911
1912 #define request2size(req) \
1913 (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
1914 MINSIZE : \
1915 ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
1916
1917 /* Same, except also perform argument check */
1918
1919 #define checked_request2size(req, sz) \
1920 if (REQUEST_OUT_OF_RANGE(req)) { \
1921 MALLOC_FAILURE_ACTION; \
1922 return 0; \
1923 } \
1924 (sz) = request2size(req);
1925
1926 /*
1927 --------------- Physical chunk operations ---------------
1928 */
1929
1930
1931 /* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
1932 #define PREV_INUSE 0x1
1933
1934 /* extract inuse bit of previous chunk */
1935 #define prev_inuse(p) ((p)->size & PREV_INUSE)
1936
1937
1938 /* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
1939 #define IS_MMAPPED 0x2
1940
1941 /* check for mmap()'ed chunk */
1942 #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
1943
1944
1945 /* size field is or'ed with NON_MAIN_ARENA if the chunk was obtained
1946 from a non-main arena. This is only set immediately before handing
1947 the chunk to the user, if necessary. */
1948 #define NON_MAIN_ARENA 0x4
1949
1950 /* check for chunk from non-main arena */
1951 #define chunk_non_main_arena(p) ((p)->size & NON_MAIN_ARENA)
1952
1953
1954 /*
1955 Bits to mask off when extracting size
1956
1957 Note: IS_MMAPPED is intentionally not masked off from size field in
1958 macros for which mmapped chunks should never be seen. This should
1959 cause helpful core dumps to occur if it is tried by accident by
1960 people extending or adapting this malloc.
1961 */
1962 #define SIZE_BITS (PREV_INUSE|IS_MMAPPED|NON_MAIN_ARENA)
1963
1964 /* Get size, ignoring use bits */
1965 #define chunksize(p) ((p)->size & ~(SIZE_BITS))
1966
1967
1968 /* Ptr to next physical malloc_chunk. */
1969 #define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~SIZE_BITS) ))
1970
1971 /* Ptr to previous physical malloc_chunk */
1972 #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) ))
1973
1974 /* Treat space at ptr + offset as a chunk */
1975 #define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
1976
1977 /* extract p's inuse bit */
1978 #define inuse(p)\
1979 ((((mchunkptr)(((char*)(p))+((p)->size & ~SIZE_BITS)))->size) & PREV_INUSE)
1980
1981 /* set/clear chunk as being inuse without otherwise disturbing */
1982 #define set_inuse(p)\
1983 ((mchunkptr)(((char*)(p)) + ((p)->size & ~SIZE_BITS)))->size |= PREV_INUSE
1984
1985 #define clear_inuse(p)\
1986 ((mchunkptr)(((char*)(p)) + ((p)->size & ~SIZE_BITS)))->size &= ~(PREV_INUSE)
1987
1988
1989 /* check/set/clear inuse bits in known places */
1990 #define inuse_bit_at_offset(p, s)\
1991 (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE)
1992
1993 #define set_inuse_bit_at_offset(p, s)\
1994 (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE)
1995
1996 #define clear_inuse_bit_at_offset(p, s)\
1997 (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE))
1998
1999
2000 /* Set size at head, without disturbing its use bit */
2001 #define set_head_size(p, s) ((p)->size = (((p)->size & SIZE_BITS) | (s)))
2002
2003 /* Set size/use field */
2004 #define set_head(p, s) ((p)->size = (s))
2005
2006 /* Set size at footer (only when chunk is not in use) */
2007 #define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_size = (s))
2008
2009
2010 /*
2011 -------------------- Internal data structures --------------------
2012
2013 All internal state is held in an instance of malloc_state defined
2014 below. There are no other static variables, except in two optional
2015 cases:
2016 * If USE_MALLOC_LOCK is defined, the mALLOC_MUTEx declared above.
2017 * If HAVE_MMAP is true, but mmap doesn't support
2018 MAP_ANONYMOUS, a dummy file descriptor for mmap.
2019
2020 Beware of lots of tricks that minimize the total bookkeeping space
2021 requirements. The result is a little over 1K bytes (for 4byte
2022 pointers and size_t.)
2023 */
2024
2025 /*
2026 Bins
2027
2028 An array of bin headers for free chunks. Each bin is doubly
2029 linked. The bins are approximately proportionally (log) spaced.
2030 There are a lot of these bins (128). This may look excessive, but
2031 works very well in practice. Most bins hold sizes that are
2032 unusual as malloc request sizes, but are more usual for fragments
2033 and consolidated sets of chunks, which is what these bins hold, so
2034 they can be found quickly. All procedures maintain the invariant
2035 that no consolidated chunk physically borders another one, so each
2036 chunk in a list is known to be preceeded and followed by either
2037 inuse chunks or the ends of memory.
2038
2039 Chunks in bins are kept in size order, with ties going to the
2040 approximately least recently used chunk. Ordering isn't needed
2041 for the small bins, which all contain the same-sized chunks, but
2042 facilitates best-fit allocation for larger chunks. These lists
2043 are just sequential. Keeping them in order almost never requires
2044 enough traversal to warrant using fancier ordered data
2045 structures.
2046
2047 Chunks of the same size are linked with the most
2048 recently freed at the front, and allocations are taken from the
2049 back. This results in LRU (FIFO) allocation order, which tends
2050 to give each chunk an equal opportunity to be consolidated with
2051 adjacent freed chunks, resulting in larger free chunks and less
2052 fragmentation.
2053
2054 To simplify use in double-linked lists, each bin header acts
2055 as a malloc_chunk. This avoids special-casing for headers.
2056 But to conserve space and improve locality, we allocate
2057 only the fd/bk pointers of bins, and then use repositioning tricks
2058 to treat these as the fields of a malloc_chunk*.
2059 */
2060
2061 typedef struct malloc_chunk* mbinptr;
2062
2063 /* addressing -- note that bin_at(0) does not exist */
2064 #define bin_at(m, i) \
2065 (mbinptr) (((char *) &((m)->bins[((i) - 1) * 2])) \
2066 - offsetof (struct malloc_chunk, fd))
2067
2068 /* analog of ++bin */
2069 #define next_bin(b) ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
2070
2071 /* Reminders about list directionality within bins */
2072 #define first(b) ((b)->fd)
2073 #define last(b) ((b)->bk)
2074
2075 /* Take a chunk off a bin list */
2076 #define unlink(P, BK, FD) { \
2077 FD = P->fd; \
2078 BK = P->bk; \
2079 if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
2080 malloc_printerr (check_action, "corrupted double-linked list", P); \
2081 else { \
2082 FD->bk = BK; \
2083 BK->fd = FD; \
2084 } \
2085 }
2086
2087 /*
2088 Indexing
2089
2090 Bins for sizes < 512 bytes contain chunks of all the same size, spaced
2091 8 bytes apart. Larger bins are approximately logarithmically spaced:
2092
2093 64 bins of size 8
2094 32 bins of size 64
2095 16 bins of size 512
2096 8 bins of size 4096
2097 4 bins of size 32768
2098 2 bins of size 262144
2099 1 bin of size what's left
2100
2101 There is actually a little bit of slop in the numbers in bin_index
2102 for the sake of speed. This makes no difference elsewhere.
2103
2104 The bins top out around 1MB because we expect to service large
2105 requests via mmap.
2106 */
2107
2108 #define NBINS 128
2109 #define NSMALLBINS 64
2110 #define SMALLBIN_WIDTH 8
2111 #define MIN_LARGE_SIZE 512
2112
2113 #define in_smallbin_range(sz) \
2114 ((unsigned long)(sz) < (unsigned long)MIN_LARGE_SIZE)
2115
2116 #define smallbin_index(sz) (((unsigned)(sz)) >> 3)
2117
2118 #define largebin_index(sz) \
2119 (((((unsigned long)(sz)) >> 6) <= 32)? 56 + (((unsigned long)(sz)) >> 6): \
2120 ((((unsigned long)(sz)) >> 9) <= 20)? 91 + (((unsigned long)(sz)) >> 9): \
2121 ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
2122 ((((unsigned long)(sz)) >> 15) <= 4)? 119 + (((unsigned long)(sz)) >> 15): \
2123 ((((unsigned long)(sz)) >> 18) <= 2)? 124 + (((unsigned long)(sz)) >> 18): \
2124 126)
2125
2126 #define bin_index(sz) \
2127 ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
2128
2129
2130 /*
2131 Unsorted chunks
2132
2133 All remainders from chunk splits, as well as all returned chunks,
2134 are first placed in the "unsorted" bin. They are then placed
2135 in regular bins after malloc gives them ONE chance to be used before
2136 binning. So, basically, the unsorted_chunks list acts as a queue,
2137 with chunks being placed on it in free (and malloc_consolidate),
2138 and taken off (to be either used or placed in bins) in malloc.
2139
2140 The NON_MAIN_ARENA flag is never set for unsorted chunks, so it
2141 does not have to be taken into account in size comparisons.
2142 */
2143
2144 /* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
2145 #define unsorted_chunks(M) (bin_at(M, 1))
2146
2147 /*
2148 Top
2149
2150 The top-most available chunk (i.e., the one bordering the end of
2151 available memory) is treated specially. It is never included in
2152 any bin, is used only if no other chunk is available, and is
2153 released back to the system if it is very large (see
2154 M_TRIM_THRESHOLD). Because top initially
2155 points to its own bin with initial zero size, thus forcing
2156 extension on the first malloc request, we avoid having any special
2157 code in malloc to check whether it even exists yet. But we still
2158 need to do so when getting memory from system, so we make
2159 initial_top treat the bin as a legal but unusable chunk during the
2160 interval between initialization and the first call to
2161 sYSMALLOc. (This is somewhat delicate, since it relies on
2162 the 2 preceding words to be zero during this interval as well.)
2163 */
2164
2165 /* Conveniently, the unsorted bin can be used as dummy top on first call */
2166 #define initial_top(M) (unsorted_chunks(M))
2167
2168 /*
2169 Binmap
2170
2171 To help compensate for the large number of bins, a one-level index
2172 structure is used for bin-by-bin searching. `binmap' is a
2173 bitvector recording whether bins are definitely empty so they can
2174 be skipped over during during traversals. The bits are NOT always
2175 cleared as soon as bins are empty, but instead only
2176 when they are noticed to be empty during traversal in malloc.
2177 */
2178
2179 /* Conservatively use 32 bits per map word, even if on 64bit system */
2180 #define BINMAPSHIFT 5
2181 #define BITSPERMAP (1U << BINMAPSHIFT)
2182 #define BINMAPSIZE (NBINS / BITSPERMAP)
2183
2184 #define idx2block(i) ((i) >> BINMAPSHIFT)
2185 #define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
2186
2187 #define mark_bin(m,i) ((m)->binmap[idx2block(i)] |= idx2bit(i))
2188 #define unmark_bin(m,i) ((m)->binmap[idx2block(i)] &= ~(idx2bit(i)))
2189 #define get_binmap(m,i) ((m)->binmap[idx2block(i)] & idx2bit(i))
2190
2191 /*
2192 Fastbins
2193
2194 An array of lists holding recently freed small chunks. Fastbins
2195 are not doubly linked. It is faster to single-link them, and
2196 since chunks are never removed from the middles of these lists,
2197 double linking is not necessary. Also, unlike regular bins, they
2198 are not even processed in FIFO order (they use faster LIFO) since
2199 ordering doesn't much matter in the transient contexts in which
2200 fastbins are normally used.
2201
2202 Chunks in fastbins keep their inuse bit set, so they cannot
2203 be consolidated with other free chunks. malloc_consolidate
2204 releases all chunks in fastbins and consolidates them with
2205 other free chunks.
2206 */
2207
2208 typedef struct malloc_chunk* mfastbinptr;
2209
2210 /* offset 2 to use otherwise unindexable first 2 bins */
2211 #define fastbin_index(sz) ((((unsigned int)(sz)) >> 3) - 2)
2212
2213 /* The maximum fastbin request size we support */
2214 #define MAX_FAST_SIZE 80
2215
2216 #define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
2217
2218 /*
2219 FASTBIN_CONSOLIDATION_THRESHOLD is the size of a chunk in free()
2220 that triggers automatic consolidation of possibly-surrounding
2221 fastbin chunks. This is a heuristic, so the exact value should not
2222 matter too much. It is defined at half the default trim threshold as a
2223 compromise heuristic to only attempt consolidation if it is likely
2224 to lead to trimming. However, it is not dynamically tunable, since
2225 consolidation reduces fragmentation surrounding large chunks even
2226 if trimming is not used.
2227 */
2228
2229 #define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
2230
2231 /*
2232 Since the lowest 2 bits in max_fast don't matter in size comparisons,
2233 they are used as flags.
2234 */
2235
2236 /*
2237 FASTCHUNKS_BIT held in max_fast indicates that there are probably
2238 some fastbin chunks. It is set true on entering a chunk into any
2239 fastbin, and cleared only in malloc_consolidate.
2240
2241 The truth value is inverted so that have_fastchunks will be true
2242 upon startup (since statics are zero-filled), simplifying
2243 initialization checks.
2244 */
2245
2246 #define FASTCHUNKS_BIT (1U)
2247
2248 #define have_fastchunks(M) (((M)->flags & FASTCHUNKS_BIT) == 0)
2249 #define clear_fastchunks(M) ((M)->flags |= FASTCHUNKS_BIT)
2250 #define set_fastchunks(M) ((M)->flags &= ~FASTCHUNKS_BIT)
2251
2252 /*
2253 NONCONTIGUOUS_BIT indicates that MORECORE does not return contiguous
2254 regions. Otherwise, contiguity is exploited in merging together,
2255 when possible, results from consecutive MORECORE calls.
2256
2257 The initial value comes from MORECORE_CONTIGUOUS, but is
2258 changed dynamically if mmap is ever used as an sbrk substitute.
2259 */
2260
2261 #define NONCONTIGUOUS_BIT (2U)
2262
2263 #define contiguous(M) (((M)->flags & NONCONTIGUOUS_BIT) == 0)
2264 #define noncontiguous(M) (((M)->flags & NONCONTIGUOUS_BIT) != 0)
2265 #define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT)
2266 #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
2267
2268 /*
2269 Set value of max_fast.
2270 Use impossibly small value if 0.
2271 Precondition: there are no existing fastbin chunks.
2272 Setting the value clears fastchunk bit but preserves noncontiguous bit.
2273 */
2274
2275 #define set_max_fast(s) \
2276 global_max_fast = ((s) == 0)? SMALLBIN_WIDTH: request2size(s)
2277 #define get_max_fast() global_max_fast
2278
2279
2280 /*
2281 ----------- Internal state representation and initialization -----------
2282 */
2283
2284 struct malloc_state {
2285 /* Serialize access. */
2286 mutex_t mutex;
2287
2288 /* Flags (formerly in max_fast). */
2289 int flags;
2290
2291 #if THREAD_STATS
2292 /* Statistics for locking. Only used if THREAD_STATS is defined. */
2293 long stat_lock_direct, stat_lock_loop, stat_lock_wait;
2294 #endif
2295
2296 /* Fastbins */
2297 mfastbinptr fastbins[NFASTBINS];
2298
2299 /* Base of the topmost chunk -- not otherwise kept in a bin */
2300 mchunkptr top;
2301
2302 /* The remainder from the most recent split of a small request */
2303 mchunkptr last_remainder;
2304
2305 /* Normal bins packed as described above */
2306 mchunkptr bins[NBINS * 2 - 2];
2307
2308 /* Bitmap of bins */
2309 unsigned int binmap[BINMAPSIZE];
2310
2311 /* Linked list */
2312 struct malloc_state *next;
2313
2314 /* Memory allocated from the system in this arena. */
2315 INTERNAL_SIZE_T system_mem;
2316 INTERNAL_SIZE_T max_system_mem;
2317 };
2318
2319 struct malloc_par {
2320 /* Tunable parameters */
2321 unsigned long trim_threshold;
2322 INTERNAL_SIZE_T top_pad;
2323 INTERNAL_SIZE_T mmap_threshold;
2324
2325 /* Memory map support */
2326 int n_mmaps;
2327 int n_mmaps_max;
2328 int max_n_mmaps;
2329 /* the mmap_threshold is dynamic, until the user sets
2330 it manually, at which point we need to disable any
2331 dynamic behavior. */
2332 int no_dyn_threshold;
2333
2334 /* Cache malloc_getpagesize */
2335 unsigned int pagesize;
2336
2337 /* Statistics */
2338 INTERNAL_SIZE_T mmapped_mem;
2339 /*INTERNAL_SIZE_T sbrked_mem;*/
2340 /*INTERNAL_SIZE_T max_sbrked_mem;*/
2341 INTERNAL_SIZE_T max_mmapped_mem;
2342 INTERNAL_SIZE_T max_total_mem; /* only kept for NO_THREADS */
2343
2344 /* First address handed out by MORECORE/sbrk. */
2345 char* sbrk_base;
2346 };
2347
2348 /* There are several instances of this struct ("arenas") in this
2349 malloc. If you are adapting this malloc in a way that does NOT use
2350 a static or mmapped malloc_state, you MUST explicitly zero-fill it
2351 before using. This malloc relies on the property that malloc_state
2352 is initialized to all zeroes (as is true of C statics). */
2353
2354 static struct malloc_state main_arena;
2355
2356 /* There is only one instance of the malloc parameters. */
2357
2358 static struct malloc_par mp_;
2359
2360
2361 /* Maximum size of memory handled in fastbins. */
2362 static INTERNAL_SIZE_T global_max_fast;
2363
2364 /*
2365 Initialize a malloc_state struct.
2366
2367 This is called only from within malloc_consolidate, which needs
2368 be called in the same contexts anyway. It is never called directly
2369 outside of malloc_consolidate because some optimizing compilers try
2370 to inline it at all call points, which turns out not to be an
2371 optimization at all. (Inlining it in malloc_consolidate is fine though.)
2372 */
2373
2374 #if __STD_C
2375 static void malloc_init_state(mstate av)
2376 #else
2377 static void malloc_init_state(av) mstate av;
2378 #endif
2379 {
2380 int i;
2381 mbinptr bin;
2382
2383 /* Establish circular links for normal bins */
2384 for (i = 1; i < NBINS; ++i) {
2385 bin = bin_at(av,i);
2386 bin->fd = bin->bk = bin;
2387 }
2388
2389 #if MORECORE_CONTIGUOUS
2390 if (av != &main_arena)
2391 #endif
2392 set_noncontiguous(av);
2393 if (av == &main_arena)
2394 set_max_fast(DEFAULT_MXFAST);
2395 av->flags |= FASTCHUNKS_BIT;
2396
2397 av->top = initial_top(av);
2398 }
2399
2400 /*
2401 Other internal utilities operating on mstates
2402 */
2403
2404 #if __STD_C
2405 static Void_t* sYSMALLOc(INTERNAL_SIZE_T, mstate);
2406 static int sYSTRIm(size_t, mstate);
2407 static void malloc_consolidate(mstate);
2408 #ifndef _LIBC
2409 static Void_t** iALLOc(mstate, size_t, size_t*, int, Void_t**);
2410 #endif
2411 #else
2412 static Void_t* sYSMALLOc();
2413 static int sYSTRIm();
2414 static void malloc_consolidate();
2415 static Void_t** iALLOc();
2416 #endif
2417
2418
2419 /* -------------- Early definitions for debugging hooks ---------------- */
2420
2421 /* Define and initialize the hook variables. These weak definitions must
2422 appear before any use of the variables in a function (arena.c uses one). */
2423 #ifndef weak_variable
2424 #ifndef _LIBC
2425 #define weak_variable /**/
2426 #else
2427 /* In GNU libc we want the hook variables to be weak definitions to
2428 avoid a problem with Emacs. */
2429 #define weak_variable weak_function
2430 #endif
2431 #endif
2432
2433 /* Forward declarations. */
2434 static Void_t* malloc_hook_ini __MALLOC_P ((size_t sz,
2435 const __malloc_ptr_t caller));
2436 static Void_t* realloc_hook_ini __MALLOC_P ((Void_t* ptr, size_t sz,
2437 const __malloc_ptr_t caller));
2438 static Void_t* memalign_hook_ini __MALLOC_P ((size_t alignment, size_t sz,
2439 const __malloc_ptr_t caller));
2440
2441 void weak_variable (*__malloc_initialize_hook) (void) = NULL;
2442 void weak_variable (*__free_hook) (__malloc_ptr_t __ptr,
2443 const __malloc_ptr_t) = NULL;
2444 __malloc_ptr_t weak_variable (*__malloc_hook)
2445 (size_t __size, const __malloc_ptr_t) = malloc_hook_ini;
2446 __malloc_ptr_t weak_variable (*__realloc_hook)
2447 (__malloc_ptr_t __ptr, size_t __size, const __malloc_ptr_t)
2448 = realloc_hook_ini;
2449 __malloc_ptr_t weak_variable (*__memalign_hook)
2450 (size_t __alignment, size_t __size, const __malloc_ptr_t)
2451 = memalign_hook_ini;
2452 void weak_variable (*__after_morecore_hook) (void) = NULL;
2453
2454
2455 /* ---------------- Error behavior ------------------------------------ */
2456
2457 #ifndef DEFAULT_CHECK_ACTION
2458 #define DEFAULT_CHECK_ACTION 3
2459 #endif
2460
2461 static int check_action = DEFAULT_CHECK_ACTION;
2462
2463
2464 /* ------------------ Testing support ----------------------------------*/
2465
2466 static int perturb_byte;
2467
2468 #define alloc_perturb(p, n) memset (p, (perturb_byte ^ 0xff) & 0xff, n)
2469 #define free_perturb(p, n) memset (p, perturb_byte & 0xff, n)
2470
2471
2472 /* ------------------- Support for multiple arenas -------------------- */
2473 #include "arena.c"
2474
2475 /*
2476 Debugging support
2477
2478 These routines make a number of assertions about the states
2479 of data structures that should be true at all times. If any
2480 are not true, it's very likely that a user program has somehow
2481 trashed memory. (It's also possible that there is a coding error
2482 in malloc. In which case, please report it!)
2483 */
2484
2485 #if ! MALLOC_DEBUG
2486
2487 #define check_chunk(A,P)
2488 #define check_free_chunk(A,P)
2489 #define check_inuse_chunk(A,P)
2490 #define check_remalloced_chunk(A,P,N)
2491 #define check_malloced_chunk(A,P,N)
2492 #define check_malloc_state(A)
2493
2494 #else
2495
2496 #define check_chunk(A,P) do_check_chunk(A,P)
2497 #define check_free_chunk(A,P) do_check_free_chunk(A,P)
2498 #define check_inuse_chunk(A,P) do_check_inuse_chunk(A,P)
2499 #define check_remalloced_chunk(A,P,N) do_check_remalloced_chunk(A,P,N)
2500 #define check_malloced_chunk(A,P,N) do_check_malloced_chunk(A,P,N)
2501 #define check_malloc_state(A) do_check_malloc_state(A)
2502
2503 /*
2504 Properties of all chunks
2505 */
2506
2507 #if __STD_C
2508 static void do_check_chunk(mstate av, mchunkptr p)
2509 #else
2510 static void do_check_chunk(av, p) mstate av; mchunkptr p;
2511 #endif
2512 {
2513 unsigned long sz = chunksize(p);
2514 /* min and max possible addresses assuming contiguous allocation */
2515 char* max_address = (char*)(av->top) + chunksize(av->top);
2516 char* min_address = max_address - av->system_mem;
2517
2518 if (!chunk_is_mmapped(p)) {
2519
2520 /* Has legal address ... */
2521 if (p != av->top) {
2522 if (contiguous(av)) {
2523 assert(((char*)p) >= min_address);
2524 assert(((char*)p + sz) <= ((char*)(av->top)));
2525 }
2526 }
2527 else {
2528 /* top size is always at least MINSIZE */
2529 assert((unsigned long)(sz) >= MINSIZE);
2530 /* top predecessor always marked inuse */
2531 assert(prev_inuse(p));
2532 }
2533
2534 }
2535 else {
2536 #if HAVE_MMAP
2537 /* address is outside main heap */
2538 if (contiguous(av) && av->top != initial_top(av)) {
2539 assert(((char*)p) < min_address || ((char*)p) > max_address);
2540 }
2541 /* chunk is page-aligned */
2542 assert(((p->prev_size + sz) & (mp_.pagesize-1)) == 0);
2543 /* mem is aligned */
2544 assert(aligned_OK(chunk2mem(p)));
2545 #else
2546 /* force an appropriate assert violation if debug set */
2547 assert(!chunk_is_mmapped(p));
2548 #endif
2549 }
2550 }
2551
2552 /*
2553 Properties of free chunks
2554 */
2555
2556 #if __STD_C
2557 static void do_check_free_chunk(mstate av, mchunkptr p)
2558 #else
2559 static void do_check_free_chunk(av, p) mstate av; mchunkptr p;
2560 #endif
2561 {
2562 INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
2563 mchunkptr next = chunk_at_offset(p, sz);
2564
2565 do_check_chunk(av, p);
2566
2567 /* Chunk must claim to be free ... */
2568 assert(!inuse(p));
2569 assert (!chunk_is_mmapped(p));
2570
2571 /* Unless a special marker, must have OK fields */
2572 if ((unsigned long)(sz) >= MINSIZE)
2573 {
2574 assert((sz & MALLOC_ALIGN_MASK) == 0);
2575 assert(aligned_OK(chunk2mem(p)));
2576 /* ... matching footer field */
2577 assert(next->prev_size == sz);
2578 /* ... and is fully consolidated */
2579 assert(prev_inuse(p));
2580 assert (next == av->top || inuse(next));
2581
2582 /* ... and has minimally sane links */
2583 assert(p->fd->bk == p);
2584 assert(p->bk->fd == p);
2585 }
2586 else /* markers are always of size SIZE_SZ */
2587 assert(sz == SIZE_SZ);
2588 }
2589
2590 /*
2591 Properties of inuse chunks
2592 */
2593
2594 #if __STD_C
2595 static void do_check_inuse_chunk(mstate av, mchunkptr p)
2596 #else
2597 static void do_check_inuse_chunk(av, p) mstate av; mchunkptr p;
2598 #endif
2599 {
2600 mchunkptr next;
2601
2602 do_check_chunk(av, p);
2603
2604 if (chunk_is_mmapped(p))
2605 return; /* mmapped chunks have no next/prev */
2606
2607 /* Check whether it claims to be in use ... */
2608 assert(inuse(p));
2609
2610 next = next_chunk(p);
2611
2612 /* ... and is surrounded by OK chunks.
2613 Since more things can be checked with free chunks than inuse ones,
2614 if an inuse chunk borders them and debug is on, it's worth doing them.
2615 */
2616 if (!prev_inuse(p)) {
2617 /* Note that we cannot even look at prev unless it is not inuse */
2618 mchunkptr prv = prev_chunk(p);
2619 assert(next_chunk(prv) == p);
2620 do_check_free_chunk(av, prv);
2621 }
2622
2623 if (next == av->top) {
2624 assert(prev_inuse(next));
2625 assert(chunksize(next) >= MINSIZE);
2626 }
2627 else if (!inuse(next))
2628 do_check_free_chunk(av, next);
2629 }
2630
2631 /*
2632 Properties of chunks recycled from fastbins
2633 */
2634
2635 #if __STD_C
2636 static void do_check_remalloced_chunk(mstate av, mchunkptr p, INTERNAL_SIZE_T s)
2637 #else
2638 static void do_check_remalloced_chunk(av, p, s)
2639 mstate av; mchunkptr p; INTERNAL_SIZE_T s;
2640 #endif
2641 {
2642 INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
2643
2644 if (!chunk_is_mmapped(p)) {
2645 assert(av == arena_for_chunk(p));
2646 if (chunk_non_main_arena(p))
2647 assert(av != &main_arena);
2648 else
2649 assert(av == &main_arena);
2650 }
2651
2652 do_check_inuse_chunk(av, p);
2653
2654 /* Legal size ... */
2655 assert((sz & MALLOC_ALIGN_MASK) == 0);
2656 assert((unsigned long)(sz) >= MINSIZE);
2657 /* ... and alignment */
2658 assert(aligned_OK(chunk2mem(p)));
2659 /* chunk is less than MINSIZE more than request */
2660 assert((long)(sz) - (long)(s) >= 0);
2661 assert((long)(sz) - (long)(s + MINSIZE) < 0);
2662 }
2663
2664 /*
2665 Properties of nonrecycled chunks at the point they are malloced
2666 */
2667
2668 #if __STD_C
2669 static void do_check_malloced_chunk(mstate av, mchunkptr p, INTERNAL_SIZE_T s)
2670 #else
2671 static void do_check_malloced_chunk(av, p, s)
2672 mstate av; mchunkptr p; INTERNAL_SIZE_T s;
2673 #endif
2674 {
2675 /* same as recycled case ... */
2676 do_check_remalloced_chunk(av, p, s);
2677
2678 /*
2679 ... plus, must obey implementation invariant that prev_inuse is
2680 always true of any allocated chunk; i.e., that each allocated
2681 chunk borders either a previously allocated and still in-use
2682 chunk, or the base of its memory arena. This is ensured
2683 by making all allocations from the the `lowest' part of any found
2684 chunk. This does not necessarily hold however for chunks
2685 recycled via fastbins.
2686 */
2687
2688 assert(prev_inuse(p));
2689 }
2690
2691
2692 /*
2693 Properties of malloc_state.
2694
2695 This may be useful for debugging malloc, as well as detecting user
2696 programmer errors that somehow write into malloc_state.
2697
2698 If you are extending or experimenting with this malloc, you can
2699 probably figure out how to hack this routine to print out or
2700 display chunk addresses, sizes, bins, and other instrumentation.
2701 */
2702
2703 static void do_check_malloc_state(mstate av)
2704 {
2705 int i;
2706 mchunkptr p;
2707 mchunkptr q;
2708 mbinptr b;
2709 unsigned int binbit;
2710 int empty;
2711 unsigned int idx;
2712 INTERNAL_SIZE_T size;
2713 unsigned long total = 0;
2714 int max_fast_bin;
2715
2716 /* internal size_t must be no wider than pointer type */
2717 assert(sizeof(INTERNAL_SIZE_T) <= sizeof(char*));
2718
2719 /* alignment is a power of 2 */
2720 assert((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-1)) == 0);
2721
2722 /* cannot run remaining checks until fully initialized */
2723 if (av->top == 0 || av->top == initial_top(av))
2724 return;
2725
2726 /* pagesize is a power of 2 */
2727 assert((mp_.pagesize & (mp_.pagesize-1)) == 0);
2728
2729 /* A contiguous main_arena is consistent with sbrk_base. */
2730 if (av == &main_arena && contiguous(av))
2731 assert((char*)mp_.sbrk_base + av->system_mem ==
2732 (char*)av->top + chunksize(av->top));
2733
2734 /* properties of fastbins */
2735
2736 /* max_fast is in allowed range */
2737 assert((get_max_fast () & ~1) <= request2size(MAX_FAST_SIZE));
2738
2739 max_fast_bin = fastbin_index(get_max_fast ());
2740
2741 for (i = 0; i < NFASTBINS; ++i) {
2742 p = av->fastbins[i];
2743
2744 /* The following test can only be performed for the main arena.
2745 While mallopt calls malloc_consolidate to get rid of all fast
2746 bins (especially those larger than the new maximum) this does
2747 only happen for the main arena. Trying to do this for any
2748 other arena would mean those arenas have to be locked and
2749 malloc_consolidate be called for them. This is excessive. And
2750 even if this is acceptable to somebody it still cannot solve
2751 the problem completely since if the arena is locked a
2752 concurrent malloc call might create a new arena which then
2753 could use the newly invalid fast bins. */
2754
2755 /* all bins past max_fast are empty */
2756 if (av == &main_arena && i > max_fast_bin)
2757 assert(p == 0);
2758
2759 while (p != 0) {
2760 /* each chunk claims to be inuse */
2761 do_check_inuse_chunk(av, p);
2762 total += chunksize(p);
2763 /* chunk belongs in this bin */
2764 assert(fastbin_index(chunksize(p)) == i);
2765 p = p->fd;
2766 }
2767 }
2768
2769 if (total != 0)
2770 assert(have_fastchunks(av));
2771 else if (!have_fastchunks(av))
2772 assert(total == 0);
2773
2774 /* check normal bins */
2775 for (i = 1; i < NBINS; ++i) {
2776 b = bin_at(av,i);
2777
2778 /* binmap is accurate (except for bin 1 == unsorted_chunks) */
2779 if (i >= 2) {
2780 binbit = get_binmap(av,i);
2781 empty = last(b) == b;
2782 if (!binbit)
2783 assert(empty);
2784 else if (!empty)
2785 assert(binbit);
2786 }
2787
2788 for (p = last(b); p != b; p = p->bk) {
2789 /* each chunk claims to be free */
2790 do_check_free_chunk(av, p);
2791 size = chunksize(p);
2792 total += size;
2793 if (i >= 2) {
2794 /* chunk belongs in bin */
2795 idx = bin_index(size);
2796 assert(idx == i);
2797 /* lists are sorted */
2798 assert(p->bk == b ||
2799 (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
2800 }
2801 /* chunk is followed by a legal chain of inuse chunks */
2802 for (q = next_chunk(p);
2803 (q != av->top && inuse(q) &&
2804 (unsigned long)(chunksize(q)) >= MINSIZE);
2805 q = next_chunk(q))
2806 do_check_inuse_chunk(av, q);
2807 }
2808 }
2809
2810 /* top chunk is OK */
2811 check_chunk(av, av->top);
2812
2813 /* sanity checks for statistics */
2814
2815 #ifdef NO_THREADS
2816 assert(total <= (unsigned long)(mp_.max_total_mem));
2817 assert(mp_.n_mmaps >= 0);
2818 #endif
2819 assert(mp_.n_mmaps <= mp_.n_mmaps_max);
2820 assert(mp_.n_mmaps <= mp_.max_n_mmaps);
2821
2822 assert((unsigned long)(av->system_mem) <=
2823 (unsigned long)(av->max_system_mem));
2824
2825 assert((unsigned long)(mp_.mmapped_mem) <=
2826 (unsigned long)(mp_.max_mmapped_mem));
2827
2828 #ifdef NO_THREADS
2829 assert((unsigned long)(mp_.max_total_mem) >=
2830 (unsigned long)(mp_.mmapped_mem) + (unsigned long)(av->system_mem));
2831 #endif
2832 }
2833 #endif
2834
2835
2836 /* ----------------- Support for debugging hooks -------------------- */
2837 #include "hooks.c"
2838
2839
2840 /* ----------- Routines dealing with system allocation -------------- */
2841
2842 /*
2843 sysmalloc handles malloc cases requiring more memory from the system.
2844 On entry, it is assumed that av->top does not have enough
2845 space to service request for nb bytes, thus requiring that av->top
2846 be extended or replaced.
2847 */
2848
2849 #if __STD_C
2850 static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
2851 #else
2852 static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
2853 #endif
2854 {
2855 mchunkptr old_top; /* incoming value of av->top */
2856 INTERNAL_SIZE_T old_size; /* its size */
2857 char* old_end; /* its end address */
2858
2859 long size; /* arg to first MORECORE or mmap call */
2860 char* brk; /* return value from MORECORE */
2861
2862 long correction; /* arg to 2nd MORECORE call */
2863 char* snd_brk; /* 2nd return val */
2864
2865 INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
2866 INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
2867 char* aligned_brk; /* aligned offset into brk */
2868
2869 mchunkptr p; /* the allocated/returned chunk */
2870 mchunkptr remainder; /* remainder from allocation */
2871 unsigned long remainder_size; /* its size */
2872
2873 unsigned long sum; /* for updating stats */
2874
2875 size_t pagemask = mp_.pagesize - 1;
2876 bool tried_mmap = false;
2877
2878
2879 #if HAVE_MMAP
2880
2881 /*
2882 If have mmap, and the request size meets the mmap threshold, and
2883 the system supports mmap, and there are few enough currently
2884 allocated mmapped regions, try to directly map this request
2885 rather than expanding top.
2886 */
2887
2888 if ((unsigned long)(nb) >= (unsigned long)(mp_.mmap_threshold) &&
2889 (mp_.n_mmaps < mp_.n_mmaps_max)) {
2890
2891 char* mm; /* return value from mmap call*/
2892
2893 try_mmap:
2894 /*
2895 Round up size to nearest page. For mmapped chunks, the overhead
2896 is one SIZE_SZ unit larger than for normal chunks, because there
2897 is no following chunk whose prev_size field could be used.
2898 */
2899 size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
2900 tried_mmap = true;
2901
2902 /* Don't try if size wraps around 0 */
2903 if ((unsigned long)(size) > (unsigned long)(nb)) {
2904
2905 mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
2906
2907 if (mm != MAP_FAILED) {
2908
2909 /*
2910 The offset to the start of the mmapped region is stored
2911 in the prev_size field of the chunk. This allows us to adjust
2912 returned start address to meet alignment requirements here
2913 and in memalign(), and still be able to compute proper
2914 address argument for later munmap in free() and realloc().
2915 */
2916
2917 front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
2918 if (front_misalign > 0) {
2919 correction = MALLOC_ALIGNMENT - front_misalign;
2920 p = (mchunkptr)(mm + correction);
2921 p->prev_size = correction;
2922 set_head(p, (size - correction) |IS_MMAPPED);
2923 }
2924 else {
2925 p = (mchunkptr)mm;
2926 set_head(p, size|IS_MMAPPED);
2927 }
2928
2929 /* update statistics */
2930
2931 if (++mp_.n_mmaps > mp_.max_n_mmaps)
2932 mp_.max_n_mmaps = mp_.n_mmaps;
2933
2934 sum = mp_.mmapped_mem += size;
2935 if (sum > (unsigned long)(mp_.max_mmapped_mem))
2936 mp_.max_mmapped_mem = sum;
2937 #ifdef NO_THREADS
2938 sum += av->system_mem;
2939 if (sum > (unsigned long)(mp_.max_total_mem))
2940 mp_.max_total_mem = sum;
2941 #endif
2942
2943 check_chunk(av, p);
2944
2945 return chunk2mem(p);
2946 }
2947 }
2948 }
2949 #endif
2950
2951 /* Record incoming configuration of top */
2952
2953 old_top = av->top;
2954 old_size = chunksize(old_top);
2955 old_end = (char*)(chunk_at_offset(old_top, old_size));
2956
2957 brk = snd_brk = (char*)(MORECORE_FAILURE);
2958
2959 /*
2960 If not the first time through, we require old_size to be
2961 at least MINSIZE and to have prev_inuse set.
2962 */
2963
2964 assert((old_top == initial_top(av) && old_size == 0) ||
2965 ((unsigned long) (old_size) >= MINSIZE &&
2966 prev_inuse(old_top) &&
2967 ((unsigned long)old_end & pagemask) == 0));
2968
2969 /* Precondition: not enough current space to satisfy nb request */
2970 assert((unsigned long)(old_size) < (unsigned long)(nb + MINSIZE));
2971
2972 /* Precondition: all fastbins are consolidated */
2973 assert(!have_fastchunks(av));
2974
2975
2976 if (av != &main_arena) {
2977
2978 heap_info *old_heap, *heap;
2979 size_t old_heap_size;
2980
2981 /* First try to extend the current heap. */
2982 old_heap = heap_for_ptr(old_top);
2983 old_heap_size = old_heap->size;
2984 if ((long) (MINSIZE + nb - old_size) > 0
2985 && grow_heap(old_heap, MINSIZE + nb - old_size) == 0) {
2986 av->system_mem += old_heap->size - old_heap_size;
2987 arena_mem += old_heap->size - old_heap_size;
2988 #if 0
2989 if(mmapped_mem + arena_mem + sbrked_mem > max_total_mem)
2990 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
2991 #endif
2992 set_head(old_top, (((char *)old_heap + old_heap->size) - (char *)old_top)
2993 | PREV_INUSE);
2994 }
2995 else if ((heap = new_heap(nb + (MINSIZE + sizeof(*heap)), mp_.top_pad))) {
2996 /* Use a newly allocated heap. */
2997 heap->ar_ptr = av;
2998 heap->prev = old_heap;
2999 av->system_mem += heap->size;
3000 arena_mem += heap->size;
3001 #if 0
3002 if((unsigned long)(mmapped_mem + arena_mem + sbrked_mem) > max_total_mem)
3003 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
3004 #endif
3005 /* Set up the new top. */
3006 top(av) = chunk_at_offset(heap, sizeof(*heap));
3007 set_head(top(av), (heap->size - sizeof(*heap)) | PREV_INUSE);
3008
3009 /* Setup fencepost and free the old top chunk. */
3010 /* The fencepost takes at least MINSIZE bytes, because it might
3011 become the top chunk again later. Note that a footer is set
3012 up, too, although the chunk is marked in use. */
3013 old_size -= MINSIZE;
3014 set_head(chunk_at_offset(old_top, old_size + 2*SIZE_SZ), 0|PREV_INUSE);
3015 if (old_size >= MINSIZE) {
3016 set_head(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)|PREV_INUSE);
3017 set_foot(chunk_at_offset(old_top, old_size), (2*SIZE_SZ));
3018 set_head(old_top, old_size|PREV_INUSE|NON_MAIN_ARENA);
3019 _int_free(av, chunk2mem(old_top));
3020 } else {
3021 set_head(old_top, (old_size + 2*SIZE_SZ)|PREV_INUSE);
3022 set_foot(old_top, (old_size + 2*SIZE_SZ));
3023 }
3024 }
3025 else if (!tried_mmap)
3026 /* We can at least try to use to mmap memory. */
3027 goto try_mmap;
3028
3029 } else { /* av == main_arena */
3030
3031
3032 /* Request enough space for nb + pad + overhead */
3033
3034 size = nb + mp_.top_pad + MINSIZE;
3035
3036 /*
3037 If contiguous, we can subtract out existing space that we hope to
3038 combine with new space. We add it back later only if
3039 we don't actually get contiguous space.
3040 */
3041
3042 if (contiguous(av))
3043 size -= old_size;
3044
3045 /*
3046 Round to a multiple of page size.
3047 If MORECORE is not contiguous, this ensures that we only call it
3048 with whole-page arguments. And if MORECORE is contiguous and
3049 this is not first time through, this preserves page-alignment of
3050 previous calls. Otherwise, we correct to page-align below.
3051 */
3052
3053 size = (size + pagemask) & ~pagemask;
3054
3055 /*
3056 Don't try to call MORECORE if argument is so big as to appear
3057 negative. Note that since mmap takes size_t arg, it may succeed
3058 below even if we cannot call MORECORE.
3059 */
3060
3061 if (size > 0)
3062 brk = (char*)(MORECORE(size));
3063
3064 if (brk != (char*)(MORECORE_FAILURE)) {
3065 /* Call the `morecore' hook if necessary. */
3066 if (__after_morecore_hook)
3067 (*__after_morecore_hook) ();
3068 } else {
3069 /*
3070 If have mmap, try using it as a backup when MORECORE fails or
3071 cannot be used. This is worth doing on systems that have "holes" in
3072 address space, so sbrk cannot extend to give contiguous space, but
3073 space is available elsewhere. Note that we ignore mmap max count
3074 and threshold limits, since the space will not be used as a
3075 segregated mmap region.
3076 */
3077
3078 #if HAVE_MMAP
3079 /* Cannot merge with old top, so add its size back in */
3080 if (contiguous(av))
3081 size = (size + old_size + pagemask) & ~pagemask;
3082
3083 /* If we are relying on mmap as backup, then use larger units */
3084 if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
3085 size = MMAP_AS_MORECORE_SIZE;
3086
3087 /* Don't try if size wraps around 0 */
3088 if ((unsigned long)(size) > (unsigned long)(nb)) {
3089
3090 char *mbrk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
3091
3092 if (mbrk != MAP_FAILED) {
3093
3094 /* We do not need, and cannot use, another sbrk call to find end */
3095 brk = mbrk;
3096 snd_brk = brk + size;
3097
3098 /*
3099 Record that we no longer have a contiguous sbrk region.
3100 After the first time mmap is used as backup, we do not
3101 ever rely on contiguous space since this could incorrectly
3102 bridge regions.
3103 */
3104 set_noncontiguous(av);
3105 }
3106 }
3107 #endif
3108 }
3109
3110 if (brk != (char*)(MORECORE_FAILURE)) {
3111 if (mp_.sbrk_base == 0)
3112 mp_.sbrk_base = brk;
3113 av->system_mem += size;
3114
3115 /*
3116 If MORECORE extends previous space, we can likewise extend top size.
3117 */
3118
3119 if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE))
3120 set_head(old_top, (size + old_size) | PREV_INUSE);
3121
3122 else if (contiguous(av) && old_size && brk < old_end) {
3123 /* Oops! Someone else killed our space.. Can't touch anything. */
3124 assert(0);
3125 }
3126
3127 /*
3128 Otherwise, make adjustments:
3129
3130 * If the first time through or noncontiguous, we need to call sbrk
3131 just to find out where the end of memory lies.
3132
3133 * We need to ensure that all returned chunks from malloc will meet
3134 MALLOC_ALIGNMENT
3135
3136 * If there was an intervening foreign sbrk, we need to adjust sbrk
3137 request size to account for fact that we will not be able to
3138 combine new space with existing space in old_top.
3139
3140 * Almost all systems internally allocate whole pages at a time, in
3141 which case we might as well use the whole last page of request.
3142 So we allocate enough more memory to hit a page boundary now,
3143 which in turn causes future contiguous calls to page-align.
3144 */
3145
3146 else {
3147 front_misalign = 0;
3148 end_misalign = 0;
3149 correction = 0;
3150 aligned_brk = brk;
3151
3152 /* handle contiguous cases */
3153 if (contiguous(av)) {
3154
3155 /* Count foreign sbrk as system_mem. */
3156 if (old_size)
3157 av->system_mem += brk - old_end;
3158
3159 /* Guarantee alignment of first new chunk made from this space */
3160
3161 front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3162 if (front_misalign > 0) {
3163
3164 /*
3165 Skip over some bytes to arrive at an aligned position.
3166 We don't need to specially mark these wasted front bytes.
3167 They will never be accessed anyway because
3168 prev_inuse of av->top (and any chunk created from its start)
3169 is always true after initialization.
3170 */
3171
3172 correction = MALLOC_ALIGNMENT - front_misalign;
3173 aligned_brk += correction;
3174 }
3175
3176 /*
3177 If this isn't adjacent to existing space, then we will not
3178 be able to merge with old_top space, so must add to 2nd request.
3179 */
3180
3181 correction += old_size;
3182
3183 /* Extend the end address to hit a page boundary */
3184 end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3185 correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3186
3187 assert(correction >= 0);
3188 snd_brk = (char*)(MORECORE(correction));
3189
3190 /*
3191 If can't allocate correction, try to at least find out current
3192 brk. It might be enough to proceed without failing.
3193
3194 Note that if second sbrk did NOT fail, we assume that space
3195 is contiguous with first sbrk. This is a safe assumption unless
3196 program is multithreaded but doesn't use locks and a foreign sbrk
3197 occurred between our first and second calls.
3198 */
3199
3200 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3201 correction = 0;
3202 snd_brk = (char*)(MORECORE(0));
3203 } else
3204 /* Call the `morecore' hook if necessary. */
3205 if (__after_morecore_hook)
3206 (*__after_morecore_hook) ();
3207 }
3208
3209 /* handle non-contiguous cases */
3210 else {
3211 /* MORECORE/mmap must correctly align */
3212 assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3213
3214 /* Find out current end of memory */
3215 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3216 snd_brk = (char*)(MORECORE(0));
3217 }
3218 }
3219
3220 /* Adjust top based on results of second sbrk */
3221 if (snd_brk != (char*)(MORECORE_FAILURE)) {
3222 av->top = (mchunkptr)aligned_brk;
3223 set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3224 av->system_mem += correction;
3225
3226 /*
3227 If not the first time through, we either have a
3228 gap due to foreign sbrk or a non-contiguous region. Insert a
3229 double fencepost at old_top to prevent consolidation with space
3230 we don't own. These fenceposts are artificial chunks that are
3231 marked as inuse and are in any case too small to use. We need
3232 two to make sizes and alignments work out.
3233 */
3234
3235 if (old_size != 0) {
3236 /*
3237 Shrink old_top to insert fenceposts, keeping size a
3238 multiple of MALLOC_ALIGNMENT. We know there is at least
3239 enough space in old_top to do this.
3240 */
3241 old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3242 set_head(old_top, old_size | PREV_INUSE);
3243
3244 /*
3245 Note that the following assignments completely overwrite
3246 old_top when old_size was previously MINSIZE. This is
3247 intentional. We need the fencepost, even if old_top otherwise gets
3248 lost.
3249 */
3250 chunk_at_offset(old_top, old_size )->size =
3251 (2*SIZE_SZ)|PREV_INUSE;
3252
3253 chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
3254 (2*SIZE_SZ)|PREV_INUSE;
3255
3256 /* If possible, release the rest. */
3257 if (old_size >= MINSIZE) {
3258 _int_free(av, chunk2mem(old_top));
3259 }
3260
3261 }
3262 }
3263 }
3264
3265 /* Update statistics */
3266 #ifdef NO_THREADS
3267 sum = av->system_mem + mp_.mmapped_mem;
3268 if (sum > (unsigned long)(mp_.max_total_mem))
3269 mp_.max_total_mem = sum;
3270 #endif
3271
3272 }
3273
3274 } /* if (av != &main_arena) */
3275
3276 if ((unsigned long)av->system_mem > (unsigned long)(av->max_system_mem))
3277 av->max_system_mem = av->system_mem;
3278 check_malloc_state(av);
3279
3280 /* finally, do the allocation */
3281 p = av->top;
3282 size = chunksize(p);
3283
3284 /* check that one of the above allocation paths succeeded */
3285 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3286 remainder_size = size - nb;
3287 remainder = chunk_at_offset(p, nb);
3288 av->top = remainder;
3289 set_head(p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0));
3290 set_head(remainder, remainder_size | PREV_INUSE);
3291 check_malloced_chunk(av, p, nb);
3292 return chunk2mem(p);
3293 }
3294
3295 /* catch all failure paths */
3296 MALLOC_FAILURE_ACTION;
3297 return 0;
3298 }
3299
3300
3301 /*
3302 sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
3303 to the system (via negative arguments to sbrk) if there is unused
3304 memory at the `high' end of the malloc pool. It is called
3305 automatically by free() when top space exceeds the trim
3306 threshold. It is also called by the public malloc_trim routine. It
3307 returns 1 if it actually released any memory, else 0.
3308 */
3309
3310 #if __STD_C
3311 static int sYSTRIm(size_t pad, mstate av)
3312 #else
3313 static int sYSTRIm(pad, av) size_t pad; mstate av;
3314 #endif
3315 {
3316 long top_size; /* Amount of top-most memory */
3317 long extra; /* Amount to release */
3318 long released; /* Amount actually released */
3319 char* current_brk; /* address returned by pre-check sbrk call */
3320 char* new_brk; /* address returned by post-check sbrk call */
3321 size_t pagesz;
3322
3323 pagesz = mp_.pagesize;
3324 top_size = chunksize(av->top);
3325
3326 /* Release in pagesize units, keeping at least one page */
3327 extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3328
3329 if (extra > 0) {
3330
3331 /*
3332 Only proceed if end of memory is where we last set it.
3333 This avoids problems if there were foreign sbrk calls.
3334 */
3335 current_brk = (char*)(MORECORE(0));
3336 if (current_brk == (char*)(av->top) + top_size) {
3337
3338 /*
3339 Attempt to release memory. We ignore MORECORE return value,
3340 and instead call again to find out where new end of memory is.
3341 This avoids problems if first call releases less than we asked,
3342 of if failure somehow altered brk value. (We could still
3343 encounter problems if it altered brk in some very bad way,
3344 but the only thing we can do is adjust anyway, which will cause
3345 some downstream failure.)
3346 */
3347
3348 MORECORE(-extra);
3349 /* Call the `morecore' hook if necessary. */
3350 if (__after_morecore_hook)
3351 (*__after_morecore_hook) ();
3352 new_brk = (char*)(MORECORE(0));
3353
3354 if (new_brk != (char*)MORECORE_FAILURE) {
3355 released = (long)(current_brk - new_brk);
3356
3357 if (released != 0) {
3358 /* Success. Adjust top. */
3359 av->system_mem -= released;
3360 set_head(av->top, (top_size - released) | PREV_INUSE);
3361 check_malloc_state(av);
3362 return 1;
3363 }
3364 }
3365 }
3366 }
3367 return 0;
3368 }
3369
3370 #ifdef HAVE_MMAP
3371
3372 static void
3373 internal_function
3374 #if __STD_C
3375 munmap_chunk(mchunkptr p)
3376 #else
3377 munmap_chunk(p) mchunkptr p;
3378 #endif
3379 {
3380 INTERNAL_SIZE_T size = chunksize(p);
3381
3382 assert (chunk_is_mmapped(p));
3383 #if 0
3384 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3385 assert((mp_.n_mmaps > 0));
3386 #endif
3387
3388 uintptr_t block = (uintptr_t) p - p->prev_size;
3389 size_t total_size = p->prev_size + size;
3390 /* Unfortunately we have to do the compilers job by hand here. Normally
3391 we would test BLOCK and TOTAL-SIZE separately for compliance with the
3392 page size. But gcc does not recognize the optimization possibility
3393 (in the moment at least) so we combine the two values into one before
3394 the bit test. */
3395 if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
3396 {
3397 malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
3398 chunk2mem (p));
3399 return;
3400 }
3401
3402 mp_.n_mmaps--;
3403 mp_.mmapped_mem -= total_size;
3404
3405 int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
3406
3407 /* munmap returns non-zero on failure */
3408 assert(ret == 0);
3409 }
3410
3411 #if HAVE_MREMAP
3412
3413 static mchunkptr
3414 internal_function
3415 #if __STD_C
3416 mremap_chunk(mchunkptr p, size_t new_size)
3417 #else
3418 mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
3419 #endif
3420 {
3421 size_t page_mask = mp_.pagesize - 1;
3422 INTERNAL_SIZE_T offset = p->prev_size;
3423 INTERNAL_SIZE_T size = chunksize(p);
3424 char *cp;
3425
3426 assert (chunk_is_mmapped(p));
3427 #if 0
3428 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3429 assert((mp_.n_mmaps > 0));
3430 #endif
3431 assert(((size + offset) & (mp_.pagesize-1)) == 0);
3432
3433 /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
3434 new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
3435
3436 cp = (char *)mremap((char *)p - offset, size + offset, new_size,
3437 MREMAP_MAYMOVE);
3438
3439 if (cp == MAP_FAILED) return 0;
3440
3441 p = (mchunkptr)(cp + offset);
3442
3443 assert(aligned_OK(chunk2mem(p)));
3444
3445 assert((p->prev_size == offset));
3446 set_head(p, (new_size - offset)|IS_MMAPPED);
3447
3448 mp_.mmapped_mem -= size + offset;
3449 mp_.mmapped_mem += new_size;
3450 if ((unsigned long)mp_.mmapped_mem > (unsigned long)mp_.max_mmapped_mem)
3451 mp_.max_mmapped_mem = mp_.mmapped_mem;
3452 #ifdef NO_THREADS
3453 if ((unsigned long)(mp_.mmapped_mem + arena_mem + main_arena.system_mem) >
3454 mp_.max_total_mem)
3455 mp_.max_total_mem = mp_.mmapped_mem + arena_mem + main_arena.system_mem;
3456 #endif
3457 return p;
3458 }
3459
3460 #endif /* HAVE_MREMAP */
3461
3462 #endif /* HAVE_MMAP */
3463
3464 /*------------------------ Public wrappers. --------------------------------*/
3465
3466 Void_t*
3467 public_mALLOc(size_t bytes)
3468 {
3469 mstate ar_ptr;
3470 Void_t *victim;
3471
3472 __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t) = __malloc_hook;
3473 if (hook != NULL)
3474 return (*hook)(bytes, RETURN_ADDRESS (0));
3475
3476 arena_get(ar_ptr, bytes);
3477 if(!ar_ptr)
3478 return 0;
3479 victim = _int_malloc(ar_ptr, bytes);
3480 if(!victim) {
3481 /* Maybe the failure is due to running out of mmapped areas. */
3482 if(ar_ptr != &main_arena) {
3483 (void)mutex_unlock(&ar_ptr->mutex);
3484 (void)mutex_lock(&main_arena.mutex);
3485 victim = _int_malloc(&main_arena, bytes);
3486 (void)mutex_unlock(&main_arena.mutex);
3487 } else {
3488 #if USE_ARENAS
3489 /* ... or sbrk() has failed and there is still a chance to mmap() */
3490 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3491 (void)mutex_unlock(&main_arena.mutex);
3492 if(ar_ptr) {
3493 victim = _int_malloc(ar_ptr, bytes);
3494 (void)mutex_unlock(&ar_ptr->mutex);
3495 }
3496 #endif
3497 }
3498 } else
3499 (void)mutex_unlock(&ar_ptr->mutex);
3500 assert(!victim || chunk_is_mmapped(mem2chunk(victim)) ||
3501 ar_ptr == arena_for_chunk(mem2chunk(victim)));
3502 return victim;
3503 }
3504 #ifdef libc_hidden_def
3505 libc_hidden_def(public_mALLOc)
3506 #endif
3507
3508 void
3509 public_fREe(Void_t* mem)
3510 {
3511 mstate ar_ptr;
3512 mchunkptr p; /* chunk corresponding to mem */
3513
3514 void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t) = __free_hook;
3515 if (hook != NULL) {
3516 (*hook)(mem, RETURN_ADDRESS (0));
3517 return;
3518 }
3519
3520 if (mem == 0) /* free(0) has no effect */
3521 return;
3522
3523 p = mem2chunk(mem);
3524
3525 #if HAVE_MMAP
3526 if (chunk_is_mmapped(p)) /* release mmapped memory. */
3527 {
3528 /* see if the dynamic brk/mmap threshold needs adjusting */
3529 if (!mp_.no_dyn_threshold
3530 && p->size > mp_.mmap_threshold
3531 && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
3532 {
3533 mp_.mmap_threshold = chunksize (p);
3534 mp_.trim_threshold = 2 * mp_.mmap_threshold;
3535 }
3536 munmap_chunk(p);
3537 return;
3538 }
3539 #endif
3540
3541 ar_ptr = arena_for_chunk(p);
3542 #if THREAD_STATS
3543 if(!mutex_trylock(&ar_ptr->mutex))
3544 ++(ar_ptr->stat_lock_direct);
3545 else {
3546 (void)mutex_lock(&ar_ptr->mutex);
3547 ++(ar_ptr->stat_lock_wait);
3548 }
3549 #else
3550 (void)mutex_lock(&ar_ptr->mutex);
3551 #endif
3552 _int_free(ar_ptr, mem);
3553 (void)mutex_unlock(&ar_ptr->mutex);
3554 }
3555 #ifdef libc_hidden_def
3556 libc_hidden_def (public_fREe)
3557 #endif
3558
3559 Void_t*
3560 public_rEALLOc(Void_t* oldmem, size_t bytes)
3561 {
3562 mstate ar_ptr;
3563 INTERNAL_SIZE_T nb; /* padded request size */
3564
3565 mchunkptr oldp; /* chunk corresponding to oldmem */
3566 INTERNAL_SIZE_T oldsize; /* its size */
3567
3568 Void_t* newp; /* chunk to return */
3569
3570 __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) =
3571 __realloc_hook;
3572 if (hook != NULL)
3573 return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
3574
3575 #if REALLOC_ZERO_BYTES_FREES
3576 if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; }
3577 #endif
3578
3579 /* realloc of null is supposed to be same as malloc */
3580 if (oldmem == 0) return public_mALLOc(bytes);
3581
3582 oldp = mem2chunk(oldmem);
3583 oldsize = chunksize(oldp);
3584
3585 /* Little security check which won't hurt performance: the
3586 allocator never wrapps around at the end of the address space.
3587 Therefore we can exclude some size values which might appear
3588 here by accident or by "design" from some intruder. */
3589 if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
3590 || __builtin_expect (misaligned_chunk (oldp), 0))
3591 {
3592 malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
3593 return NULL;
3594 }
3595
3596 checked_request2size(bytes, nb);
3597
3598 #if HAVE_MMAP
3599 if (chunk_is_mmapped(oldp))
3600 {
3601 Void_t* newmem;
3602
3603 #if HAVE_MREMAP
3604 newp = mremap_chunk(oldp, nb);
3605 if(newp) return chunk2mem(newp);
3606 #endif
3607 /* Note the extra SIZE_SZ overhead. */
3608 if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
3609 /* Must alloc, copy, free. */
3610 newmem = public_mALLOc(bytes);
3611 if (newmem == 0) return 0; /* propagate failure */
3612 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
3613 munmap_chunk(oldp);
3614 return newmem;
3615 }
3616 #endif
3617
3618 ar_ptr = arena_for_chunk(oldp);
3619 #if THREAD_STATS
3620 if(!mutex_trylock(&ar_ptr->mutex))
3621 ++(ar_ptr->stat_lock_direct);
3622 else {
3623 (void)mutex_lock(&ar_ptr->mutex);
3624 ++(ar_ptr->stat_lock_wait);
3625 }
3626 #else
3627 (void)mutex_lock(&ar_ptr->mutex);
3628 #endif
3629
3630 #ifndef NO_THREADS
3631 /* As in malloc(), remember this arena for the next allocation. */
3632 tsd_setspecific(arena_key, (Void_t *)ar_ptr);
3633 #endif
3634
3635 newp = _int_realloc(ar_ptr, oldmem, bytes);
3636
3637 (void)mutex_unlock(&ar_ptr->mutex);
3638 assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
3639 ar_ptr == arena_for_chunk(mem2chunk(newp)));
3640
3641 if (newp == NULL)
3642 {
3643 /* Try harder to allocate memory in other arenas. */
3644 newp = public_mALLOc(bytes);
3645 if (newp != NULL)
3646 {
3647 MALLOC_COPY (newp, oldmem, oldsize - 2 * SIZE_SZ);
3648 #if THREAD_STATS
3649 if(!mutex_trylock(&ar_ptr->mutex))
3650 ++(ar_ptr->stat_lock_direct);
3651 else {
3652 (void)mutex_lock(&ar_ptr->mutex);
3653 ++(ar_ptr->stat_lock_wait);
3654 }
3655 #else
3656 (void)mutex_lock(&ar_ptr->mutex);
3657 #endif
3658 _int_free(ar_ptr, oldmem);
3659 (void)mutex_unlock(&ar_ptr->mutex);
3660 }
3661 }
3662
3663 return newp;
3664 }
3665 #ifdef libc_hidden_def
3666 libc_hidden_def (public_rEALLOc)
3667 #endif
3668
3669 Void_t*
3670 public_mEMALIGn(size_t alignment, size_t bytes)
3671 {
3672 mstate ar_ptr;
3673 Void_t *p;
3674
3675 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3676 __const __malloc_ptr_t)) =
3677 __memalign_hook;
3678 if (hook != NULL)
3679 return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
3680
3681 /* If need less alignment than we give anyway, just relay to malloc */
3682 if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes);
3683
3684 /* Otherwise, ensure that it is at least a minimum chunk size */
3685 if (alignment < MINSIZE) alignment = MINSIZE;
3686
3687 arena_get(ar_ptr, bytes + alignment + MINSIZE);
3688 if(!ar_ptr)
3689 return 0;
3690 p = _int_memalign(ar_ptr, alignment, bytes);
3691 (void)mutex_unlock(&ar_ptr->mutex);
3692 if(!p) {
3693 /* Maybe the failure is due to running out of mmapped areas. */
3694 if(ar_ptr != &main_arena) {
3695 (void)mutex_lock(&main_arena.mutex);
3696 p = _int_memalign(&main_arena, alignment, bytes);
3697 (void)mutex_unlock(&main_arena.mutex);
3698 } else {
3699 #if USE_ARENAS
3700 /* ... or sbrk() has failed and there is still a chance to mmap() */
3701 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3702 if(ar_ptr) {
3703 p = _int_memalign(ar_ptr, alignment, bytes);
3704 (void)mutex_unlock(&ar_ptr->mutex);
3705 }
3706 #endif
3707 }
3708 }
3709 assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3710 ar_ptr == arena_for_chunk(mem2chunk(p)));
3711 return p;
3712 }
3713 #ifdef libc_hidden_def
3714 libc_hidden_def (public_mEMALIGn)
3715 #endif
3716
3717 Void_t*
3718 public_vALLOc(size_t bytes)
3719 {
3720 mstate ar_ptr;
3721 Void_t *p;
3722
3723 if(__malloc_initialized < 0)
3724 ptmalloc_init ();
3725
3726 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3727 __const __malloc_ptr_t)) =
3728 __memalign_hook;
3729 if (hook != NULL)
3730 return (*hook)(mp_.pagesize, bytes, RETURN_ADDRESS (0));
3731
3732 arena_get(ar_ptr, bytes + mp_.pagesize + MINSIZE);
3733 if(!ar_ptr)
3734 return 0;
3735 p = _int_valloc(ar_ptr, bytes);
3736 (void)mutex_unlock(&ar_ptr->mutex);
3737 return p;
3738 }
3739
3740 Void_t*
3741 public_pVALLOc(size_t bytes)
3742 {
3743 mstate ar_ptr;
3744 Void_t *p;
3745
3746 if(__malloc_initialized < 0)
3747 ptmalloc_init ();
3748
3749 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3750 __const __malloc_ptr_t)) =
3751 __memalign_hook;
3752 if (hook != NULL)
3753 return (*hook)(mp_.pagesize,
3754 (bytes + mp_.pagesize - 1) & ~(mp_.pagesize - 1),
3755 RETURN_ADDRESS (0));
3756
3757 arena_get(ar_ptr, bytes + 2*mp_.pagesize + MINSIZE);
3758 p = _int_pvalloc(ar_ptr, bytes);
3759 (void)mutex_unlock(&ar_ptr->mutex);
3760 return p;
3761 }
3762
3763 Void_t*
3764 public_cALLOc(size_t n, size_t elem_size)
3765 {
3766 mstate av;
3767 mchunkptr oldtop, p;
3768 INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
3769 Void_t* mem;
3770 unsigned long clearsize;
3771 unsigned long nclears;
3772 INTERNAL_SIZE_T* d;
3773 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, __const __malloc_ptr_t)) =
3774 __malloc_hook;
3775
3776 /* size_t is unsigned so the behavior on overflow is defined. */
3777 bytes = n * elem_size;
3778 #define HALF_INTERNAL_SIZE_T \
3779 (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2))
3780 if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) {
3781 if (elem_size != 0 && bytes / elem_size != n) {
3782 MALLOC_FAILURE_ACTION;
3783 return 0;
3784 }
3785 }
3786
3787 if (hook != NULL) {
3788 sz = bytes;
3789 mem = (*hook)(sz, RETURN_ADDRESS (0));
3790 if(mem == 0)
3791 return 0;
3792 #ifdef HAVE_MEMCPY
3793 return memset(mem, 0, sz);
3794 #else
3795 while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
3796 return mem;
3797 #endif
3798 }
3799
3800 sz = bytes;
3801
3802 arena_get(av, sz);
3803 if(!av)
3804 return 0;
3805
3806 /* Check if we hand out the top chunk, in which case there may be no
3807 need to clear. */
3808 #if MORECORE_CLEARS
3809 oldtop = top(av);
3810 oldtopsize = chunksize(top(av));
3811 #if MORECORE_CLEARS < 2
3812 /* Only newly allocated memory is guaranteed to be cleared. */
3813 if (av == &main_arena &&
3814 oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
3815 oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
3816 #endif
3817 #endif
3818 mem = _int_malloc(av, sz);
3819
3820 /* Only clearing follows, so we can unlock early. */
3821 (void)mutex_unlock(&av->mutex);
3822
3823 assert(!mem || chunk_is_mmapped(mem2chunk(mem)) ||
3824 av == arena_for_chunk(mem2chunk(mem)));
3825
3826 if (mem == 0) {
3827 /* Maybe the failure is due to running out of mmapped areas. */
3828 if(av != &main_arena) {
3829 (void)mutex_lock(&main_arena.mutex);
3830 mem = _int_malloc(&main_arena, sz);
3831 (void)mutex_unlock(&main_arena.mutex);
3832 } else {
3833 #if USE_ARENAS
3834 /* ... or sbrk() has failed and there is still a chance to mmap() */
3835 (void)mutex_lock(&main_arena.mutex);
3836 av = arena_get2(av->next ? av : 0, sz);
3837 (void)mutex_unlock(&main_arena.mutex);
3838 if(av) {
3839 mem = _int_malloc(av, sz);
3840 (void)mutex_unlock(&av->mutex);
3841 }
3842 #endif
3843 }
3844 if (mem == 0) return 0;
3845 }
3846 p = mem2chunk(mem);
3847
3848 /* Two optional cases in which clearing not necessary */
3849 #if HAVE_MMAP
3850 if (chunk_is_mmapped (p))
3851 {
3852 if (__builtin_expect (perturb_byte, 0))
3853 MALLOC_ZERO (mem, sz);
3854 return mem;
3855 }
3856 #endif
3857
3858 csz = chunksize(p);
3859
3860 #if MORECORE_CLEARS
3861 if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) {
3862 /* clear only the bytes from non-freshly-sbrked memory */
3863 csz = oldtopsize;
3864 }
3865 #endif
3866
3867 /* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that
3868 contents have an odd number of INTERNAL_SIZE_T-sized words;
3869 minimally 3. */
3870 d = (INTERNAL_SIZE_T*)mem;
3871 clearsize = csz - SIZE_SZ;
3872 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
3873 assert(nclears >= 3);
3874
3875 if (nclears > 9)
3876 MALLOC_ZERO(d, clearsize);
3877
3878 else {
3879 *(d+0) = 0;
3880 *(d+1) = 0;
3881 *(d+2) = 0;
3882 if (nclears > 4) {
3883 *(d+3) = 0;
3884 *(d+4) = 0;
3885 if (nclears > 6) {
3886 *(d+5) = 0;
3887 *(d+6) = 0;
3888 if (nclears > 8) {
3889 *(d+7) = 0;
3890 *(d+8) = 0;
3891 }
3892 }
3893 }
3894 }
3895
3896 return mem;
3897 }
3898
3899 #ifndef _LIBC
3900
3901 Void_t**
3902 public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
3903 {
3904 mstate ar_ptr;
3905 Void_t** m;
3906
3907 arena_get(ar_ptr, n*elem_size);
3908 if(!ar_ptr)
3909 return 0;
3910
3911 m = _int_icalloc(ar_ptr, n, elem_size, chunks);
3912 (void)mutex_unlock(&ar_ptr->mutex);
3913 return m;
3914 }
3915
3916 Void_t**
3917 public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
3918 {
3919 mstate ar_ptr;
3920 Void_t** m;
3921
3922 arena_get(ar_ptr, 0);
3923 if(!ar_ptr)
3924 return 0;
3925
3926 m = _int_icomalloc(ar_ptr, n, sizes, chunks);
3927 (void)mutex_unlock(&ar_ptr->mutex);
3928 return m;
3929 }
3930
3931 void
3932 public_cFREe(Void_t* m)
3933 {
3934 public_fREe(m);
3935 }
3936
3937 #endif /* _LIBC */
3938
3939 int
3940 public_mTRIm(size_t s)
3941 {
3942 int result;
3943
3944 if(__malloc_initialized < 0)
3945 ptmalloc_init ();
3946 (void)mutex_lock(&main_arena.mutex);
3947 result = mTRIm(s);
3948 (void)mutex_unlock(&main_arena.mutex);
3949 return result;
3950 }
3951
3952 size_t
3953 public_mUSABLe(Void_t* m)
3954 {
3955 size_t result;
3956
3957 result = mUSABLe(m);
3958 return result;
3959 }
3960
3961 void
3962 public_mSTATs()
3963 {
3964 mSTATs();
3965 }
3966
3967 struct mallinfo public_mALLINFo()
3968 {
3969 struct mallinfo m;
3970
3971 if(__malloc_initialized < 0)
3972 ptmalloc_init ();
3973 (void)mutex_lock(&main_arena.mutex);
3974 m = mALLINFo(&main_arena);
3975 (void)mutex_unlock(&main_arena.mutex);
3976 return m;
3977 }
3978
3979 int
3980 public_mALLOPt(int p, int v)
3981 {
3982 int result;
3983 result = mALLOPt(p, v);
3984 return result;
3985 }
3986
3987 /*
3988 ------------------------------ malloc ------------------------------
3989 */
3990
3991 Void_t*
3992 _int_malloc(mstate av, size_t bytes)
3993 {
3994 INTERNAL_SIZE_T nb; /* normalized request size */
3995 unsigned int idx; /* associated bin index */
3996 mbinptr bin; /* associated bin */
3997 mfastbinptr* fb; /* associated fastbin */
3998
3999 mchunkptr victim; /* inspected/selected chunk */
4000 INTERNAL_SIZE_T size; /* its size */
4001 int victim_index; /* its bin index */
4002
4003 mchunkptr remainder; /* remainder from a split */
4004 unsigned long remainder_size; /* its size */
4005
4006 unsigned int block; /* bit map traverser */
4007 unsigned int bit; /* bit map traverser */
4008 unsigned int map; /* current word of binmap */
4009
4010 mchunkptr fwd; /* misc temp for linking */
4011 mchunkptr bck; /* misc temp for linking */
4012
4013 /*
4014 Convert request size to internal form by adding SIZE_SZ bytes
4015 overhead plus possibly more to obtain necessary alignment and/or
4016 to obtain a size of at least MINSIZE, the smallest allocatable
4017 size. Also, checked_request2size traps (returning 0) request sizes
4018 that are so large that they wrap around zero when padded and
4019 aligned.
4020 */
4021
4022 checked_request2size(bytes, nb);
4023
4024 /*
4025 If the size qualifies as a fastbin, first check corresponding bin.
4026 This code is safe to execute even if av is not yet initialized, so we
4027 can try it without checking, which saves some time on this fast path.
4028 */
4029
4030 if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
4031 long int idx = fastbin_index(nb);
4032 fb = &(av->fastbins[idx]);
4033 if ( (victim = *fb) != 0) {
4034 if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
4035 malloc_printerr (check_action, "malloc(): memory corruption (fast)",
4036 chunk2mem (victim));
4037 *fb = victim->fd;
4038 check_remalloced_chunk(av, victim, nb);
4039 void *p = chunk2mem(victim);
4040 if (__builtin_expect (perturb_byte, 0))
4041 alloc_perturb (p, bytes);
4042 return p;
4043 }
4044 }
4045
4046 /*
4047 If a small request, check regular bin. Since these "smallbins"
4048 hold one size each, no searching within bins is necessary.
4049 (For a large request, we need to wait until unsorted chunks are
4050 processed to find best fit. But for small ones, fits are exact
4051 anyway, so we can check now, which is faster.)
4052 */
4053
4054 if (in_smallbin_range(nb)) {
4055 idx = smallbin_index(nb);
4056 bin = bin_at(av,idx);
4057
4058 if ( (victim = last(bin)) != bin) {
4059 if (victim == 0) /* initialization check */
4060 malloc_consolidate(av);
4061 else {
4062 bck = victim->bk;
4063 set_inuse_bit_at_offset(victim, nb);
4064 bin->bk = bck;
4065 bck->fd = bin;
4066
4067 if (av != &main_arena)
4068 victim->size |= NON_MAIN_ARENA;
4069 check_malloced_chunk(av, victim, nb);
4070 void *p = chunk2mem(victim);
4071 if (__builtin_expect (perturb_byte, 0))
4072 alloc_perturb (p, bytes);
4073 return p;
4074 }
4075 }
4076 }
4077
4078 /*
4079 If this is a large request, consolidate fastbins before continuing.
4080 While it might look excessive to kill all fastbins before
4081 even seeing if there is space available, this avoids
4082 fragmentation problems normally associated with fastbins.
4083 Also, in practice, programs tend to have runs of either small or
4084 large requests, but less often mixtures, so consolidation is not
4085 invoked all that often in most programs. And the programs that
4086 it is called frequently in otherwise tend to fragment.
4087 */
4088
4089 else {
4090 idx = largebin_index(nb);
4091 if (have_fastchunks(av))
4092 malloc_consolidate(av);
4093 }
4094
4095 /*
4096 Process recently freed or remaindered chunks, taking one only if
4097 it is exact fit, or, if this a small request, the chunk is remainder from
4098 the most recent non-exact fit. Place other traversed chunks in
4099 bins. Note that this step is the only place in any routine where
4100 chunks are placed in bins.
4101
4102 The outer loop here is needed because we might not realize until
4103 near the end of malloc that we should have consolidated, so must
4104 do so and retry. This happens at most once, and only when we would
4105 otherwise need to expand memory to service a "small" request.
4106 */
4107
4108 for(;;) {
4109
4110 int iters = 0;
4111 while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
4112 bck = victim->bk;
4113 if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
4114 || __builtin_expect (victim->size > av->system_mem, 0))
4115 malloc_printerr (check_action, "malloc(): memory corruption",
4116 chunk2mem (victim));
4117 size = chunksize(victim);
4118
4119 /*
4120 If a small request, try to use last remainder if it is the
4121 only chunk in unsorted bin. This helps promote locality for
4122 runs of consecutive small requests. This is the only
4123 exception to best-fit, and applies only when there is
4124 no exact fit for a small chunk.
4125 */
4126
4127 if (in_smallbin_range(nb) &&
4128 bck == unsorted_chunks(av) &&
4129 victim == av->last_remainder &&
4130 (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4131
4132 /* split and reattach remainder */
4133 remainder_size = size - nb;
4134 remainder = chunk_at_offset(victim, nb);
4135 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
4136 av->last_remainder = remainder;
4137 remainder->bk = remainder->fd = unsorted_chunks(av);
4138
4139 set_head(victim, nb | PREV_INUSE |
4140 (av != &main_arena ? NON_MAIN_ARENA : 0));
4141 set_head(remainder, remainder_size | PREV_INUSE);
4142 set_foot(remainder, remainder_size);
4143
4144 check_malloced_chunk(av, victim, nb);
4145 void *p = chunk2mem(victim);
4146 if (__builtin_expect (perturb_byte, 0))
4147 alloc_perturb (p, bytes);
4148 return p;
4149 }
4150
4151 /* remove from unsorted list */
4152 unsorted_chunks(av)->bk = bck;
4153 bck->fd = unsorted_chunks(av);
4154
4155 /* Take now instead of binning if exact fit */
4156
4157 if (size == nb) {
4158 set_inuse_bit_at_offset(victim, size);
4159 if (av != &main_arena)
4160 victim->size |= NON_MAIN_ARENA;
4161 check_malloced_chunk(av, victim, nb);
4162 void *p = chunk2mem(victim);
4163 if (__builtin_expect (perturb_byte, 0))
4164 alloc_perturb (p, bytes);
4165 return p;
4166 }
4167
4168 /* place chunk in bin */
4169
4170 if (in_smallbin_range(size)) {
4171 victim_index = smallbin_index(size);
4172 bck = bin_at(av, victim_index);
4173 fwd = bck->fd;
4174 }
4175 else {
4176 victim_index = largebin_index(size);
4177 bck = bin_at(av, victim_index);
4178 fwd = bck->fd;
4179
4180 /* maintain large bins in sorted order */
4181 if (fwd != bck) {
4182 /* Or with inuse bit to speed comparisons */
4183 size |= PREV_INUSE;
4184 /* if smaller than smallest, bypass loop below */
4185 assert((bck->bk->size & NON_MAIN_ARENA) == 0);
4186 if ((unsigned long)(size) <= (unsigned long)(bck->bk->size)) {
4187 fwd = bck;
4188 bck = bck->bk;
4189 }
4190 else {
4191 assert((fwd->size & NON_MAIN_ARENA) == 0);
4192 while ((unsigned long)(size) < (unsigned long)(fwd->size)) {
4193 fwd = fwd->fd;
4194 assert((fwd->size & NON_MAIN_ARENA) == 0);
4195 }
4196 bck = fwd->bk;
4197 }
4198 }
4199 }
4200
4201 mark_bin(av, victim_index);
4202 victim->bk = bck;
4203 victim->fd = fwd;
4204 fwd->bk = victim;
4205 bck->fd = victim;
4206
4207 #define MAX_ITERS 10000
4208 if (++iters >= MAX_ITERS)
4209 break;
4210 }
4211
4212 /*
4213 If a large request, scan through the chunks of current bin in
4214 sorted order to find smallest that fits. This is the only step
4215 where an unbounded number of chunks might be scanned without doing
4216 anything useful with them. However the lists tend to be short.
4217 */
4218
4219 if (!in_smallbin_range(nb)) {
4220 bin = bin_at(av, idx);
4221
4222 /* skip scan if empty or largest chunk is too small */
4223 if ((victim = last(bin)) != bin &&
4224 (unsigned long)(first(bin)->size) >= (unsigned long)(nb)) {
4225
4226 while (((unsigned long)(size = chunksize(victim)) <
4227 (unsigned long)(nb)))
4228 victim = victim->bk;
4229
4230 remainder_size = size - nb;
4231 unlink(victim, bck, fwd);
4232
4233 /* Exhaust */
4234 if (remainder_size < MINSIZE) {
4235 set_inuse_bit_at_offset(victim, size);
4236 if (av != &main_arena)
4237 victim->size |= NON_MAIN_ARENA;
4238 }
4239 /* Split */
4240 else {
4241 remainder = chunk_at_offset(victim, nb);
4242 /* We cannot assume the unsorted list is empty and therefore
4243 have to perform a complete insert here. */
4244 bck = unsorted_chunks(av);
4245 fwd = bck->fd;
4246 remainder->bk = bck;
4247 remainder->fd = fwd;
4248 bck->fd = remainder;
4249 fwd->bk = remainder;
4250 set_head(victim, nb | PREV_INUSE |
4251 (av != &main_arena ? NON_MAIN_ARENA : 0));
4252 set_head(remainder, remainder_size | PREV_INUSE);
4253 set_foot(remainder, remainder_size);
4254 }
4255 check_malloced_chunk(av, victim, nb);
4256 void *p = chunk2mem(victim);
4257 if (__builtin_expect (perturb_byte, 0))
4258 alloc_perturb (p, bytes);
4259 return p;
4260 }
4261 }
4262
4263 /*
4264 Search for a chunk by scanning bins, starting with next largest
4265 bin. This search is strictly by best-fit; i.e., the smallest
4266 (with ties going to approximately the least recently used) chunk
4267 that fits is selected.
4268
4269 The bitmap avoids needing to check that most blocks are nonempty.
4270 The particular case of skipping all bins during warm-up phases
4271 when no chunks have been returned yet is faster than it might look.
4272 */
4273
4274 ++idx;
4275 bin = bin_at(av,idx);
4276 block = idx2block(idx);
4277 map = av->binmap[block];
4278 bit = idx2bit(idx);
4279
4280 for (;;) {
4281
4282 /* Skip rest of block if there are no more set bits in this block. */
4283 if (bit > map || bit == 0) {
4284 do {
4285 if (++block >= BINMAPSIZE) /* out of bins */
4286 goto use_top;
4287 } while ( (map = av->binmap[block]) == 0);
4288
4289 bin = bin_at(av, (block << BINMAPSHIFT));
4290 bit = 1;
4291 }
4292
4293 /* Advance to bin with set bit. There must be one. */
4294 while ((bit & map) == 0) {
4295 bin = next_bin(bin);
4296 bit <<= 1;
4297 assert(bit != 0);
4298 }
4299
4300 /* Inspect the bin. It is likely to be non-empty */
4301 victim = last(bin);
4302
4303 /* If a false alarm (empty bin), clear the bit. */
4304 if (victim == bin) {
4305 av->binmap[block] = map &= ~bit; /* Write through */
4306 bin = next_bin(bin);
4307 bit <<= 1;
4308 }
4309
4310 else {
4311 size = chunksize(victim);
4312
4313 /* We know the first chunk in this bin is big enough to use. */
4314 assert((unsigned long)(size) >= (unsigned long)(nb));
4315
4316 remainder_size = size - nb;
4317
4318 /* unlink */
4319 bck = victim->bk;
4320 bin->bk = bck;
4321 bck->fd = bin;
4322
4323 /* Exhaust */
4324 if (remainder_size < MINSIZE) {
4325 set_inuse_bit_at_offset(victim, size);
4326 if (av != &main_arena)
4327 victim->size |= NON_MAIN_ARENA;
4328 }
4329
4330 /* Split */
4331 else {
4332 remainder = chunk_at_offset(victim, nb);
4333
4334 /* We cannot assume the unsorted list is empty and therefore
4335 have to perform a complete insert here. */
4336 bck = unsorted_chunks(av);
4337 fwd = bck->fd;
4338 remainder->bk = bck;
4339 remainder->fd = fwd;
4340 bck->fd = remainder;
4341 fwd->bk = remainder;
4342
4343 /* advertise as last remainder */
4344 if (in_smallbin_range(nb))
4345 av->last_remainder = remainder;
4346
4347 set_head(victim, nb | PREV_INUSE |
4348 (av != &main_arena ? NON_MAIN_ARENA : 0));
4349 set_head(remainder, remainder_size | PREV_INUSE);
4350 set_foot(remainder, remainder_size);
4351 }
4352 check_malloced_chunk(av, victim, nb);
4353 void *p = chunk2mem(victim);
4354 if (__builtin_expect (perturb_byte, 0))
4355 alloc_perturb (p, bytes);
4356 return p;
4357 }
4358 }
4359
4360 use_top:
4361 /*
4362 If large enough, split off the chunk bordering the end of memory
4363 (held in av->top). Note that this is in accord with the best-fit
4364 search rule. In effect, av->top is treated as larger (and thus
4365 less well fitting) than any other available chunk since it can
4366 be extended to be as large as necessary (up to system
4367 limitations).
4368
4369 We require that av->top always exists (i.e., has size >=
4370 MINSIZE) after initialization, so if it would otherwise be
4371 exhuasted by current request, it is replenished. (The main
4372 reason for ensuring it exists is that we may need MINSIZE space
4373 to put in fenceposts in sysmalloc.)
4374 */
4375
4376 victim = av->top;
4377 size = chunksize(victim);
4378
4379 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
4380 remainder_size = size - nb;
4381 remainder = chunk_at_offset(victim, nb);
4382 av->top = remainder;
4383 set_head(victim, nb | PREV_INUSE |
4384 (av != &main_arena ? NON_MAIN_ARENA : 0));
4385 set_head(remainder, remainder_size | PREV_INUSE);
4386
4387 check_malloced_chunk(av, victim, nb);
4388 void *p = chunk2mem(victim);
4389 if (__builtin_expect (perturb_byte, 0))
4390 alloc_perturb (p, bytes);
4391 return p;
4392 }
4393
4394 /*
4395 If there is space available in fastbins, consolidate and retry,
4396 to possibly avoid expanding memory. This can occur only if nb is
4397 in smallbin range so we didn't consolidate upon entry.
4398 */
4399
4400 else if (have_fastchunks(av)) {
4401 assert(in_smallbin_range(nb));
4402 malloc_consolidate(av);
4403 idx = smallbin_index(nb); /* restore original bin index */
4404 }
4405
4406 /*
4407 Otherwise, relay to handle system-dependent cases
4408 */
4409 else {
4410 void *p = sYSMALLOc(nb, av);
4411 if (__builtin_expect (perturb_byte, 0))
4412 alloc_perturb (p, bytes);
4413 return p;
4414 }
4415 }
4416 }
4417
4418 /*
4419 ------------------------------ free ------------------------------
4420 */
4421
4422 void
4423 _int_free(mstate av, Void_t* mem)
4424 {
4425 mchunkptr p; /* chunk corresponding to mem */
4426 INTERNAL_SIZE_T size; /* its size */
4427 mfastbinptr* fb; /* associated fastbin */
4428 mchunkptr nextchunk; /* next contiguous chunk */
4429 INTERNAL_SIZE_T nextsize; /* its size */
4430 int nextinuse; /* true if nextchunk is used */
4431 INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
4432 mchunkptr bck; /* misc temp for linking */
4433 mchunkptr fwd; /* misc temp for linking */
4434
4435 const char *errstr = NULL;
4436
4437 p = mem2chunk(mem);
4438 size = chunksize(p);
4439
4440 /* Little security check which won't hurt performance: the
4441 allocator never wrapps around at the end of the address space.
4442 Therefore we can exclude some size values which might appear
4443 here by accident or by "design" from some intruder. */
4444 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
4445 || __builtin_expect (misaligned_chunk (p), 0))
4446 {
4447 errstr = "free(): invalid pointer";
4448 errout:
4449 malloc_printerr (check_action, errstr, mem);
4450 return;
4451 }
4452 /* We know that each chunk is at least MINSIZE bytes in size. */
4453 if (__builtin_expect (size < MINSIZE, 0))
4454 {
4455 errstr = "free(): invalid size";
4456 goto errout;
4457 }
4458
4459 check_inuse_chunk(av, p);
4460
4461 /*
4462 If eligible, place chunk on a fastbin so it can be found
4463 and used quickly in malloc.
4464 */
4465
4466 if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
4467
4468 #if TRIM_FASTBINS
4469 /*
4470 If TRIM_FASTBINS set, don't place chunks
4471 bordering top into fastbins
4472 */
4473 && (chunk_at_offset(p, size) != av->top)
4474 #endif
4475 ) {
4476
4477 if (__builtin_expect (chunk_at_offset (p, size)->size <= 2 * SIZE_SZ, 0)
4478 || __builtin_expect (chunksize (chunk_at_offset (p, size))
4479 >= av->system_mem, 0))
4480 {
4481 errstr = "free(): invalid next size (fast)";
4482 goto errout;
4483 }
4484
4485 set_fastchunks(av);
4486 fb = &(av->fastbins[fastbin_index(size)]);
4487 /* Another simple check: make sure the top of the bin is not the
4488 record we are going to add (i.e., double free). */
4489 if (__builtin_expect (*fb == p, 0))
4490 {
4491 errstr = "double free or corruption (fasttop)";
4492 goto errout;
4493 }
4494
4495 if (__builtin_expect (perturb_byte, 0))
4496 free_perturb (mem, size - SIZE_SZ);
4497
4498 p->fd = *fb;
4499 *fb = p;
4500 }
4501
4502 /*
4503 Consolidate other non-mmapped chunks as they arrive.
4504 */
4505
4506 else if (!chunk_is_mmapped(p)) {
4507 nextchunk = chunk_at_offset(p, size);
4508
4509 /* Lightweight tests: check whether the block is already the
4510 top block. */
4511 if (__builtin_expect (p == av->top, 0))
4512 {
4513 errstr = "double free or corruption (top)";
4514 goto errout;
4515 }
4516 /* Or whether the next chunk is beyond the boundaries of the arena. */
4517 if (__builtin_expect (contiguous (av)
4518 && (char *) nextchunk
4519 >= ((char *) av->top + chunksize(av->top)), 0))
4520 {
4521 errstr = "double free or corruption (out)";
4522 goto errout;
4523 }
4524 /* Or whether the block is actually not marked used. */
4525 if (__builtin_expect (!prev_inuse(nextchunk), 0))
4526 {
4527 errstr = "double free or corruption (!prev)";
4528 goto errout;
4529 }
4530
4531 nextsize = chunksize(nextchunk);
4532 if (__builtin_expect (nextchunk->size <= 2 * SIZE_SZ, 0)
4533 || __builtin_expect (nextsize >= av->system_mem, 0))
4534 {
4535 errstr = "free(): invalid next size (normal)";
4536 goto errout;
4537 }
4538
4539 if (__builtin_expect (perturb_byte, 0))
4540 free_perturb (mem, size - SIZE_SZ);
4541
4542 /* consolidate backward */
4543 if (!prev_inuse(p)) {
4544 prevsize = p->prev_size;
4545 size += prevsize;
4546 p = chunk_at_offset(p, -((long) prevsize));
4547 unlink(p, bck, fwd);
4548 }
4549
4550 if (nextchunk != av->top) {
4551 /* get and clear inuse bit */
4552 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4553
4554 /* consolidate forward */
4555 if (!nextinuse) {
4556 unlink(nextchunk, bck, fwd);
4557 size += nextsize;
4558 } else
4559 clear_inuse_bit_at_offset(nextchunk, 0);
4560
4561 /*
4562 Place the chunk in unsorted chunk list. Chunks are
4563 not placed into regular bins until after they have
4564 been given one chance to be used in malloc.
4565 */
4566
4567 bck = unsorted_chunks(av);
4568 fwd = bck->fd;
4569 p->bk = bck;
4570 p->fd = fwd;
4571 bck->fd = p;
4572 fwd->bk = p;
4573
4574 set_head(p, size | PREV_INUSE);
4575 set_foot(p, size);
4576
4577 check_free_chunk(av, p);
4578 }
4579
4580 /*
4581 If the chunk borders the current high end of memory,
4582 consolidate into top
4583 */
4584
4585 else {
4586 size += nextsize;
4587 set_head(p, size | PREV_INUSE);
4588 av->top = p;
4589 check_chunk(av, p);
4590 }
4591
4592 /*
4593 If freeing a large space, consolidate possibly-surrounding
4594 chunks. Then, if the total unused topmost memory exceeds trim
4595 threshold, ask malloc_trim to reduce top.
4596
4597 Unless max_fast is 0, we don't know if there are fastbins
4598 bordering top, so we cannot tell for sure whether threshold
4599 has been reached unless fastbins are consolidated. But we
4600 don't want to consolidate on each free. As a compromise,
4601 consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
4602 is reached.
4603 */
4604
4605 if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
4606 if (have_fastchunks(av))
4607 malloc_consolidate(av);
4608
4609 if (av == &main_arena) {
4610 #ifndef MORECORE_CANNOT_TRIM
4611 if ((unsigned long)(chunksize(av->top)) >=
4612 (unsigned long)(mp_.trim_threshold))
4613 sYSTRIm(mp_.top_pad, av);
4614 #endif
4615 } else {
4616 /* Always try heap_trim(), even if the top chunk is not
4617 large, because the corresponding heap might go away. */
4618 heap_info *heap = heap_for_ptr(top(av));
4619
4620 assert(heap->ar_ptr == av);
4621 heap_trim(heap, mp_.top_pad);
4622 }
4623 }
4624
4625 }
4626 /*
4627 If the chunk was allocated via mmap, release via munmap(). Note
4628 that if HAVE_MMAP is false but chunk_is_mmapped is true, then
4629 user must have overwritten memory. There's nothing we can do to
4630 catch this error unless MALLOC_DEBUG is set, in which case
4631 check_inuse_chunk (above) will have triggered error.
4632 */
4633
4634 else {
4635 #if HAVE_MMAP
4636 munmap_chunk (p);
4637 #endif
4638 }
4639 }
4640
4641 /*
4642 ------------------------- malloc_consolidate -------------------------
4643
4644 malloc_consolidate is a specialized version of free() that tears
4645 down chunks held in fastbins. Free itself cannot be used for this
4646 purpose since, among other things, it might place chunks back onto
4647 fastbins. So, instead, we need to use a minor variant of the same
4648 code.
4649
4650 Also, because this routine needs to be called the first time through
4651 malloc anyway, it turns out to be the perfect place to trigger
4652 initialization code.
4653 */
4654
4655 #if __STD_C
4656 static void malloc_consolidate(mstate av)
4657 #else
4658 static void malloc_consolidate(av) mstate av;
4659 #endif
4660 {
4661 mfastbinptr* fb; /* current fastbin being consolidated */
4662 mfastbinptr* maxfb; /* last fastbin (for loop control) */
4663 mchunkptr p; /* current chunk being consolidated */
4664 mchunkptr nextp; /* next chunk to consolidate */
4665 mchunkptr unsorted_bin; /* bin header */
4666 mchunkptr first_unsorted; /* chunk to link to */
4667
4668 /* These have same use as in free() */
4669 mchunkptr nextchunk;
4670 INTERNAL_SIZE_T size;
4671 INTERNAL_SIZE_T nextsize;
4672 INTERNAL_SIZE_T prevsize;
4673 int nextinuse;
4674 mchunkptr bck;
4675 mchunkptr fwd;
4676
4677 /*
4678 If max_fast is 0, we know that av hasn't
4679 yet been initialized, in which case do so below
4680 */
4681
4682 if (get_max_fast () != 0) {
4683 clear_fastchunks(av);
4684
4685 unsorted_bin = unsorted_chunks(av);
4686
4687 /*
4688 Remove each chunk from fast bin and consolidate it, placing it
4689 then in unsorted bin. Among other reasons for doing this,
4690 placing in unsorted bin avoids needing to calculate actual bins
4691 until malloc is sure that chunks aren't immediately going to be
4692 reused anyway.
4693 */
4694
4695 maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
4696 fb = &(av->fastbins[0]);
4697 do {
4698 if ( (p = *fb) != 0) {
4699 *fb = 0;
4700
4701 do {
4702 check_inuse_chunk(av, p);
4703 nextp = p->fd;
4704
4705 /* Slightly streamlined version of consolidation code in free() */
4706 size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
4707 nextchunk = chunk_at_offset(p, size);
4708 nextsize = chunksize(nextchunk);
4709
4710 if (!prev_inuse(p)) {
4711 prevsize = p->prev_size;
4712 size += prevsize;
4713 p = chunk_at_offset(p, -((long) prevsize));
4714 unlink(p, bck, fwd);
4715 }
4716
4717 if (nextchunk != av->top) {
4718 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4719
4720 if (!nextinuse) {
4721 size += nextsize;
4722 unlink(nextchunk, bck, fwd);
4723 } else
4724 clear_inuse_bit_at_offset(nextchunk, 0);
4725
4726 first_unsorted = unsorted_bin->fd;
4727 unsorted_bin->fd = p;
4728 first_unsorted->bk = p;
4729
4730 set_head(p, size | PREV_INUSE);
4731 p->bk = unsorted_bin;
4732 p->fd = first_unsorted;
4733 set_foot(p, size);
4734 }
4735
4736 else {
4737 size += nextsize;
4738 set_head(p, size | PREV_INUSE);
4739 av->top = p;
4740 }
4741
4742 } while ( (p = nextp) != 0);
4743
4744 }
4745 } while (fb++ != maxfb);
4746 }
4747 else {
4748 malloc_init_state(av);
4749 check_malloc_state(av);
4750 }
4751 }
4752
4753 /*
4754 ------------------------------ realloc ------------------------------
4755 */
4756
4757 Void_t*
4758 _int_realloc(mstate av, Void_t* oldmem, size_t bytes)
4759 {
4760 INTERNAL_SIZE_T nb; /* padded request size */
4761
4762 mchunkptr oldp; /* chunk corresponding to oldmem */
4763 INTERNAL_SIZE_T oldsize; /* its size */
4764
4765 mchunkptr newp; /* chunk to return */
4766 INTERNAL_SIZE_T newsize; /* its size */
4767 Void_t* newmem; /* corresponding user mem */
4768
4769 mchunkptr next; /* next contiguous chunk after oldp */
4770
4771 mchunkptr remainder; /* extra space at end of newp */
4772 unsigned long remainder_size; /* its size */
4773
4774 mchunkptr bck; /* misc temp for linking */
4775 mchunkptr fwd; /* misc temp for linking */
4776
4777 unsigned long copysize; /* bytes to copy */
4778 unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
4779 INTERNAL_SIZE_T* s; /* copy source */
4780 INTERNAL_SIZE_T* d; /* copy destination */
4781
4782 const char *errstr = NULL;
4783
4784
4785 checked_request2size(bytes, nb);
4786
4787 oldp = mem2chunk(oldmem);
4788 oldsize = chunksize(oldp);
4789
4790 /* Simple tests for old block integrity. */
4791 if (__builtin_expect (misaligned_chunk (oldp), 0))
4792 {
4793 errstr = "realloc(): invalid pointer";
4794 errout:
4795 malloc_printerr (check_action, errstr, oldmem);
4796 return NULL;
4797 }
4798 if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0)
4799 || __builtin_expect (oldsize >= av->system_mem, 0))
4800 {
4801 errstr = "realloc(): invalid old size";
4802 goto errout;
4803 }
4804
4805 check_inuse_chunk(av, oldp);
4806
4807 if (!chunk_is_mmapped(oldp)) {
4808
4809 next = chunk_at_offset(oldp, oldsize);
4810 INTERNAL_SIZE_T nextsize = chunksize(next);
4811 if (__builtin_expect (next->size <= 2 * SIZE_SZ, 0)
4812 || __builtin_expect (nextsize >= av->system_mem, 0))
4813 {
4814 errstr = "realloc(): invalid next size";
4815 goto errout;
4816 }
4817
4818 if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
4819 /* already big enough; split below */
4820 newp = oldp;
4821 newsize = oldsize;
4822 }
4823
4824 else {
4825 /* Try to expand forward into top */
4826 if (next == av->top &&
4827 (unsigned long)(newsize = oldsize + nextsize) >=
4828 (unsigned long)(nb + MINSIZE)) {
4829 set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4830 av->top = chunk_at_offset(oldp, nb);
4831 set_head(av->top, (newsize - nb) | PREV_INUSE);
4832 check_inuse_chunk(av, oldp);
4833 return chunk2mem(oldp);
4834 }
4835
4836 /* Try to expand forward into next chunk; split off remainder below */
4837 else if (next != av->top &&
4838 !inuse(next) &&
4839 (unsigned long)(newsize = oldsize + nextsize) >=
4840 (unsigned long)(nb)) {
4841 newp = oldp;
4842 unlink(next, bck, fwd);
4843 }
4844
4845 /* allocate, copy, free */
4846 else {
4847 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4848 if (newmem == 0)
4849 return 0; /* propagate failure */
4850
4851 newp = mem2chunk(newmem);
4852 newsize = chunksize(newp);
4853
4854 /*
4855 Avoid copy if newp is next chunk after oldp.
4856 */
4857 if (newp == next) {
4858 newsize += oldsize;
4859 newp = oldp;
4860 }
4861 else {
4862 /*
4863 Unroll copy of <= 36 bytes (72 if 8byte sizes)
4864 We know that contents have an odd number of
4865 INTERNAL_SIZE_T-sized words; minimally 3.
4866 */
4867
4868 copysize = oldsize - SIZE_SZ;
4869 s = (INTERNAL_SIZE_T*)(oldmem);
4870 d = (INTERNAL_SIZE_T*)(newmem);
4871 ncopies = copysize / sizeof(INTERNAL_SIZE_T);
4872 assert(ncopies >= 3);
4873
4874 if (ncopies > 9)
4875 MALLOC_COPY(d, s, copysize);
4876
4877 else {
4878 *(d+0) = *(s+0);
4879 *(d+1) = *(s+1);
4880 *(d+2) = *(s+2);
4881 if (ncopies > 4) {
4882 *(d+3) = *(s+3);
4883 *(d+4) = *(s+4);
4884 if (ncopies > 6) {
4885 *(d+5) = *(s+5);
4886 *(d+6) = *(s+6);
4887 if (ncopies > 8) {
4888 *(d+7) = *(s+7);
4889 *(d+8) = *(s+8);
4890 }
4891 }
4892 }
4893 }
4894
4895 _int_free(av, oldmem);
4896 check_inuse_chunk(av, newp);
4897 return chunk2mem(newp);
4898 }
4899 }
4900 }
4901
4902 /* If possible, free extra space in old or extended chunk */
4903
4904 assert((unsigned long)(newsize) >= (unsigned long)(nb));
4905
4906 remainder_size = newsize - nb;
4907
4908 if (remainder_size < MINSIZE) { /* not enough extra to split off */
4909 set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
4910 set_inuse_bit_at_offset(newp, newsize);
4911 }
4912 else { /* split remainder */
4913 remainder = chunk_at_offset(newp, nb);
4914 set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4915 set_head(remainder, remainder_size | PREV_INUSE |
4916 (av != &main_arena ? NON_MAIN_ARENA : 0));
4917 /* Mark remainder as inuse so free() won't complain */
4918 set_inuse_bit_at_offset(remainder, remainder_size);
4919 _int_free(av, chunk2mem(remainder));
4920 }
4921
4922 check_inuse_chunk(av, newp);
4923 return chunk2mem(newp);
4924 }
4925
4926 /*
4927 Handle mmap cases
4928 */
4929
4930 else {
4931 #if HAVE_MMAP
4932
4933 #if HAVE_MREMAP
4934 INTERNAL_SIZE_T offset = oldp->prev_size;
4935 size_t pagemask = mp_.pagesize - 1;
4936 char *cp;
4937 unsigned long sum;
4938
4939 /* Note the extra SIZE_SZ overhead */
4940 newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
4941
4942 /* don't need to remap if still within same page */
4943 if (oldsize == newsize - offset)
4944 return oldmem;
4945
4946 cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
4947
4948 if (cp != MAP_FAILED) {
4949
4950 newp = (mchunkptr)(cp + offset);
4951 set_head(newp, (newsize - offset)|IS_MMAPPED);
4952
4953 assert(aligned_OK(chunk2mem(newp)));
4954 assert((newp->prev_size == offset));
4955
4956 /* update statistics */
4957 sum = mp_.mmapped_mem += newsize - oldsize;
4958 if (sum > (unsigned long)(mp_.max_mmapped_mem))
4959 mp_.max_mmapped_mem = sum;
4960 #ifdef NO_THREADS
4961 sum += main_arena.system_mem;
4962 if (sum > (unsigned long)(mp_.max_total_mem))
4963 mp_.max_total_mem = sum;
4964 #endif
4965
4966 return chunk2mem(newp);
4967 }
4968 #endif
4969
4970 /* Note the extra SIZE_SZ overhead. */
4971 if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
4972 newmem = oldmem; /* do nothing */
4973 else {
4974 /* Must alloc, copy, free. */
4975 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4976 if (newmem != 0) {
4977 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
4978 _int_free(av, oldmem);
4979 }
4980 }
4981 return newmem;
4982
4983 #else
4984 /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
4985 check_malloc_state(av);
4986 MALLOC_FAILURE_ACTION;
4987 return 0;
4988 #endif
4989 }
4990 }
4991
4992 /*
4993 ------------------------------ memalign ------------------------------
4994 */
4995
4996 Void_t*
4997 _int_memalign(mstate av, size_t alignment, size_t bytes)
4998 {
4999 INTERNAL_SIZE_T nb; /* padded request size */
5000 char* m; /* memory returned by malloc call */
5001 mchunkptr p; /* corresponding chunk */
5002 char* brk; /* alignment point within p */
5003 mchunkptr newp; /* chunk to return */
5004 INTERNAL_SIZE_T newsize; /* its size */
5005 INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
5006 mchunkptr remainder; /* spare room at end to split off */
5007 unsigned long remainder_size; /* its size */
5008 INTERNAL_SIZE_T size;
5009
5010 /* If need less alignment than we give anyway, just relay to malloc */
5011
5012 if (alignment <= MALLOC_ALIGNMENT) return _int_malloc(av, bytes);
5013
5014 /* Otherwise, ensure that it is at least a minimum chunk size */
5015
5016 if (alignment < MINSIZE) alignment = MINSIZE;
5017
5018 /* Make sure alignment is power of 2 (in case MINSIZE is not). */
5019 if ((alignment & (alignment - 1)) != 0) {
5020 size_t a = MALLOC_ALIGNMENT * 2;
5021 while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
5022 alignment = a;
5023 }
5024
5025 checked_request2size(bytes, nb);
5026
5027 /*
5028 Strategy: find a spot within that chunk that meets the alignment
5029 request, and then possibly free the leading and trailing space.
5030 */
5031
5032
5033 /* Call malloc with worst case padding to hit alignment. */
5034
5035 m = (char*)(_int_malloc(av, nb + alignment + MINSIZE));
5036
5037 if (m == 0) return 0; /* propagate failure */
5038
5039 p = mem2chunk(m);
5040
5041 if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
5042
5043 /*
5044 Find an aligned spot inside chunk. Since we need to give back
5045 leading space in a chunk of at least MINSIZE, if the first
5046 calculation places us at a spot with less than MINSIZE leader,
5047 we can move to the next aligned spot -- we've allocated enough
5048 total room so that this is always possible.
5049 */
5050
5051 brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
5052 -((signed long) alignment));
5053 if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
5054 brk += alignment;
5055
5056 newp = (mchunkptr)brk;
5057 leadsize = brk - (char*)(p);
5058 newsize = chunksize(p) - leadsize;
5059
5060 /* For mmapped chunks, just adjust offset */
5061 if (chunk_is_mmapped(p)) {
5062 newp->prev_size = p->prev_size + leadsize;
5063 set_head(newp, newsize|IS_MMAPPED);
5064 return chunk2mem(newp);
5065 }
5066
5067 /* Otherwise, give back leader, use the rest */
5068 set_head(newp, newsize | PREV_INUSE |
5069 (av != &main_arena ? NON_MAIN_ARENA : 0));
5070 set_inuse_bit_at_offset(newp, newsize);
5071 set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5072 _int_free(av, chunk2mem(p));
5073 p = newp;
5074
5075 assert (newsize >= nb &&
5076 (((unsigned long)(chunk2mem(p))) % alignment) == 0);
5077 }
5078
5079 /* Also give back spare room at the end */
5080 if (!chunk_is_mmapped(p)) {
5081 size = chunksize(p);
5082 if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
5083 remainder_size = size - nb;
5084 remainder = chunk_at_offset(p, nb);
5085 set_head(remainder, remainder_size | PREV_INUSE |
5086 (av != &main_arena ? NON_MAIN_ARENA : 0));
5087 set_head_size(p, nb);
5088 _int_free(av, chunk2mem(remainder));
5089 }
5090 }
5091
5092 check_inuse_chunk(av, p);
5093 return chunk2mem(p);
5094 }
5095
5096 #if 0
5097 /*
5098 ------------------------------ calloc ------------------------------
5099 */
5100
5101 #if __STD_C
5102 Void_t* cALLOc(size_t n_elements, size_t elem_size)
5103 #else
5104 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
5105 #endif
5106 {
5107 mchunkptr p;
5108 unsigned long clearsize;
5109 unsigned long nclears;
5110 INTERNAL_SIZE_T* d;
5111
5112 Void_t* mem = mALLOc(n_elements * elem_size);
5113
5114 if (mem != 0) {
5115 p = mem2chunk(mem);
5116
5117 #if MMAP_CLEARS
5118 if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
5119 #endif
5120 {
5121 /*
5122 Unroll clear of <= 36 bytes (72 if 8byte sizes)
5123 We know that contents have an odd number of
5124 INTERNAL_SIZE_T-sized words; minimally 3.
5125 */
5126
5127 d = (INTERNAL_SIZE_T*)mem;
5128 clearsize = chunksize(p) - SIZE_SZ;
5129 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
5130 assert(nclears >= 3);
5131
5132 if (nclears > 9)
5133 MALLOC_ZERO(d, clearsize);
5134
5135 else {
5136 *(d+0) = 0;
5137 *(d+1) = 0;
5138 *(d+2) = 0;
5139 if (nclears > 4) {
5140 *(d+3) = 0;
5141 *(d+4) = 0;
5142 if (nclears > 6) {
5143 *(d+5) = 0;
5144 *(d+6) = 0;
5145 if (nclears > 8) {
5146 *(d+7) = 0;
5147 *(d+8) = 0;
5148 }
5149 }
5150 }
5151 }
5152 }
5153 }
5154 return mem;
5155 }
5156 #endif /* 0 */
5157
5158 #ifndef _LIBC
5159 /*
5160 ------------------------- independent_calloc -------------------------
5161 */
5162
5163 Void_t**
5164 #if __STD_C
5165 _int_icalloc(mstate av, size_t n_elements, size_t elem_size, Void_t* chunks[])
5166 #else
5167 _int_icalloc(av, n_elements, elem_size, chunks)
5168 mstate av; size_t n_elements; size_t elem_size; Void_t* chunks[];
5169 #endif
5170 {
5171 size_t sz = elem_size; /* serves as 1-element array */
5172 /* opts arg of 3 means all elements are same size, and should be cleared */
5173 return iALLOc(av, n_elements, &sz, 3, chunks);
5174 }
5175
5176 /*
5177 ------------------------- independent_comalloc -------------------------
5178 */
5179
5180 Void_t**
5181 #if __STD_C
5182 _int_icomalloc(mstate av, size_t n_elements, size_t sizes[], Void_t* chunks[])
5183 #else
5184 _int_icomalloc(av, n_elements, sizes, chunks)
5185 mstate av; size_t n_elements; size_t sizes[]; Void_t* chunks[];
5186 #endif
5187 {
5188 return iALLOc(av, n_elements, sizes, 0, chunks);
5189 }
5190
5191
5192 /*
5193 ------------------------------ ialloc ------------------------------
5194 ialloc provides common support for independent_X routines, handling all of
5195 the combinations that can result.
5196
5197 The opts arg has:
5198 bit 0 set if all elements are same size (using sizes[0])
5199 bit 1 set if elements should be zeroed
5200 */
5201
5202
5203 static Void_t**
5204 #if __STD_C
5205 iALLOc(mstate av, size_t n_elements, size_t* sizes, int opts, Void_t* chunks[])
5206 #else
5207 iALLOc(av, n_elements, sizes, opts, chunks)
5208 mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
5209 #endif
5210 {
5211 INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
5212 INTERNAL_SIZE_T contents_size; /* total size of elements */
5213 INTERNAL_SIZE_T array_size; /* request size of pointer array */
5214 Void_t* mem; /* malloced aggregate space */
5215 mchunkptr p; /* corresponding chunk */
5216 INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
5217 Void_t** marray; /* either "chunks" or malloced ptr array */
5218 mchunkptr array_chunk; /* chunk for malloced ptr array */
5219 int mmx; /* to disable mmap */
5220 INTERNAL_SIZE_T size;
5221 INTERNAL_SIZE_T size_flags;
5222 size_t i;
5223
5224 /* Ensure initialization/consolidation */
5225 if (have_fastchunks(av)) malloc_consolidate(av);
5226
5227 /* compute array length, if needed */
5228 if (chunks != 0) {
5229 if (n_elements == 0)
5230 return chunks; /* nothing to do */
5231 marray = chunks;
5232 array_size = 0;
5233 }
5234 else {
5235 /* if empty req, must still return chunk representing empty array */
5236 if (n_elements == 0)
5237 return (Void_t**) _int_malloc(av, 0);
5238 marray = 0;
5239 array_size = request2size(n_elements * (sizeof(Void_t*)));
5240 }
5241
5242 /* compute total element size */
5243 if (opts & 0x1) { /* all-same-size */
5244 element_size = request2size(*sizes);
5245 contents_size = n_elements * element_size;
5246 }
5247 else { /* add up all the sizes */
5248 element_size = 0;
5249 contents_size = 0;
5250 for (i = 0; i != n_elements; ++i)
5251 contents_size += request2size(sizes[i]);
5252 }
5253
5254 /* subtract out alignment bytes from total to minimize overallocation */
5255 size = contents_size + array_size - MALLOC_ALIGN_MASK;
5256
5257 /*
5258 Allocate the aggregate chunk.
5259 But first disable mmap so malloc won't use it, since
5260 we would not be able to later free/realloc space internal
5261 to a segregated mmap region.
5262 */
5263 mmx = mp_.n_mmaps_max; /* disable mmap */
5264 mp_.n_mmaps_max = 0;
5265 mem = _int_malloc(av, size);
5266 mp_.n_mmaps_max = mmx; /* reset mmap */
5267 if (mem == 0)
5268 return 0;
5269
5270 p = mem2chunk(mem);
5271 assert(!chunk_is_mmapped(p));
5272 remainder_size = chunksize(p);
5273
5274 if (opts & 0x2) { /* optionally clear the elements */
5275 MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
5276 }
5277
5278 size_flags = PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0);
5279
5280 /* If not provided, allocate the pointer array as final part of chunk */
5281 if (marray == 0) {
5282 array_chunk = chunk_at_offset(p, contents_size);
5283 marray = (Void_t**) (chunk2mem(array_chunk));
5284 set_head(array_chunk, (remainder_size - contents_size) | size_flags);
5285 remainder_size = contents_size;
5286 }
5287
5288 /* split out elements */
5289 for (i = 0; ; ++i) {
5290 marray[i] = chunk2mem(p);
5291 if (i != n_elements-1) {
5292 if (element_size != 0)
5293 size = element_size;
5294 else
5295 size = request2size(sizes[i]);
5296 remainder_size -= size;
5297 set_head(p, size | size_flags);
5298 p = chunk_at_offset(p, size);
5299 }
5300 else { /* the final element absorbs any overallocation slop */
5301 set_head(p, remainder_size | size_flags);
5302 break;
5303 }
5304 }
5305
5306 #if MALLOC_DEBUG
5307 if (marray != chunks) {
5308 /* final element must have exactly exhausted chunk */
5309 if (element_size != 0)
5310 assert(remainder_size == element_size);
5311 else
5312 assert(remainder_size == request2size(sizes[i]));
5313 check_inuse_chunk(av, mem2chunk(marray));
5314 }
5315
5316 for (i = 0; i != n_elements; ++i)
5317 check_inuse_chunk(av, mem2chunk(marray[i]));
5318 #endif
5319
5320 return marray;
5321 }
5322 #endif /* _LIBC */
5323
5324
5325 /*
5326 ------------------------------ valloc ------------------------------
5327 */
5328
5329 Void_t*
5330 #if __STD_C
5331 _int_valloc(mstate av, size_t bytes)
5332 #else
5333 _int_valloc(av, bytes) mstate av; size_t bytes;
5334 #endif
5335 {
5336 /* Ensure initialization/consolidation */
5337 if (have_fastchunks(av)) malloc_consolidate(av);
5338 return _int_memalign(av, mp_.pagesize, bytes);
5339 }
5340
5341 /*
5342 ------------------------------ pvalloc ------------------------------
5343 */
5344
5345
5346 Void_t*
5347 #if __STD_C
5348 _int_pvalloc(mstate av, size_t bytes)
5349 #else
5350 _int_pvalloc(av, bytes) mstate av, size_t bytes;
5351 #endif
5352 {
5353 size_t pagesz;
5354
5355 /* Ensure initialization/consolidation */
5356 if (have_fastchunks(av)) malloc_consolidate(av);
5357 pagesz = mp_.pagesize;
5358 return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
5359 }
5360
5361
5362 /*
5363 ------------------------------ malloc_trim ------------------------------
5364 */
5365
5366 #if __STD_C
5367 int mTRIm(size_t pad)
5368 #else
5369 int mTRIm(pad) size_t pad;
5370 #endif
5371 {
5372 mstate av = &main_arena; /* already locked */
5373
5374 /* Ensure initialization/consolidation */
5375 malloc_consolidate(av);
5376
5377 #ifndef MORECORE_CANNOT_TRIM
5378 return sYSTRIm(pad, av);
5379 #else
5380 return 0;
5381 #endif
5382 }
5383
5384
5385 /*
5386 ------------------------- malloc_usable_size -------------------------
5387 */
5388
5389 #if __STD_C
5390 size_t mUSABLe(Void_t* mem)
5391 #else
5392 size_t mUSABLe(mem) Void_t* mem;
5393 #endif
5394 {
5395 mchunkptr p;
5396 if (mem != 0) {
5397 p = mem2chunk(mem);
5398 if (chunk_is_mmapped(p))
5399 return chunksize(p) - 2*SIZE_SZ;
5400 else if (inuse(p))
5401 return chunksize(p) - SIZE_SZ;
5402 }
5403 return 0;
5404 }
5405
5406 /*
5407 ------------------------------ mallinfo ------------------------------
5408 */
5409
5410 struct mallinfo mALLINFo(mstate av)
5411 {
5412 struct mallinfo mi;
5413 size_t i;
5414 mbinptr b;
5415 mchunkptr p;
5416 INTERNAL_SIZE_T avail;
5417 INTERNAL_SIZE_T fastavail;
5418 int nblocks;
5419 int nfastblocks;
5420
5421 /* Ensure initialization */
5422 if (av->top == 0) malloc_consolidate(av);
5423
5424 check_malloc_state(av);
5425
5426 /* Account for top */
5427 avail = chunksize(av->top);
5428 nblocks = 1; /* top always exists */
5429
5430 /* traverse fastbins */
5431 nfastblocks = 0;
5432 fastavail = 0;
5433
5434 for (i = 0; i < NFASTBINS; ++i) {
5435 for (p = av->fastbins[i]; p != 0; p = p->fd) {
5436 ++nfastblocks;
5437 fastavail += chunksize(p);
5438 }
5439 }
5440
5441 avail += fastavail;
5442
5443 /* traverse regular bins */
5444 for (i = 1; i < NBINS; ++i) {
5445 b = bin_at(av, i);
5446 for (p = last(b); p != b; p = p->bk) {
5447 ++nblocks;
5448 avail += chunksize(p);
5449 }
5450 }
5451
5452 mi.smblks = nfastblocks;
5453 mi.ordblks = nblocks;
5454 mi.fordblks = avail;
5455 mi.uordblks = av->system_mem - avail;
5456 mi.arena = av->system_mem;
5457 mi.hblks = mp_.n_mmaps;
5458 mi.hblkhd = mp_.mmapped_mem;
5459 mi.fsmblks = fastavail;
5460 mi.keepcost = chunksize(av->top);
5461 mi.usmblks = mp_.max_total_mem;
5462 return mi;
5463 }
5464
5465 /*
5466 ------------------------------ malloc_stats ------------------------------
5467 */
5468
5469 void mSTATs()
5470 {
5471 int i;
5472 mstate ar_ptr;
5473 struct mallinfo mi;
5474 unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
5475 #if THREAD_STATS
5476 long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
5477 #endif
5478
5479 if(__malloc_initialized < 0)
5480 ptmalloc_init ();
5481 #ifdef _LIBC
5482 _IO_flockfile (stderr);
5483 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
5484 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
5485 #endif
5486 for (i=0, ar_ptr = &main_arena;; i++) {
5487 (void)mutex_lock(&ar_ptr->mutex);
5488 mi = mALLINFo(ar_ptr);
5489 fprintf(stderr, "Arena %d:\n", i);
5490 fprintf(stderr, "system bytes = %10u\n", (unsigned int)mi.arena);
5491 fprintf(stderr, "in use bytes = %10u\n", (unsigned int)mi.uordblks);
5492 #if MALLOC_DEBUG > 1
5493 if (i > 0)
5494 dump_heap(heap_for_ptr(top(ar_ptr)));
5495 #endif
5496 system_b += mi.arena;
5497 in_use_b += mi.uordblks;
5498 #if THREAD_STATS
5499 stat_lock_direct += ar_ptr->stat_lock_direct;
5500 stat_lock_loop += ar_ptr->stat_lock_loop;
5501 stat_lock_wait += ar_ptr->stat_lock_wait;
5502 #endif
5503 (void)mutex_unlock(&ar_ptr->mutex);
5504 ar_ptr = ar_ptr->next;
5505 if(ar_ptr == &main_arena) break;
5506 }
5507 #if HAVE_MMAP
5508 fprintf(stderr, "Total (incl. mmap):\n");
5509 #else
5510 fprintf(stderr, "Total:\n");
5511 #endif
5512 fprintf(stderr, "system bytes = %10u\n", system_b);
5513 fprintf(stderr, "in use bytes = %10u\n", in_use_b);
5514 #ifdef NO_THREADS
5515 fprintf(stderr, "max system bytes = %10u\n", (unsigned int)mp_.max_total_mem);
5516 #endif
5517 #if HAVE_MMAP
5518 fprintf(stderr, "max mmap regions = %10u\n", (unsigned int)mp_.max_n_mmaps);
5519 fprintf(stderr, "max mmap bytes = %10lu\n",
5520 (unsigned long)mp_.max_mmapped_mem);
5521 #endif
5522 #if THREAD_STATS
5523 fprintf(stderr, "heaps created = %10d\n", stat_n_heaps);
5524 fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
5525 fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
5526 fprintf(stderr, "locked waiting = %10ld\n", stat_lock_wait);
5527 fprintf(stderr, "locked total = %10ld\n",
5528 stat_lock_direct + stat_lock_loop + stat_lock_wait);
5529 #endif
5530 #ifdef _LIBC
5531 ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
5532 _IO_funlockfile (stderr);
5533 #endif
5534 }
5535
5536
5537 /*
5538 ------------------------------ mallopt ------------------------------
5539 */
5540
5541 #if __STD_C
5542 int mALLOPt(int param_number, int value)
5543 #else
5544 int mALLOPt(param_number, value) int param_number; int value;
5545 #endif
5546 {
5547 mstate av = &main_arena;
5548 int res = 1;
5549
5550 if(__malloc_initialized < 0)
5551 ptmalloc_init ();
5552 (void)mutex_lock(&av->mutex);
5553 /* Ensure initialization/consolidation */
5554 malloc_consolidate(av);
5555
5556 switch(param_number) {
5557 case M_MXFAST:
5558 if (value >= 0 && value <= MAX_FAST_SIZE) {
5559 set_max_fast(value);
5560 }
5561 else
5562 res = 0;
5563 break;
5564
5565 case M_TRIM_THRESHOLD:
5566 mp_.trim_threshold = value;
5567 mp_.no_dyn_threshold = 1;
5568 break;
5569
5570 case M_TOP_PAD:
5571 mp_.top_pad = value;
5572 mp_.no_dyn_threshold = 1;
5573 break;
5574
5575 case M_MMAP_THRESHOLD:
5576 #if USE_ARENAS
5577 /* Forbid setting the threshold too high. */
5578 if((unsigned long)value > HEAP_MAX_SIZE/2)
5579 res = 0;
5580 else
5581 #endif
5582 mp_.mmap_threshold = value;
5583 mp_.no_dyn_threshold = 1;
5584 break;
5585
5586 case M_MMAP_MAX:
5587 #if !HAVE_MMAP
5588 if (value != 0)
5589 res = 0;
5590 else
5591 #endif
5592 mp_.n_mmaps_max = value;
5593 mp_.no_dyn_threshold = 1;
5594 break;
5595
5596 case M_CHECK_ACTION:
5597 check_action = value;
5598 break;
5599
5600 case M_PERTURB:
5601 perturb_byte = value;
5602 break;
5603 }
5604 (void)mutex_unlock(&av->mutex);
5605 return res;
5606 }
5607
5608
5609 /*
5610 -------------------- Alternative MORECORE functions --------------------
5611 */
5612
5613
5614 /*
5615 General Requirements for MORECORE.
5616
5617 The MORECORE function must have the following properties:
5618
5619 If MORECORE_CONTIGUOUS is false:
5620
5621 * MORECORE must allocate in multiples of pagesize. It will
5622 only be called with arguments that are multiples of pagesize.
5623
5624 * MORECORE(0) must return an address that is at least
5625 MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
5626
5627 else (i.e. If MORECORE_CONTIGUOUS is true):
5628
5629 * Consecutive calls to MORECORE with positive arguments
5630 return increasing addresses, indicating that space has been
5631 contiguously extended.
5632
5633 * MORECORE need not allocate in multiples of pagesize.
5634 Calls to MORECORE need not have args of multiples of pagesize.
5635
5636 * MORECORE need not page-align.
5637
5638 In either case:
5639
5640 * MORECORE may allocate more memory than requested. (Or even less,
5641 but this will generally result in a malloc failure.)
5642
5643 * MORECORE must not allocate memory when given argument zero, but
5644 instead return one past the end address of memory from previous
5645 nonzero call. This malloc does NOT call MORECORE(0)
5646 until at least one call with positive arguments is made, so
5647 the initial value returned is not important.
5648
5649 * Even though consecutive calls to MORECORE need not return contiguous
5650 addresses, it must be OK for malloc'ed chunks to span multiple
5651 regions in those cases where they do happen to be contiguous.
5652
5653 * MORECORE need not handle negative arguments -- it may instead
5654 just return MORECORE_FAILURE when given negative arguments.
5655 Negative arguments are always multiples of pagesize. MORECORE
5656 must not misinterpret negative args as large positive unsigned
5657 args. You can suppress all such calls from even occurring by defining
5658 MORECORE_CANNOT_TRIM,
5659
5660 There is some variation across systems about the type of the
5661 argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
5662 actually be size_t, because sbrk supports negative args, so it is
5663 normally the signed type of the same width as size_t (sometimes
5664 declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
5665 matter though. Internally, we use "long" as arguments, which should
5666 work across all reasonable possibilities.
5667
5668 Additionally, if MORECORE ever returns failure for a positive
5669 request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
5670 system allocator. This is a useful backup strategy for systems with
5671 holes in address spaces -- in this case sbrk cannot contiguously
5672 expand the heap, but mmap may be able to map noncontiguous space.
5673
5674 If you'd like mmap to ALWAYS be used, you can define MORECORE to be
5675 a function that always returns MORECORE_FAILURE.
5676
5677 If you are using this malloc with something other than sbrk (or its
5678 emulation) to supply memory regions, you probably want to set
5679 MORECORE_CONTIGUOUS as false. As an example, here is a custom
5680 allocator kindly contributed for pre-OSX macOS. It uses virtually
5681 but not necessarily physically contiguous non-paged memory (locked
5682 in, present and won't get swapped out). You can use it by
5683 uncommenting this section, adding some #includes, and setting up the
5684 appropriate defines above:
5685
5686 #define MORECORE osMoreCore
5687 #define MORECORE_CONTIGUOUS 0
5688
5689 There is also a shutdown routine that should somehow be called for
5690 cleanup upon program exit.
5691
5692 #define MAX_POOL_ENTRIES 100
5693 #define MINIMUM_MORECORE_SIZE (64 * 1024)
5694 static int next_os_pool;
5695 void *our_os_pools[MAX_POOL_ENTRIES];
5696
5697 void *osMoreCore(int size)
5698 {
5699 void *ptr = 0;
5700 static void *sbrk_top = 0;
5701
5702 if (size > 0)
5703 {
5704 if (size < MINIMUM_MORECORE_SIZE)
5705 size = MINIMUM_MORECORE_SIZE;
5706 if (CurrentExecutionLevel() == kTaskLevel)
5707 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
5708 if (ptr == 0)
5709 {
5710 return (void *) MORECORE_FAILURE;
5711 }
5712 // save ptrs so they can be freed during cleanup
5713 our_os_pools[next_os_pool] = ptr;
5714 next_os_pool++;
5715 ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
5716 sbrk_top = (char *) ptr + size;
5717 return ptr;
5718 }
5719 else if (size < 0)
5720 {
5721 // we don't currently support shrink behavior
5722 return (void *) MORECORE_FAILURE;
5723 }
5724 else
5725 {
5726 return sbrk_top;
5727 }
5728 }
5729
5730 // cleanup any allocated memory pools
5731 // called as last thing before shutting down driver
5732
5733 void osCleanupMem(void)
5734 {
5735 void **ptr;
5736
5737 for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
5738 if (*ptr)
5739 {
5740 PoolDeallocate(*ptr);
5741 *ptr = 0;
5742 }
5743 }
5744
5745 */
5746
5747
5748 /* Helper code. */
5749
5750 extern char **__libc_argv attribute_hidden;
5751
5752 static void
5753 malloc_printerr(int action, const char *str, void *ptr)
5754 {
5755 if ((action & 5) == 5)
5756 __libc_message (action & 2, "%s\n", str);
5757 else if (action & 1)
5758 {
5759 char buf[2 * sizeof (uintptr_t) + 1];
5760
5761 buf[sizeof (buf) - 1] = '\0';
5762 char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
5763 while (cp > buf)
5764 *--cp = '0';
5765
5766 __libc_message (action & 2,
5767 "*** glibc detected *** %s: %s: 0x%s ***\n",
5768 __libc_argv[0] ?: "<unknown>", str, cp);
5769 }
5770 else if (action & 2)
5771 abort ();
5772 }
5773
5774 #ifdef _LIBC
5775 # include <sys/param.h>
5776
5777 /* We need a wrapper function for one of the additions of POSIX. */
5778 int
5779 __posix_memalign (void **memptr, size_t alignment, size_t size)
5780 {
5781 void *mem;
5782 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
5783 __const __malloc_ptr_t)) =
5784 __memalign_hook;
5785
5786 /* Test whether the SIZE argument is valid. It must be a power of
5787 two multiple of sizeof (void *). */
5788 if (alignment % sizeof (void *) != 0
5789 || !powerof2 (alignment / sizeof (void *)) != 0
5790 || alignment == 0)
5791 return EINVAL;
5792
5793 /* Call the hook here, so that caller is posix_memalign's caller
5794 and not posix_memalign itself. */
5795 if (hook != NULL)
5796 mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
5797 else
5798 mem = public_mEMALIGn (alignment, size);
5799
5800 if (mem != NULL) {
5801 *memptr = mem;
5802 return 0;
5803 }
5804
5805 return ENOMEM;
5806 }
5807 weak_alias (__posix_memalign, posix_memalign)
5808
5809 strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
5810 strong_alias (__libc_free, __cfree) weak_alias (__libc_free, cfree)
5811 strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
5812 strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
5813 strong_alias (__libc_memalign, __memalign)
5814 weak_alias (__libc_memalign, memalign)
5815 strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
5816 strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
5817 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
5818 strong_alias (__libc_mallinfo, __mallinfo)
5819 weak_alias (__libc_mallinfo, mallinfo)
5820 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
5821
5822 weak_alias (__malloc_stats, malloc_stats)
5823 weak_alias (__malloc_usable_size, malloc_usable_size)
5824 weak_alias (__malloc_trim, malloc_trim)
5825 weak_alias (__malloc_get_state, malloc_get_state)
5826 weak_alias (__malloc_set_state, malloc_set_state)
5827
5828 #endif /* _LIBC */
5829
5830 /* ------------------------------------------------------------
5831 History:
5832
5833 [see ftp://g.oswego.edu/pub/misc/malloc.c for the history of dlmalloc]
5834
5835 */
5836 /*
5837 * Local variables:
5838 * c-basic-offset: 2
5839 * End:
5840 */
This page took 0.301756 seconds and 6 git commands to generate.