* io/fts.c (fts_close): Remove redundant checks.
[glibc.git] / malloc / malloc.c
bloba369001520395a1f7fd7b7411bba6c98e04d2391
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.
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.
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.
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. */
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.
26 * Version ptmalloc2-20011215
27 based on:
28 VERSION 2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
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!
34 * Quickstart
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".
45 * Why use this malloc?
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.
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.
63 For a longer but slightly out of date high-level description, see
64 http://gee.cs.oswego.edu/dl/html/malloc.html
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.
72 * Contents, described in more detail in "description of public routines" below.
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)
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();
93 * Vital statistics:
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
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.
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.
109 Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
110 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
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.
118 Even a request for zero bytes (i.e., malloc(0)) returns a
119 pointer to something of the minimum allocatable size.
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.
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
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.
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.)
148 Thread-safety: thread-safe unless NO_THREADS is defined
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.
154 * Synopsis of compile-time options:
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.
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.)
170 OPTION DEFAULT VALUE
172 Compilation Environment options:
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
188 Changing default word sizes:
190 INTERNAL_SIZE_T size_t
191 MALLOC_ALIGNMENT MAX (2 * sizeof(INTERNAL_SIZE_T),
192 __alignof__ (long double))
194 Configuration and functionality options:
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
204 Options for customizing MORECORE:
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)
213 Tuning options that are also dynamically changeable via mallopt:
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
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. */
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.
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*/
240 Void_t* is the pointer type that malloc should say it returns
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*/
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
258 #include <malloc-machine.h>
260 #ifdef _LIBC
261 #include <stdio-common/_itoa.h>
262 #include <bits/wordsize.h>
263 #endif
265 #ifdef __cplusplus
266 extern "C" {
267 #endif
269 /* define LACKS_UNISTD_H if your system does not have a <unistd.h>. */
271 /* #define LACKS_UNISTD_H */
273 #ifndef LACKS_UNISTD_H
274 #include <unistd.h>
275 #endif
277 /* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. */
279 /* #define LACKS_SYS_PARAM_H */
282 #include <stdio.h> /* needed for malloc_stats */
283 #include <errno.h> /* needed for optional MALLOC_FAILURE_ACTION */
285 /* For uintptr_t. */
286 #include <stdint.h>
288 /* For va_arg, va_start, va_end. */
289 #include <stdarg.h>
291 /* For writev and struct iovec. */
292 #include <sys/uio.h>
293 /* For syslog. */
294 #include <sys/syslog.h>
296 /* For various dynamic linking things. */
297 #include <dlfcn.h>
301 Debugging:
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.
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.)
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.
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.
328 #if MALLOC_DEBUG
329 #include <assert.h>
330 #else
331 #undef assert
332 #define assert(x) ((void)0)
333 #endif
337 INTERNAL_SIZE_T is the word-size used for internal bookkeeping
338 of chunk sizes.
340 The default version is the same as size_t.
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.
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.
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.
367 #ifndef INTERNAL_SIZE_T
368 #define INTERNAL_SIZE_T size_t
369 #endif
371 /* The corresponding word size */
372 #define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
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.
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.
391 #define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
392 ? __alignof__ (long double) : 2 * SIZE_SZ)
394 #define MALLOC_ALIGNMENT (2 * SIZE_SZ)
395 #endif
397 /* The corresponding bit mask value */
398 #define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
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).
409 #ifndef REALLOC_ZERO_BYTES_FREES
410 #define REALLOC_ZERO_BYTES_FREES 1
411 #endif
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.
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.
429 #ifndef TRIM_FASTBINS
430 #define TRIM_FASTBINS 0
431 #endif
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.
440 /* #define USE_DL_PREFIX */
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.
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
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
498 Void_t * __default_morecore (ptrdiff_t);
499 Void_t *(*__morecore)(ptrdiff_t) = __default_morecore;
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 */
522 #ifndef _LIBC
523 #define __builtin_expect(expr, val) (expr)
525 #define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
526 #endif
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.
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.
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.
542 #define HAVE_MEMCPY
544 #ifndef USE_MEMCPY
545 #ifdef HAVE_MEMCPY
546 #define USE_MEMCPY 1
547 #else
548 #define USE_MEMCPY 0
549 #endif
550 #endif
553 #if (__STD_C || defined(HAVE_MEMCPY))
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
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.
577 By default, sets errno if running on STD_C platform, else does nothing.
580 #ifndef MALLOC_FAILURE_ACTION
581 #if __STD_C
582 #define MALLOC_FAILURE_ACTION \
583 errno = ENOMEM;
585 #else
586 #define MALLOC_FAILURE_ACTION
587 #endif
588 #endif
591 MORECORE-related declarations. By default, rely on sbrk
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
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.
612 #ifndef MORECORE
613 #define MORECORE sbrk
614 #endif
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.
623 #ifndef MORECORE_FAILURE
624 #define MORECORE_FAILURE (-1)
625 #endif
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.
637 #ifndef MORECORE_CONTIGUOUS
638 #define MORECORE_CONTIGUOUS 1
639 #endif
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.
648 /* #define MORECORE_CANNOT_TRIM */
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.
659 #ifndef MORECORE_CLEARS
660 #define MORECORE_CLEARS 1
661 #endif
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.
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.
676 #ifndef HAVE_MMAP
677 #define HAVE_MMAP 1
680 Standard unix mmap using /dev/zero clears memory so calloc doesn't
681 need to.
684 #ifndef MMAP_CLEARS
685 #define MMAP_CLEARS 1
686 #endif
688 #else /* no mmap */
689 #ifndef MMAP_CLEARS
690 #define MMAP_CLEARS 0
691 #endif
692 #endif
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.
709 #ifndef MMAP_AS_MORECORE_SIZE
710 #define MMAP_AS_MORECORE_SIZE (1024 * 1024)
711 #endif
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.
719 #ifndef HAVE_MREMAP
720 #ifdef linux
721 #define HAVE_MREMAP 1
722 #else
723 #define HAVE_MREMAP 0
724 #endif
726 #endif /* HAVE_MMAP */
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(). */
733 #ifndef USE_ARENAS
734 #define USE_ARENAS HAVE_MMAP
735 #endif
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.
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.
751 #ifndef malloc_getpagesize
753 #ifndef LACKS_UNISTD_H
754 # include <unistd.h>
755 #endif
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
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
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.)
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.
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.
829 /* #define HAVE_USR_INCLUDE_MALLOC_H */
831 #ifdef HAVE_USR_INCLUDE_MALLOC_H
832 #include "/usr/include/malloc.h"
833 #endif
836 /* ---------- description of public routines ------------ */
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.
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.
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
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.
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.
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
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.
886 #if __STD_C
887 Void_t* public_cALLOc(size_t, size_t);
888 #else
889 Void_t* public_cALLOc();
890 #endif
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.
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.
902 If p is null, realloc is equivalent to malloc.
904 If space is not available, realloc returns null, errno is set (if on
905 ANSI) and p is NOT freed.
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.
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).
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.
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
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.
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.
938 Overreliance on memalign is a sure way to fragment space.
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
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.
954 #if __STD_C
955 Void_t* public_vALLOc(size_t);
956 #else
957 Void_t* public_vALLOc();
958 #endif
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).
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)
983 #if __STD_C
984 int public_mALLOPt(int, int);
985 #else
986 int public_mALLOPt();
987 #endif
991 mallinfo()
992 Returns (by copy) a struct containing various summary statistics:
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.)
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.
1013 #if __STD_C
1014 struct mallinfo public_mALLINFo(void);
1015 #else
1016 struct mallinfo public_mALLINFo();
1017 #endif
1019 #ifndef _LIBC
1021 independent_calloc(size_t n_elements, size_t element_size, Void_t* chunks[]);
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.
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.
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).
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.)
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:
1056 struct Node { int item; struct Node* next; };
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;
1072 #if __STD_C
1073 Void_t** public_iCALLOc(size_t, size_t, Void_t**);
1074 #else
1075 Void_t** public_iCALLOc();
1076 #endif
1079 independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
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.
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.
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).
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.)
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.
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:
1114 struct Head { ... }
1115 struct Foot { ... }
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 // ...
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.
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.
1137 #if __STD_C
1138 Void_t** public_iCOMALLOc(size_t, size_t*, Void_t**);
1139 #else
1140 Void_t** public_iCOMALLOc();
1141 #endif
1143 #endif /* _LIBC */
1147 pvalloc(size_t n);
1148 Equivalent to valloc(minimum-page-that-holds(n)), that is,
1149 round up n to nearest pagesize.
1151 #if __STD_C
1152 Void_t* public_pVALLOc(size_t);
1153 #else
1154 Void_t* public_pVALLOc();
1155 #endif
1158 cfree(Void_t* p);
1159 Equivalent to free(p).
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).
1165 #if __STD_C
1166 void public_cFREe(Void_t*);
1167 #else
1168 void public_cFREe();
1169 #endif
1172 malloc_trim(size_t pad);
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.
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.
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.
1195 #if __STD_C
1196 int public_mTRIm(size_t);
1197 #else
1198 int public_mTRIm();
1199 #endif
1202 malloc_usable_size(Void_t* p);
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:
1212 p = malloc(n);
1213 assert(malloc_usable_size(p) >= 256);
1216 #if __STD_C
1217 size_t public_mUSABLe(Void_t*);
1218 #else
1219 size_t public_mUSABLe();
1220 #endif
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.
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.
1238 malloc_stats prints only the most commonly interesting statistics.
1239 More information can be obtained by calling mallinfo.
1242 #if __STD_C
1243 void public_mSTATs(void);
1244 #else
1245 void public_mSTATs();
1246 #endif
1249 malloc_get_state(void);
1251 Returns the state of all malloc variables in an opaque data
1252 structure.
1254 #if __STD_C
1255 Void_t* public_gET_STATe(void);
1256 #else
1257 Void_t* public_gET_STATe();
1258 #endif
1261 malloc_set_state(Void_t* state);
1263 Restore the state of all malloc variables from data obtained with
1264 malloc_get_state().
1266 #if __STD_C
1267 int public_sET_STATe(Void_t*);
1268 #else
1269 int public_sET_STATe();
1270 #endif
1272 #ifdef _LIBC
1274 posix_memalign(void **memptr, size_t alignment, size_t size);
1276 POSIX wrapper like memalign(), checking for validity of size.
1278 int __posix_memalign(void **, size_t, size_t);
1279 #endif
1281 /* mallopt tuning options */
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.
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.
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.
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
1314 #ifndef DEFAULT_MXFAST
1315 #define DEFAULT_MXFAST 64
1316 #endif
1320 M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
1321 to keep before releasing via malloc_trim in free().
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.
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.
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.
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.
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)
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.
1370 Also, trimming is not generally possible in cases where
1371 the main arena is obtained via mmap.
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.
1379 #define M_TRIM_THRESHOLD -1
1381 #ifndef DEFAULT_TRIM_THRESHOLD
1382 #define DEFAULT_TRIM_THRESHOLD (128 * 1024)
1383 #endif
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:
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.
1393 * When malloc_trim is called automatically from free(),
1394 it is used as the `pad' argument.
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.
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.
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.
1412 #define M_TOP_PAD -2
1414 #ifndef DEFAULT_TOP_PAD
1415 #define DEFAULT_TOP_PAD (0)
1416 #endif
1419 MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
1420 adjusted MMAP_THRESHOLD.
1423 #ifndef DEFAULT_MMAP_THRESHOLD_MIN
1424 #define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
1425 #endif
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
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.)
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).
1451 Segregating space in this way has the benefits that:
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.
1462 However, it has the disadvantages that:
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.
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.
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.
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.
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.
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.
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
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.
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).
1521 The upperbound on the threshold satisfies requirement 2)
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.
1531 #define M_MMAP_THRESHOLD -3
1533 #ifndef DEFAULT_MMAP_THRESHOLD
1534 #define DEFAULT_MMAP_THRESHOLD DEFAULT_MMAP_THRESHOLD_MIN
1535 #endif
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.
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.
1550 #define M_MMAP_MAX -4
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
1560 #ifdef __cplusplus
1561 } /* end of extern "C" */
1562 #endif
1564 #include <malloc.h>
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
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
1580 /* Forward declarations. */
1581 struct malloc_chunk;
1582 typedef struct malloc_chunk* mchunkptr;
1584 /* Internal routines. */
1586 #if __STD_C
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);
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
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
1637 #else
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();
1654 #endif
1659 /* ------------- Optional versions of memcopy ---------------- */
1662 #if USE_MEMCPY
1665 Note: memcpy is ONLY invoked with non-overlapping regions,
1666 so the (usually slower) memmove is not needed.
1669 #define MALLOC_COPY(dest, src, nbytes) memcpy(dest, src, nbytes)
1670 #define MALLOC_ZERO(dest, nbytes) memset(dest, 0, nbytes)
1672 #else /* !USE_MEMCPY */
1674 /* Use Duff's device for good zeroing/copying performance. */
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--; } \
1692 } while(0)
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--; } \
1711 } while(0)
1713 #endif
1715 /* ------------------ MMAP support ------------------ */
1718 #if HAVE_MMAP
1720 #include <fcntl.h>
1721 #ifndef LACKS_SYS_MMAN_H
1722 #include <sys/mman.h>
1723 #endif
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
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
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.
1746 #ifndef MAP_ANONYMOUS
1748 static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
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))
1755 #else
1757 #define MMAP(addr, size, prot, flags) \
1758 (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0))
1760 #endif
1763 #endif /* HAVE_MMAP */
1767 ----------------------- Chunk representations -----------------------
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.
1777 struct malloc_chunk {
1779 INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
1780 INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
1782 struct malloc_chunk* fd; /* double links -- used only if free. */
1783 struct malloc_chunk* bk;
1788 malloc_chunk details:
1790 (The following includes lightly edited explanations by Colin Plumb.)
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.
1801 An allocated chunk looks like this:
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... .
1811 . (malloc_usable_size() bytes) .
1813 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1814 | Size of chunk |
1815 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
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.
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.
1826 Free chunks are stored in circular doubly-linked lists, and look like this:
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) .
1840 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1841 `foot:' | Size of chunk, in bytes |
1842 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
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.
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.
1860 The two exceptions to all this are
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.
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.
1875 ---------- Size and alignment checks and conversions ----------
1878 /* conversion from malloc headers to user pointers, and back */
1880 #define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ))
1881 #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
1883 /* The smallest possible chunk */
1884 #define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk))
1886 /* The smallest size we can malloc is an aligned minimal chunk */
1888 #define MINSIZE \
1889 (unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
1891 /* Check if m has acceptable alignment */
1893 #define aligned_OK(m) (((unsigned long)(m) & MALLOC_ALIGN_MASK) == 0)
1895 #define misaligned_chunk(p) \
1896 ((uintptr_t)(MALLOC_ALIGNMENT == 2 * SIZE_SZ ? (p) : chunk2mem (p)) \
1897 & MALLOC_ALIGN_MASK)
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.
1906 #define REQUEST_OUT_OF_RANGE(req) \
1907 ((unsigned long)(req) >= \
1908 (unsigned long)(INTERNAL_SIZE_T)(-2 * MINSIZE))
1910 /* pad request bytes into a usable size -- internal version */
1912 #define request2size(req) \
1913 (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
1914 MINSIZE : \
1915 ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
1917 /* Same, except also perform argument check */
1919 #define checked_request2size(req, sz) \
1920 if (REQUEST_OUT_OF_RANGE(req)) { \
1921 MALLOC_FAILURE_ACTION; \
1922 return 0; \
1924 (sz) = request2size(req);
1927 --------------- Physical chunk operations ---------------
1931 /* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
1932 #define PREV_INUSE 0x1
1934 /* extract inuse bit of previous chunk */
1935 #define prev_inuse(p) ((p)->size & PREV_INUSE)
1938 /* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
1939 #define IS_MMAPPED 0x2
1941 /* check for mmap()'ed chunk */
1942 #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
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
1950 /* check for chunk from non-main arena */
1951 #define chunk_non_main_arena(p) ((p)->size & NON_MAIN_ARENA)
1955 Bits to mask off when extracting size
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.
1962 #define SIZE_BITS (PREV_INUSE|IS_MMAPPED|NON_MAIN_ARENA)
1964 /* Get size, ignoring use bits */
1965 #define chunksize(p) ((p)->size & ~(SIZE_BITS))
1968 /* Ptr to next physical malloc_chunk. */
1969 #define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~SIZE_BITS) ))
1971 /* Ptr to previous physical malloc_chunk */
1972 #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) ))
1974 /* Treat space at ptr + offset as a chunk */
1975 #define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
1977 /* extract p's inuse bit */
1978 #define inuse(p)\
1979 ((((mchunkptr)(((char*)(p))+((p)->size & ~SIZE_BITS)))->size) & PREV_INUSE)
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
1985 #define clear_inuse(p)\
1986 ((mchunkptr)(((char*)(p)) + ((p)->size & ~SIZE_BITS)))->size &= ~(PREV_INUSE)
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)
1993 #define set_inuse_bit_at_offset(p, s)\
1994 (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE)
1996 #define clear_inuse_bit_at_offset(p, s)\
1997 (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE))
2000 /* Set size at head, without disturbing its use bit */
2001 #define set_head_size(p, s) ((p)->size = (((p)->size & SIZE_BITS) | (s)))
2003 /* Set size/use field */
2004 #define set_head(p, s) ((p)->size = (s))
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))
2011 -------------------- Internal data structures --------------------
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.
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.)
2026 Bins
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.
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.
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.
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*.
2061 typedef struct malloc_chunk* mbinptr;
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))
2068 /* analog of ++bin */
2069 #define next_bin(b) ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
2071 /* Reminders about list directionality within bins */
2072 #define first(b) ((b)->fd)
2073 #define last(b) ((b)->bk)
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; \
2088 Indexing
2090 Bins for sizes < 512 bytes contain chunks of all the same size, spaced
2091 8 bytes apart. Larger bins are approximately logarithmically spaced:
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
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.
2104 The bins top out around 1MB because we expect to service large
2105 requests via mmap.
2108 #define NBINS 128
2109 #define NSMALLBINS 64
2110 #define SMALLBIN_WIDTH 8
2111 #define MIN_LARGE_SIZE 512
2113 #define in_smallbin_range(sz) \
2114 ((unsigned long)(sz) < (unsigned long)MIN_LARGE_SIZE)
2116 #define smallbin_index(sz) (((unsigned)(sz)) >> 3)
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)
2126 #define bin_index(sz) \
2127 ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
2131 Unsorted chunks
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.
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.
2144 /* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
2145 #define unsorted_chunks(M) (bin_at(M, 1))
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.)
2165 /* Conveniently, the unsorted bin can be used as dummy top on first call */
2166 #define initial_top(M) (unsorted_chunks(M))
2169 Binmap
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.
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)
2184 #define idx2block(i) ((i) >> BINMAPSHIFT)
2185 #define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
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))
2192 Fastbins
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.
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.
2208 typedef struct malloc_chunk* mfastbinptr;
2210 /* offset 2 to use otherwise unindexable first 2 bins */
2211 #define fastbin_index(sz) ((((unsigned int)(sz)) >> 3) - 2)
2213 /* The maximum fastbin request size we support */
2214 #define MAX_FAST_SIZE 80
2216 #define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
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.
2229 #define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
2232 Since the lowest 2 bits in max_fast don't matter in size comparisons,
2233 they are used as flags.
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.
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.
2246 #define FASTCHUNKS_BIT (1U)
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)
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.
2257 The initial value comes from MORECORE_CONTIGUOUS, but is
2258 changed dynamically if mmap is ever used as an sbrk substitute.
2261 #define NONCONTIGUOUS_BIT (2U)
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)
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.
2275 #define set_max_fast(s) \
2276 global_max_fast = ((s) == 0)? SMALLBIN_WIDTH: request2size(s)
2277 #define get_max_fast() global_max_fast
2281 ----------- Internal state representation and initialization -----------
2284 struct malloc_state {
2285 /* Serialize access. */
2286 mutex_t mutex;
2288 /* Flags (formerly in max_fast). */
2289 int flags;
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
2296 /* Fastbins */
2297 mfastbinptr fastbins[NFASTBINS];
2299 /* Base of the topmost chunk -- not otherwise kept in a bin */
2300 mchunkptr top;
2302 /* The remainder from the most recent split of a small request */
2303 mchunkptr last_remainder;
2305 /* Normal bins packed as described above */
2306 mchunkptr bins[NBINS * 2 - 2];
2308 /* Bitmap of bins */
2309 unsigned int binmap[BINMAPSIZE];
2311 /* Linked list */
2312 struct malloc_state *next;
2314 /* Memory allocated from the system in this arena. */
2315 INTERNAL_SIZE_T system_mem;
2316 INTERNAL_SIZE_T max_system_mem;
2319 struct malloc_par {
2320 /* Tunable parameters */
2321 unsigned long trim_threshold;
2322 INTERNAL_SIZE_T top_pad;
2323 INTERNAL_SIZE_T mmap_threshold;
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;
2334 /* Cache malloc_getpagesize */
2335 unsigned int pagesize;
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 */
2344 /* First address handed out by MORECORE/sbrk. */
2345 char* sbrk_base;
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). */
2354 static struct malloc_state main_arena;
2356 /* There is only one instance of the malloc parameters. */
2358 static struct malloc_par mp_;
2361 /* Maximum size of memory handled in fastbins. */
2362 static INTERNAL_SIZE_T global_max_fast;
2365 Initialize a malloc_state struct.
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.)
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
2380 int i;
2381 mbinptr bin;
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;
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;
2397 av->top = initial_top(av);
2401 Other internal utilities operating on mstates
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
2419 /* -------------- Early definitions for debugging hooks ---------------- */
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
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));
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;
2455 /* ---------------- Error behavior ------------------------------------ */
2457 #ifndef DEFAULT_CHECK_ACTION
2458 #define DEFAULT_CHECK_ACTION 3
2459 #endif
2461 static int check_action = DEFAULT_CHECK_ACTION;
2464 /* ------------------ Testing support ----------------------------------*/
2466 static int perturb_byte;
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)
2472 /* ------------------- Support for multiple arenas -------------------- */
2473 #include "arena.c"
2476 Debugging support
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!)
2485 #if ! MALLOC_DEBUG
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)
2494 #else
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)
2504 Properties of all chunks
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
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;
2518 if (!chunk_is_mmapped(p)) {
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)));
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));
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);
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
2553 Properties of free chunks
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
2562 INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
2563 mchunkptr next = chunk_at_offset(p, sz);
2565 do_check_chunk(av, p);
2567 /* Chunk must claim to be free ... */
2568 assert(!inuse(p));
2569 assert (!chunk_is_mmapped(p));
2571 /* Unless a special marker, must have OK fields */
2572 if ((unsigned long)(sz) >= MINSIZE)
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));
2582 /* ... and has minimally sane links */
2583 assert(p->fd->bk == p);
2584 assert(p->bk->fd == p);
2586 else /* markers are always of size SIZE_SZ */
2587 assert(sz == SIZE_SZ);
2591 Properties of inuse chunks
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
2600 mchunkptr next;
2602 do_check_chunk(av, p);
2604 if (chunk_is_mmapped(p))
2605 return; /* mmapped chunks have no next/prev */
2607 /* Check whether it claims to be in use ... */
2608 assert(inuse(p));
2610 next = next_chunk(p);
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.
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);
2623 if (next == av->top) {
2624 assert(prev_inuse(next));
2625 assert(chunksize(next) >= MINSIZE);
2627 else if (!inuse(next))
2628 do_check_free_chunk(av, next);
2632 Properties of chunks recycled from fastbins
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
2642 INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
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);
2652 do_check_inuse_chunk(av, p);
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);
2665 Properties of nonrecycled chunks at the point they are malloced
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
2675 /* same as recycled case ... */
2676 do_check_remalloced_chunk(av, p, s);
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.
2688 assert(prev_inuse(p));
2693 Properties of malloc_state.
2695 This may be useful for debugging malloc, as well as detecting user
2696 programmer errors that somehow write into malloc_state.
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.
2703 static void do_check_malloc_state(mstate av)
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;
2716 /* internal size_t must be no wider than pointer type */
2717 assert(sizeof(INTERNAL_SIZE_T) <= sizeof(char*));
2719 /* alignment is a power of 2 */
2720 assert((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-1)) == 0);
2722 /* cannot run remaining checks until fully initialized */
2723 if (av->top == 0 || av->top == initial_top(av))
2724 return;
2726 /* pagesize is a power of 2 */
2727 assert((mp_.pagesize & (mp_.pagesize-1)) == 0);
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));
2734 /* properties of fastbins */
2736 /* max_fast is in allowed range */
2737 assert((get_max_fast () & ~1) <= request2size(MAX_FAST_SIZE));
2739 max_fast_bin = fastbin_index(get_max_fast ());
2741 for (i = 0; i < NFASTBINS; ++i) {
2742 p = av->fastbins[i];
2744 /* all bins past max_fast are empty */
2745 if (i > max_fast_bin)
2746 assert(p == 0);
2748 while (p != 0) {
2749 /* each chunk claims to be inuse */
2750 do_check_inuse_chunk(av, p);
2751 total += chunksize(p);
2752 /* chunk belongs in this bin */
2753 assert(fastbin_index(chunksize(p)) == i);
2754 p = p->fd;
2758 if (total != 0)
2759 assert(have_fastchunks(av));
2760 else if (!have_fastchunks(av))
2761 assert(total == 0);
2763 /* check normal bins */
2764 for (i = 1; i < NBINS; ++i) {
2765 b = bin_at(av,i);
2767 /* binmap is accurate (except for bin 1 == unsorted_chunks) */
2768 if (i >= 2) {
2769 binbit = get_binmap(av,i);
2770 empty = last(b) == b;
2771 if (!binbit)
2772 assert(empty);
2773 else if (!empty)
2774 assert(binbit);
2777 for (p = last(b); p != b; p = p->bk) {
2778 /* each chunk claims to be free */
2779 do_check_free_chunk(av, p);
2780 size = chunksize(p);
2781 total += size;
2782 if (i >= 2) {
2783 /* chunk belongs in bin */
2784 idx = bin_index(size);
2785 assert(idx == i);
2786 /* lists are sorted */
2787 assert(p->bk == b ||
2788 (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
2790 /* chunk is followed by a legal chain of inuse chunks */
2791 for (q = next_chunk(p);
2792 (q != av->top && inuse(q) &&
2793 (unsigned long)(chunksize(q)) >= MINSIZE);
2794 q = next_chunk(q))
2795 do_check_inuse_chunk(av, q);
2799 /* top chunk is OK */
2800 check_chunk(av, av->top);
2802 /* sanity checks for statistics */
2804 #ifdef NO_THREADS
2805 assert(total <= (unsigned long)(mp_.max_total_mem));
2806 assert(mp_.n_mmaps >= 0);
2807 #endif
2808 assert(mp_.n_mmaps <= mp_.n_mmaps_max);
2809 assert(mp_.n_mmaps <= mp_.max_n_mmaps);
2811 assert((unsigned long)(av->system_mem) <=
2812 (unsigned long)(av->max_system_mem));
2814 assert((unsigned long)(mp_.mmapped_mem) <=
2815 (unsigned long)(mp_.max_mmapped_mem));
2817 #ifdef NO_THREADS
2818 assert((unsigned long)(mp_.max_total_mem) >=
2819 (unsigned long)(mp_.mmapped_mem) + (unsigned long)(av->system_mem));
2820 #endif
2822 #endif
2825 /* ----------------- Support for debugging hooks -------------------- */
2826 #include "hooks.c"
2829 /* ----------- Routines dealing with system allocation -------------- */
2832 sysmalloc handles malloc cases requiring more memory from the system.
2833 On entry, it is assumed that av->top does not have enough
2834 space to service request for nb bytes, thus requiring that av->top
2835 be extended or replaced.
2838 #if __STD_C
2839 static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
2840 #else
2841 static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
2842 #endif
2844 mchunkptr old_top; /* incoming value of av->top */
2845 INTERNAL_SIZE_T old_size; /* its size */
2846 char* old_end; /* its end address */
2848 long size; /* arg to first MORECORE or mmap call */
2849 char* brk; /* return value from MORECORE */
2851 long correction; /* arg to 2nd MORECORE call */
2852 char* snd_brk; /* 2nd return val */
2854 INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
2855 INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
2856 char* aligned_brk; /* aligned offset into brk */
2858 mchunkptr p; /* the allocated/returned chunk */
2859 mchunkptr remainder; /* remainder from allocation */
2860 unsigned long remainder_size; /* its size */
2862 unsigned long sum; /* for updating stats */
2864 size_t pagemask = mp_.pagesize - 1;
2865 bool tried_mmap = false;
2868 #if HAVE_MMAP
2871 If have mmap, and the request size meets the mmap threshold, and
2872 the system supports mmap, and there are few enough currently
2873 allocated mmapped regions, try to directly map this request
2874 rather than expanding top.
2877 if ((unsigned long)(nb) >= (unsigned long)(mp_.mmap_threshold) &&
2878 (mp_.n_mmaps < mp_.n_mmaps_max)) {
2880 char* mm; /* return value from mmap call*/
2882 try_mmap:
2884 Round up size to nearest page. For mmapped chunks, the overhead
2885 is one SIZE_SZ unit larger than for normal chunks, because there
2886 is no following chunk whose prev_size field could be used.
2888 size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
2889 tried_mmap = true;
2891 /* Don't try if size wraps around 0 */
2892 if ((unsigned long)(size) > (unsigned long)(nb)) {
2894 mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
2896 if (mm != MAP_FAILED) {
2899 The offset to the start of the mmapped region is stored
2900 in the prev_size field of the chunk. This allows us to adjust
2901 returned start address to meet alignment requirements here
2902 and in memalign(), and still be able to compute proper
2903 address argument for later munmap in free() and realloc().
2906 front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
2907 if (front_misalign > 0) {
2908 correction = MALLOC_ALIGNMENT - front_misalign;
2909 p = (mchunkptr)(mm + correction);
2910 p->prev_size = correction;
2911 set_head(p, (size - correction) |IS_MMAPPED);
2913 else {
2914 p = (mchunkptr)mm;
2915 set_head(p, size|IS_MMAPPED);
2918 /* update statistics */
2920 if (++mp_.n_mmaps > mp_.max_n_mmaps)
2921 mp_.max_n_mmaps = mp_.n_mmaps;
2923 sum = mp_.mmapped_mem += size;
2924 if (sum > (unsigned long)(mp_.max_mmapped_mem))
2925 mp_.max_mmapped_mem = sum;
2926 #ifdef NO_THREADS
2927 sum += av->system_mem;
2928 if (sum > (unsigned long)(mp_.max_total_mem))
2929 mp_.max_total_mem = sum;
2930 #endif
2932 check_chunk(av, p);
2934 return chunk2mem(p);
2938 #endif
2940 /* Record incoming configuration of top */
2942 old_top = av->top;
2943 old_size = chunksize(old_top);
2944 old_end = (char*)(chunk_at_offset(old_top, old_size));
2946 brk = snd_brk = (char*)(MORECORE_FAILURE);
2949 If not the first time through, we require old_size to be
2950 at least MINSIZE and to have prev_inuse set.
2953 assert((old_top == initial_top(av) && old_size == 0) ||
2954 ((unsigned long) (old_size) >= MINSIZE &&
2955 prev_inuse(old_top) &&
2956 ((unsigned long)old_end & pagemask) == 0));
2958 /* Precondition: not enough current space to satisfy nb request */
2959 assert((unsigned long)(old_size) < (unsigned long)(nb + MINSIZE));
2961 /* Precondition: all fastbins are consolidated */
2962 assert(!have_fastchunks(av));
2965 if (av != &main_arena) {
2967 heap_info *old_heap, *heap;
2968 size_t old_heap_size;
2970 /* First try to extend the current heap. */
2971 old_heap = heap_for_ptr(old_top);
2972 old_heap_size = old_heap->size;
2973 if ((long) (MINSIZE + nb - old_size) > 0
2974 && grow_heap(old_heap, MINSIZE + nb - old_size) == 0) {
2975 av->system_mem += old_heap->size - old_heap_size;
2976 arena_mem += old_heap->size - old_heap_size;
2977 #if 0
2978 if(mmapped_mem + arena_mem + sbrked_mem > max_total_mem)
2979 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
2980 #endif
2981 set_head(old_top, (((char *)old_heap + old_heap->size) - (char *)old_top)
2982 | PREV_INUSE);
2984 else if ((heap = new_heap(nb + (MINSIZE + sizeof(*heap)), mp_.top_pad))) {
2985 /* Use a newly allocated heap. */
2986 heap->ar_ptr = av;
2987 heap->prev = old_heap;
2988 av->system_mem += heap->size;
2989 arena_mem += heap->size;
2990 #if 0
2991 if((unsigned long)(mmapped_mem + arena_mem + sbrked_mem) > max_total_mem)
2992 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
2993 #endif
2994 /* Set up the new top. */
2995 top(av) = chunk_at_offset(heap, sizeof(*heap));
2996 set_head(top(av), (heap->size - sizeof(*heap)) | PREV_INUSE);
2998 /* Setup fencepost and free the old top chunk. */
2999 /* The fencepost takes at least MINSIZE bytes, because it might
3000 become the top chunk again later. Note that a footer is set
3001 up, too, although the chunk is marked in use. */
3002 old_size -= MINSIZE;
3003 set_head(chunk_at_offset(old_top, old_size + 2*SIZE_SZ), 0|PREV_INUSE);
3004 if (old_size >= MINSIZE) {
3005 set_head(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)|PREV_INUSE);
3006 set_foot(chunk_at_offset(old_top, old_size), (2*SIZE_SZ));
3007 set_head(old_top, old_size|PREV_INUSE|NON_MAIN_ARENA);
3008 _int_free(av, chunk2mem(old_top));
3009 } else {
3010 set_head(old_top, (old_size + 2*SIZE_SZ)|PREV_INUSE);
3011 set_foot(old_top, (old_size + 2*SIZE_SZ));
3014 else if (!tried_mmap)
3015 /* We can at least try to use to mmap memory. */
3016 goto try_mmap;
3018 } else { /* av == main_arena */
3021 /* Request enough space for nb + pad + overhead */
3023 size = nb + mp_.top_pad + MINSIZE;
3026 If contiguous, we can subtract out existing space that we hope to
3027 combine with new space. We add it back later only if
3028 we don't actually get contiguous space.
3031 if (contiguous(av))
3032 size -= old_size;
3035 Round to a multiple of page size.
3036 If MORECORE is not contiguous, this ensures that we only call it
3037 with whole-page arguments. And if MORECORE is contiguous and
3038 this is not first time through, this preserves page-alignment of
3039 previous calls. Otherwise, we correct to page-align below.
3042 size = (size + pagemask) & ~pagemask;
3045 Don't try to call MORECORE if argument is so big as to appear
3046 negative. Note that since mmap takes size_t arg, it may succeed
3047 below even if we cannot call MORECORE.
3050 if (size > 0)
3051 brk = (char*)(MORECORE(size));
3053 if (brk != (char*)(MORECORE_FAILURE)) {
3054 /* Call the `morecore' hook if necessary. */
3055 if (__after_morecore_hook)
3056 (*__after_morecore_hook) ();
3057 } else {
3059 If have mmap, try using it as a backup when MORECORE fails or
3060 cannot be used. This is worth doing on systems that have "holes" in
3061 address space, so sbrk cannot extend to give contiguous space, but
3062 space is available elsewhere. Note that we ignore mmap max count
3063 and threshold limits, since the space will not be used as a
3064 segregated mmap region.
3067 #if HAVE_MMAP
3068 /* Cannot merge with old top, so add its size back in */
3069 if (contiguous(av))
3070 size = (size + old_size + pagemask) & ~pagemask;
3072 /* If we are relying on mmap as backup, then use larger units */
3073 if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
3074 size = MMAP_AS_MORECORE_SIZE;
3076 /* Don't try if size wraps around 0 */
3077 if ((unsigned long)(size) > (unsigned long)(nb)) {
3079 char *mbrk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
3081 if (mbrk != MAP_FAILED) {
3083 /* We do not need, and cannot use, another sbrk call to find end */
3084 brk = mbrk;
3085 snd_brk = brk + size;
3088 Record that we no longer have a contiguous sbrk region.
3089 After the first time mmap is used as backup, we do not
3090 ever rely on contiguous space since this could incorrectly
3091 bridge regions.
3093 set_noncontiguous(av);
3096 #endif
3099 if (brk != (char*)(MORECORE_FAILURE)) {
3100 if (mp_.sbrk_base == 0)
3101 mp_.sbrk_base = brk;
3102 av->system_mem += size;
3105 If MORECORE extends previous space, we can likewise extend top size.
3108 if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE))
3109 set_head(old_top, (size + old_size) | PREV_INUSE);
3111 else if (contiguous(av) && old_size && brk < old_end) {
3112 /* Oops! Someone else killed our space.. Can't touch anything. */
3113 assert(0);
3117 Otherwise, make adjustments:
3119 * If the first time through or noncontiguous, we need to call sbrk
3120 just to find out where the end of memory lies.
3122 * We need to ensure that all returned chunks from malloc will meet
3123 MALLOC_ALIGNMENT
3125 * If there was an intervening foreign sbrk, we need to adjust sbrk
3126 request size to account for fact that we will not be able to
3127 combine new space with existing space in old_top.
3129 * Almost all systems internally allocate whole pages at a time, in
3130 which case we might as well use the whole last page of request.
3131 So we allocate enough more memory to hit a page boundary now,
3132 which in turn causes future contiguous calls to page-align.
3135 else {
3136 front_misalign = 0;
3137 end_misalign = 0;
3138 correction = 0;
3139 aligned_brk = brk;
3141 /* handle contiguous cases */
3142 if (contiguous(av)) {
3144 /* Count foreign sbrk as system_mem. */
3145 if (old_size)
3146 av->system_mem += brk - old_end;
3148 /* Guarantee alignment of first new chunk made from this space */
3150 front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3151 if (front_misalign > 0) {
3154 Skip over some bytes to arrive at an aligned position.
3155 We don't need to specially mark these wasted front bytes.
3156 They will never be accessed anyway because
3157 prev_inuse of av->top (and any chunk created from its start)
3158 is always true after initialization.
3161 correction = MALLOC_ALIGNMENT - front_misalign;
3162 aligned_brk += correction;
3166 If this isn't adjacent to existing space, then we will not
3167 be able to merge with old_top space, so must add to 2nd request.
3170 correction += old_size;
3172 /* Extend the end address to hit a page boundary */
3173 end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3174 correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3176 assert(correction >= 0);
3177 snd_brk = (char*)(MORECORE(correction));
3180 If can't allocate correction, try to at least find out current
3181 brk. It might be enough to proceed without failing.
3183 Note that if second sbrk did NOT fail, we assume that space
3184 is contiguous with first sbrk. This is a safe assumption unless
3185 program is multithreaded but doesn't use locks and a foreign sbrk
3186 occurred between our first and second calls.
3189 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3190 correction = 0;
3191 snd_brk = (char*)(MORECORE(0));
3192 } else
3193 /* Call the `morecore' hook if necessary. */
3194 if (__after_morecore_hook)
3195 (*__after_morecore_hook) ();
3198 /* handle non-contiguous cases */
3199 else {
3200 /* MORECORE/mmap must correctly align */
3201 assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3203 /* Find out current end of memory */
3204 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3205 snd_brk = (char*)(MORECORE(0));
3209 /* Adjust top based on results of second sbrk */
3210 if (snd_brk != (char*)(MORECORE_FAILURE)) {
3211 av->top = (mchunkptr)aligned_brk;
3212 set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3213 av->system_mem += correction;
3216 If not the first time through, we either have a
3217 gap due to foreign sbrk or a non-contiguous region. Insert a
3218 double fencepost at old_top to prevent consolidation with space
3219 we don't own. These fenceposts are artificial chunks that are
3220 marked as inuse and are in any case too small to use. We need
3221 two to make sizes and alignments work out.
3224 if (old_size != 0) {
3226 Shrink old_top to insert fenceposts, keeping size a
3227 multiple of MALLOC_ALIGNMENT. We know there is at least
3228 enough space in old_top to do this.
3230 old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3231 set_head(old_top, old_size | PREV_INUSE);
3234 Note that the following assignments completely overwrite
3235 old_top when old_size was previously MINSIZE. This is
3236 intentional. We need the fencepost, even if old_top otherwise gets
3237 lost.
3239 chunk_at_offset(old_top, old_size )->size =
3240 (2*SIZE_SZ)|PREV_INUSE;
3242 chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
3243 (2*SIZE_SZ)|PREV_INUSE;
3245 /* If possible, release the rest. */
3246 if (old_size >= MINSIZE) {
3247 _int_free(av, chunk2mem(old_top));
3254 /* Update statistics */
3255 #ifdef NO_THREADS
3256 sum = av->system_mem + mp_.mmapped_mem;
3257 if (sum > (unsigned long)(mp_.max_total_mem))
3258 mp_.max_total_mem = sum;
3259 #endif
3263 } /* if (av != &main_arena) */
3265 if ((unsigned long)av->system_mem > (unsigned long)(av->max_system_mem))
3266 av->max_system_mem = av->system_mem;
3267 check_malloc_state(av);
3269 /* finally, do the allocation */
3270 p = av->top;
3271 size = chunksize(p);
3273 /* check that one of the above allocation paths succeeded */
3274 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3275 remainder_size = size - nb;
3276 remainder = chunk_at_offset(p, nb);
3277 av->top = remainder;
3278 set_head(p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0));
3279 set_head(remainder, remainder_size | PREV_INUSE);
3280 check_malloced_chunk(av, p, nb);
3281 return chunk2mem(p);
3284 /* catch all failure paths */
3285 MALLOC_FAILURE_ACTION;
3286 return 0;
3291 sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
3292 to the system (via negative arguments to sbrk) if there is unused
3293 memory at the `high' end of the malloc pool. It is called
3294 automatically by free() when top space exceeds the trim
3295 threshold. It is also called by the public malloc_trim routine. It
3296 returns 1 if it actually released any memory, else 0.
3299 #if __STD_C
3300 static int sYSTRIm(size_t pad, mstate av)
3301 #else
3302 static int sYSTRIm(pad, av) size_t pad; mstate av;
3303 #endif
3305 long top_size; /* Amount of top-most memory */
3306 long extra; /* Amount to release */
3307 long released; /* Amount actually released */
3308 char* current_brk; /* address returned by pre-check sbrk call */
3309 char* new_brk; /* address returned by post-check sbrk call */
3310 size_t pagesz;
3312 pagesz = mp_.pagesize;
3313 top_size = chunksize(av->top);
3315 /* Release in pagesize units, keeping at least one page */
3316 extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3318 if (extra > 0) {
3321 Only proceed if end of memory is where we last set it.
3322 This avoids problems if there were foreign sbrk calls.
3324 current_brk = (char*)(MORECORE(0));
3325 if (current_brk == (char*)(av->top) + top_size) {
3328 Attempt to release memory. We ignore MORECORE return value,
3329 and instead call again to find out where new end of memory is.
3330 This avoids problems if first call releases less than we asked,
3331 of if failure somehow altered brk value. (We could still
3332 encounter problems if it altered brk in some very bad way,
3333 but the only thing we can do is adjust anyway, which will cause
3334 some downstream failure.)
3337 MORECORE(-extra);
3338 /* Call the `morecore' hook if necessary. */
3339 if (__after_morecore_hook)
3340 (*__after_morecore_hook) ();
3341 new_brk = (char*)(MORECORE(0));
3343 if (new_brk != (char*)MORECORE_FAILURE) {
3344 released = (long)(current_brk - new_brk);
3346 if (released != 0) {
3347 /* Success. Adjust top. */
3348 av->system_mem -= released;
3349 set_head(av->top, (top_size - released) | PREV_INUSE);
3350 check_malloc_state(av);
3351 return 1;
3356 return 0;
3359 #ifdef HAVE_MMAP
3361 static void
3362 internal_function
3363 #if __STD_C
3364 munmap_chunk(mchunkptr p)
3365 #else
3366 munmap_chunk(p) mchunkptr p;
3367 #endif
3369 INTERNAL_SIZE_T size = chunksize(p);
3371 assert (chunk_is_mmapped(p));
3372 #if 0
3373 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3374 assert((mp_.n_mmaps > 0));
3375 #endif
3377 uintptr_t block = (uintptr_t) p - p->prev_size;
3378 size_t total_size = p->prev_size + size;
3379 /* Unfortunately we have to do the compilers job by hand here. Normally
3380 we would test BLOCK and TOTAL-SIZE separately for compliance with the
3381 page size. But gcc does not recognize the optimization possibility
3382 (in the moment at least) so we combine the two values into one before
3383 the bit test. */
3384 if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
3386 malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
3387 chunk2mem (p));
3388 return;
3391 mp_.n_mmaps--;
3392 mp_.mmapped_mem -= total_size;
3394 int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
3396 /* munmap returns non-zero on failure */
3397 assert(ret == 0);
3400 #if HAVE_MREMAP
3402 static mchunkptr
3403 internal_function
3404 #if __STD_C
3405 mremap_chunk(mchunkptr p, size_t new_size)
3406 #else
3407 mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
3408 #endif
3410 size_t page_mask = mp_.pagesize - 1;
3411 INTERNAL_SIZE_T offset = p->prev_size;
3412 INTERNAL_SIZE_T size = chunksize(p);
3413 char *cp;
3415 assert (chunk_is_mmapped(p));
3416 #if 0
3417 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3418 assert((mp_.n_mmaps > 0));
3419 #endif
3420 assert(((size + offset) & (mp_.pagesize-1)) == 0);
3422 /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
3423 new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
3425 cp = (char *)mremap((char *)p - offset, size + offset, new_size,
3426 MREMAP_MAYMOVE);
3428 if (cp == MAP_FAILED) return 0;
3430 p = (mchunkptr)(cp + offset);
3432 assert(aligned_OK(chunk2mem(p)));
3434 assert((p->prev_size == offset));
3435 set_head(p, (new_size - offset)|IS_MMAPPED);
3437 mp_.mmapped_mem -= size + offset;
3438 mp_.mmapped_mem += new_size;
3439 if ((unsigned long)mp_.mmapped_mem > (unsigned long)mp_.max_mmapped_mem)
3440 mp_.max_mmapped_mem = mp_.mmapped_mem;
3441 #ifdef NO_THREADS
3442 if ((unsigned long)(mp_.mmapped_mem + arena_mem + main_arena.system_mem) >
3443 mp_.max_total_mem)
3444 mp_.max_total_mem = mp_.mmapped_mem + arena_mem + main_arena.system_mem;
3445 #endif
3446 return p;
3449 #endif /* HAVE_MREMAP */
3451 #endif /* HAVE_MMAP */
3453 /*------------------------ Public wrappers. --------------------------------*/
3455 Void_t*
3456 public_mALLOc(size_t bytes)
3458 mstate ar_ptr;
3459 Void_t *victim;
3461 __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t) = __malloc_hook;
3462 if (hook != NULL)
3463 return (*hook)(bytes, RETURN_ADDRESS (0));
3465 arena_get(ar_ptr, bytes);
3466 if(!ar_ptr)
3467 return 0;
3468 victim = _int_malloc(ar_ptr, bytes);
3469 if(!victim) {
3470 /* Maybe the failure is due to running out of mmapped areas. */
3471 if(ar_ptr != &main_arena) {
3472 (void)mutex_unlock(&ar_ptr->mutex);
3473 (void)mutex_lock(&main_arena.mutex);
3474 victim = _int_malloc(&main_arena, bytes);
3475 (void)mutex_unlock(&main_arena.mutex);
3476 } else {
3477 #if USE_ARENAS
3478 /* ... or sbrk() has failed and there is still a chance to mmap() */
3479 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3480 (void)mutex_unlock(&main_arena.mutex);
3481 if(ar_ptr) {
3482 victim = _int_malloc(ar_ptr, bytes);
3483 (void)mutex_unlock(&ar_ptr->mutex);
3485 #endif
3487 } else
3488 (void)mutex_unlock(&ar_ptr->mutex);
3489 assert(!victim || chunk_is_mmapped(mem2chunk(victim)) ||
3490 ar_ptr == arena_for_chunk(mem2chunk(victim)));
3491 return victim;
3493 #ifdef libc_hidden_def
3494 libc_hidden_def(public_mALLOc)
3495 #endif
3497 void
3498 public_fREe(Void_t* mem)
3500 mstate ar_ptr;
3501 mchunkptr p; /* chunk corresponding to mem */
3503 void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t) = __free_hook;
3504 if (hook != NULL) {
3505 (*hook)(mem, RETURN_ADDRESS (0));
3506 return;
3509 if (mem == 0) /* free(0) has no effect */
3510 return;
3512 p = mem2chunk(mem);
3514 #if HAVE_MMAP
3515 if (chunk_is_mmapped(p)) /* release mmapped memory. */
3517 /* see if the dynamic brk/mmap threshold needs adjusting */
3518 if (!mp_.no_dyn_threshold
3519 && p->size > mp_.mmap_threshold
3520 && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
3522 mp_.mmap_threshold = chunksize (p);
3523 mp_.trim_threshold = 2 * mp_.mmap_threshold;
3525 munmap_chunk(p);
3526 return;
3528 #endif
3530 ar_ptr = arena_for_chunk(p);
3531 #if THREAD_STATS
3532 if(!mutex_trylock(&ar_ptr->mutex))
3533 ++(ar_ptr->stat_lock_direct);
3534 else {
3535 (void)mutex_lock(&ar_ptr->mutex);
3536 ++(ar_ptr->stat_lock_wait);
3538 #else
3539 (void)mutex_lock(&ar_ptr->mutex);
3540 #endif
3541 _int_free(ar_ptr, mem);
3542 (void)mutex_unlock(&ar_ptr->mutex);
3544 #ifdef libc_hidden_def
3545 libc_hidden_def (public_fREe)
3546 #endif
3548 Void_t*
3549 public_rEALLOc(Void_t* oldmem, size_t bytes)
3551 mstate ar_ptr;
3552 INTERNAL_SIZE_T nb; /* padded request size */
3554 mchunkptr oldp; /* chunk corresponding to oldmem */
3555 INTERNAL_SIZE_T oldsize; /* its size */
3557 Void_t* newp; /* chunk to return */
3559 __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) =
3560 __realloc_hook;
3561 if (hook != NULL)
3562 return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
3564 #if REALLOC_ZERO_BYTES_FREES
3565 if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; }
3566 #endif
3568 /* realloc of null is supposed to be same as malloc */
3569 if (oldmem == 0) return public_mALLOc(bytes);
3571 oldp = mem2chunk(oldmem);
3572 oldsize = chunksize(oldp);
3574 /* Little security check which won't hurt performance: the
3575 allocator never wrapps around at the end of the address space.
3576 Therefore we can exclude some size values which might appear
3577 here by accident or by "design" from some intruder. */
3578 if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
3579 || __builtin_expect (misaligned_chunk (oldp), 0))
3581 malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
3582 return NULL;
3585 checked_request2size(bytes, nb);
3587 #if HAVE_MMAP
3588 if (chunk_is_mmapped(oldp))
3590 Void_t* newmem;
3592 #if HAVE_MREMAP
3593 newp = mremap_chunk(oldp, nb);
3594 if(newp) return chunk2mem(newp);
3595 #endif
3596 /* Note the extra SIZE_SZ overhead. */
3597 if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
3598 /* Must alloc, copy, free. */
3599 newmem = public_mALLOc(bytes);
3600 if (newmem == 0) return 0; /* propagate failure */
3601 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
3602 munmap_chunk(oldp);
3603 return newmem;
3605 #endif
3607 ar_ptr = arena_for_chunk(oldp);
3608 #if THREAD_STATS
3609 if(!mutex_trylock(&ar_ptr->mutex))
3610 ++(ar_ptr->stat_lock_direct);
3611 else {
3612 (void)mutex_lock(&ar_ptr->mutex);
3613 ++(ar_ptr->stat_lock_wait);
3615 #else
3616 (void)mutex_lock(&ar_ptr->mutex);
3617 #endif
3619 #ifndef NO_THREADS
3620 /* As in malloc(), remember this arena for the next allocation. */
3621 tsd_setspecific(arena_key, (Void_t *)ar_ptr);
3622 #endif
3624 newp = _int_realloc(ar_ptr, oldmem, bytes);
3626 (void)mutex_unlock(&ar_ptr->mutex);
3627 assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
3628 ar_ptr == arena_for_chunk(mem2chunk(newp)));
3630 if (newp == NULL)
3632 /* Try harder to allocate memory in other arenas. */
3633 newp = public_mALLOc(bytes);
3634 if (newp != NULL)
3636 MALLOC_COPY (newp, oldmem, oldsize - 2 * SIZE_SZ);
3637 #if THREAD_STATS
3638 if(!mutex_trylock(&ar_ptr->mutex))
3639 ++(ar_ptr->stat_lock_direct);
3640 else {
3641 (void)mutex_lock(&ar_ptr->mutex);
3642 ++(ar_ptr->stat_lock_wait);
3644 #else
3645 (void)mutex_lock(&ar_ptr->mutex);
3646 #endif
3647 _int_free(ar_ptr, oldmem);
3648 (void)mutex_unlock(&ar_ptr->mutex);
3652 return newp;
3654 #ifdef libc_hidden_def
3655 libc_hidden_def (public_rEALLOc)
3656 #endif
3658 Void_t*
3659 public_mEMALIGn(size_t alignment, size_t bytes)
3661 mstate ar_ptr;
3662 Void_t *p;
3664 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3665 __const __malloc_ptr_t)) =
3666 __memalign_hook;
3667 if (hook != NULL)
3668 return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
3670 /* If need less alignment than we give anyway, just relay to malloc */
3671 if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes);
3673 /* Otherwise, ensure that it is at least a minimum chunk size */
3674 if (alignment < MINSIZE) alignment = MINSIZE;
3676 arena_get(ar_ptr, bytes + alignment + MINSIZE);
3677 if(!ar_ptr)
3678 return 0;
3679 p = _int_memalign(ar_ptr, alignment, bytes);
3680 (void)mutex_unlock(&ar_ptr->mutex);
3681 if(!p) {
3682 /* Maybe the failure is due to running out of mmapped areas. */
3683 if(ar_ptr != &main_arena) {
3684 (void)mutex_lock(&main_arena.mutex);
3685 p = _int_memalign(&main_arena, alignment, bytes);
3686 (void)mutex_unlock(&main_arena.mutex);
3687 } else {
3688 #if USE_ARENAS
3689 /* ... or sbrk() has failed and there is still a chance to mmap() */
3690 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3691 if(ar_ptr) {
3692 p = _int_memalign(ar_ptr, alignment, bytes);
3693 (void)mutex_unlock(&ar_ptr->mutex);
3695 #endif
3698 assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3699 ar_ptr == arena_for_chunk(mem2chunk(p)));
3700 return p;
3702 #ifdef libc_hidden_def
3703 libc_hidden_def (public_mEMALIGn)
3704 #endif
3706 Void_t*
3707 public_vALLOc(size_t bytes)
3709 mstate ar_ptr;
3710 Void_t *p;
3712 if(__malloc_initialized < 0)
3713 ptmalloc_init ();
3715 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3716 __const __malloc_ptr_t)) =
3717 __memalign_hook;
3718 if (hook != NULL)
3719 return (*hook)(mp_.pagesize, bytes, RETURN_ADDRESS (0));
3721 arena_get(ar_ptr, bytes + mp_.pagesize + MINSIZE);
3722 if(!ar_ptr)
3723 return 0;
3724 p = _int_valloc(ar_ptr, bytes);
3725 (void)mutex_unlock(&ar_ptr->mutex);
3726 return p;
3729 Void_t*
3730 public_pVALLOc(size_t bytes)
3732 mstate ar_ptr;
3733 Void_t *p;
3735 if(__malloc_initialized < 0)
3736 ptmalloc_init ();
3738 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3739 __const __malloc_ptr_t)) =
3740 __memalign_hook;
3741 if (hook != NULL)
3742 return (*hook)(mp_.pagesize,
3743 (bytes + mp_.pagesize - 1) & ~(mp_.pagesize - 1),
3744 RETURN_ADDRESS (0));
3746 arena_get(ar_ptr, bytes + 2*mp_.pagesize + MINSIZE);
3747 p = _int_pvalloc(ar_ptr, bytes);
3748 (void)mutex_unlock(&ar_ptr->mutex);
3749 return p;
3752 Void_t*
3753 public_cALLOc(size_t n, size_t elem_size)
3755 mstate av;
3756 mchunkptr oldtop, p;
3757 INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
3758 Void_t* mem;
3759 unsigned long clearsize;
3760 unsigned long nclears;
3761 INTERNAL_SIZE_T* d;
3762 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, __const __malloc_ptr_t)) =
3763 __malloc_hook;
3765 /* size_t is unsigned so the behavior on overflow is defined. */
3766 bytes = n * elem_size;
3767 #define HALF_INTERNAL_SIZE_T \
3768 (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2))
3769 if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) {
3770 if (elem_size != 0 && bytes / elem_size != n) {
3771 MALLOC_FAILURE_ACTION;
3772 return 0;
3776 if (hook != NULL) {
3777 sz = bytes;
3778 mem = (*hook)(sz, RETURN_ADDRESS (0));
3779 if(mem == 0)
3780 return 0;
3781 #ifdef HAVE_MEMCPY
3782 return memset(mem, 0, sz);
3783 #else
3784 while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
3785 return mem;
3786 #endif
3789 sz = bytes;
3791 arena_get(av, sz);
3792 if(!av)
3793 return 0;
3795 /* Check if we hand out the top chunk, in which case there may be no
3796 need to clear. */
3797 #if MORECORE_CLEARS
3798 oldtop = top(av);
3799 oldtopsize = chunksize(top(av));
3800 #if MORECORE_CLEARS < 2
3801 /* Only newly allocated memory is guaranteed to be cleared. */
3802 if (av == &main_arena &&
3803 oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
3804 oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
3805 #endif
3806 #endif
3807 mem = _int_malloc(av, sz);
3809 /* Only clearing follows, so we can unlock early. */
3810 (void)mutex_unlock(&av->mutex);
3812 assert(!mem || chunk_is_mmapped(mem2chunk(mem)) ||
3813 av == arena_for_chunk(mem2chunk(mem)));
3815 if (mem == 0) {
3816 /* Maybe the failure is due to running out of mmapped areas. */
3817 if(av != &main_arena) {
3818 (void)mutex_lock(&main_arena.mutex);
3819 mem = _int_malloc(&main_arena, sz);
3820 (void)mutex_unlock(&main_arena.mutex);
3821 } else {
3822 #if USE_ARENAS
3823 /* ... or sbrk() has failed and there is still a chance to mmap() */
3824 (void)mutex_lock(&main_arena.mutex);
3825 av = arena_get2(av->next ? av : 0, sz);
3826 (void)mutex_unlock(&main_arena.mutex);
3827 if(av) {
3828 mem = _int_malloc(av, sz);
3829 (void)mutex_unlock(&av->mutex);
3831 #endif
3833 if (mem == 0) return 0;
3835 p = mem2chunk(mem);
3837 /* Two optional cases in which clearing not necessary */
3838 #if HAVE_MMAP
3839 if (chunk_is_mmapped (p))
3841 if (__builtin_expect (perturb_byte, 0))
3842 MALLOC_ZERO (mem, sz);
3843 return mem;
3845 #endif
3847 csz = chunksize(p);
3849 #if MORECORE_CLEARS
3850 if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) {
3851 /* clear only the bytes from non-freshly-sbrked memory */
3852 csz = oldtopsize;
3854 #endif
3856 /* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that
3857 contents have an odd number of INTERNAL_SIZE_T-sized words;
3858 minimally 3. */
3859 d = (INTERNAL_SIZE_T*)mem;
3860 clearsize = csz - SIZE_SZ;
3861 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
3862 assert(nclears >= 3);
3864 if (nclears > 9)
3865 MALLOC_ZERO(d, clearsize);
3867 else {
3868 *(d+0) = 0;
3869 *(d+1) = 0;
3870 *(d+2) = 0;
3871 if (nclears > 4) {
3872 *(d+3) = 0;
3873 *(d+4) = 0;
3874 if (nclears > 6) {
3875 *(d+5) = 0;
3876 *(d+6) = 0;
3877 if (nclears > 8) {
3878 *(d+7) = 0;
3879 *(d+8) = 0;
3885 return mem;
3888 #ifndef _LIBC
3890 Void_t**
3891 public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
3893 mstate ar_ptr;
3894 Void_t** m;
3896 arena_get(ar_ptr, n*elem_size);
3897 if(!ar_ptr)
3898 return 0;
3900 m = _int_icalloc(ar_ptr, n, elem_size, chunks);
3901 (void)mutex_unlock(&ar_ptr->mutex);
3902 return m;
3905 Void_t**
3906 public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
3908 mstate ar_ptr;
3909 Void_t** m;
3911 arena_get(ar_ptr, 0);
3912 if(!ar_ptr)
3913 return 0;
3915 m = _int_icomalloc(ar_ptr, n, sizes, chunks);
3916 (void)mutex_unlock(&ar_ptr->mutex);
3917 return m;
3920 void
3921 public_cFREe(Void_t* m)
3923 public_fREe(m);
3926 #endif /* _LIBC */
3929 public_mTRIm(size_t s)
3931 int result;
3933 if(__malloc_initialized < 0)
3934 ptmalloc_init ();
3935 (void)mutex_lock(&main_arena.mutex);
3936 result = mTRIm(s);
3937 (void)mutex_unlock(&main_arena.mutex);
3938 return result;
3941 size_t
3942 public_mUSABLe(Void_t* m)
3944 size_t result;
3946 result = mUSABLe(m);
3947 return result;
3950 void
3951 public_mSTATs()
3953 mSTATs();
3956 struct mallinfo public_mALLINFo()
3958 struct mallinfo m;
3960 if(__malloc_initialized < 0)
3961 ptmalloc_init ();
3962 (void)mutex_lock(&main_arena.mutex);
3963 m = mALLINFo(&main_arena);
3964 (void)mutex_unlock(&main_arena.mutex);
3965 return m;
3969 public_mALLOPt(int p, int v)
3971 int result;
3972 result = mALLOPt(p, v);
3973 return result;
3977 ------------------------------ malloc ------------------------------
3980 Void_t*
3981 _int_malloc(mstate av, size_t bytes)
3983 INTERNAL_SIZE_T nb; /* normalized request size */
3984 unsigned int idx; /* associated bin index */
3985 mbinptr bin; /* associated bin */
3986 mfastbinptr* fb; /* associated fastbin */
3988 mchunkptr victim; /* inspected/selected chunk */
3989 INTERNAL_SIZE_T size; /* its size */
3990 int victim_index; /* its bin index */
3992 mchunkptr remainder; /* remainder from a split */
3993 unsigned long remainder_size; /* its size */
3995 unsigned int block; /* bit map traverser */
3996 unsigned int bit; /* bit map traverser */
3997 unsigned int map; /* current word of binmap */
3999 mchunkptr fwd; /* misc temp for linking */
4000 mchunkptr bck; /* misc temp for linking */
4003 Convert request size to internal form by adding SIZE_SZ bytes
4004 overhead plus possibly more to obtain necessary alignment and/or
4005 to obtain a size of at least MINSIZE, the smallest allocatable
4006 size. Also, checked_request2size traps (returning 0) request sizes
4007 that are so large that they wrap around zero when padded and
4008 aligned.
4011 checked_request2size(bytes, nb);
4014 If the size qualifies as a fastbin, first check corresponding bin.
4015 This code is safe to execute even if av is not yet initialized, so we
4016 can try it without checking, which saves some time on this fast path.
4019 if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
4020 long int idx = fastbin_index(nb);
4021 fb = &(av->fastbins[idx]);
4022 if ( (victim = *fb) != 0) {
4023 if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
4024 malloc_printerr (check_action, "malloc(): memory corruption (fast)",
4025 chunk2mem (victim));
4026 *fb = victim->fd;
4027 check_remalloced_chunk(av, victim, nb);
4028 void *p = chunk2mem(victim);
4029 if (__builtin_expect (perturb_byte, 0))
4030 alloc_perturb (p, bytes);
4031 return p;
4036 If a small request, check regular bin. Since these "smallbins"
4037 hold one size each, no searching within bins is necessary.
4038 (For a large request, we need to wait until unsorted chunks are
4039 processed to find best fit. But for small ones, fits are exact
4040 anyway, so we can check now, which is faster.)
4043 if (in_smallbin_range(nb)) {
4044 idx = smallbin_index(nb);
4045 bin = bin_at(av,idx);
4047 if ( (victim = last(bin)) != bin) {
4048 if (victim == 0) /* initialization check */
4049 malloc_consolidate(av);
4050 else {
4051 bck = victim->bk;
4052 set_inuse_bit_at_offset(victim, nb);
4053 bin->bk = bck;
4054 bck->fd = bin;
4056 if (av != &main_arena)
4057 victim->size |= NON_MAIN_ARENA;
4058 check_malloced_chunk(av, victim, nb);
4059 void *p = chunk2mem(victim);
4060 if (__builtin_expect (perturb_byte, 0))
4061 alloc_perturb (p, bytes);
4062 return p;
4068 If this is a large request, consolidate fastbins before continuing.
4069 While it might look excessive to kill all fastbins before
4070 even seeing if there is space available, this avoids
4071 fragmentation problems normally associated with fastbins.
4072 Also, in practice, programs tend to have runs of either small or
4073 large requests, but less often mixtures, so consolidation is not
4074 invoked all that often in most programs. And the programs that
4075 it is called frequently in otherwise tend to fragment.
4078 else {
4079 idx = largebin_index(nb);
4080 if (have_fastchunks(av))
4081 malloc_consolidate(av);
4085 Process recently freed or remaindered chunks, taking one only if
4086 it is exact fit, or, if this a small request, the chunk is remainder from
4087 the most recent non-exact fit. Place other traversed chunks in
4088 bins. Note that this step is the only place in any routine where
4089 chunks are placed in bins.
4091 The outer loop here is needed because we might not realize until
4092 near the end of malloc that we should have consolidated, so must
4093 do so and retry. This happens at most once, and only when we would
4094 otherwise need to expand memory to service a "small" request.
4097 for(;;) {
4099 int iters = 0;
4100 bool any_larger = false;
4101 while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
4102 bck = victim->bk;
4103 if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
4104 || __builtin_expect (victim->size > av->system_mem, 0))
4105 malloc_printerr (check_action, "malloc(): memory corruption",
4106 chunk2mem (victim));
4107 size = chunksize(victim);
4110 If a small request, try to use last remainder if it is the
4111 only chunk in unsorted bin. This helps promote locality for
4112 runs of consecutive small requests. This is the only
4113 exception to best-fit, and applies only when there is
4114 no exact fit for a small chunk.
4117 if (in_smallbin_range(nb) &&
4118 bck == unsorted_chunks(av) &&
4119 victim == av->last_remainder &&
4120 (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4122 /* split and reattach remainder */
4123 remainder_size = size - nb;
4124 remainder = chunk_at_offset(victim, nb);
4125 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
4126 av->last_remainder = remainder;
4127 remainder->bk = remainder->fd = unsorted_chunks(av);
4129 set_head(victim, nb | PREV_INUSE |
4130 (av != &main_arena ? NON_MAIN_ARENA : 0));
4131 set_head(remainder, remainder_size | PREV_INUSE);
4132 set_foot(remainder, remainder_size);
4134 check_malloced_chunk(av, victim, nb);
4135 void *p = chunk2mem(victim);
4136 if (__builtin_expect (perturb_byte, 0))
4137 alloc_perturb (p, bytes);
4138 return p;
4141 /* remove from unsorted list */
4142 unsorted_chunks(av)->bk = bck;
4143 bck->fd = unsorted_chunks(av);
4145 /* Take now instead of binning if exact fit */
4147 if (size == nb) {
4148 set_inuse_bit_at_offset(victim, size);
4149 if (av != &main_arena)
4150 victim->size |= NON_MAIN_ARENA;
4151 check_malloced_chunk(av, victim, nb);
4152 void *p = chunk2mem(victim);
4153 if (__builtin_expect (perturb_byte, 0))
4154 alloc_perturb (p, bytes);
4155 return p;
4158 /* place chunk in bin */
4160 if (in_smallbin_range(size)) {
4161 victim_index = smallbin_index(size);
4162 bck = bin_at(av, victim_index);
4163 fwd = bck->fd;
4165 else {
4166 victim_index = largebin_index(size);
4167 bck = bin_at(av, victim_index);
4168 fwd = bck->fd;
4170 /* maintain large bins in sorted order */
4171 if (fwd != bck) {
4172 /* Or with inuse bit to speed comparisons */
4173 size |= PREV_INUSE;
4174 /* if smaller than smallest, bypass loop below */
4175 assert((bck->bk->size & NON_MAIN_ARENA) == 0);
4176 if ((unsigned long)(size) <= (unsigned long)(bck->bk->size)) {
4177 fwd = bck;
4178 bck = bck->bk;
4180 else {
4181 assert((fwd->size & NON_MAIN_ARENA) == 0);
4182 while ((unsigned long)(size) < (unsigned long)(fwd->size)) {
4183 fwd = fwd->fd;
4184 assert((fwd->size & NON_MAIN_ARENA) == 0);
4186 bck = fwd->bk;
4191 mark_bin(av, victim_index);
4192 victim->bk = bck;
4193 victim->fd = fwd;
4194 fwd->bk = victim;
4195 bck->fd = victim;
4197 if (size >= nb + MINSIZE)
4198 any_larger = true;
4199 #define MAX_ITERS 10000
4200 if (++iters >= MAX_ITERS)
4201 break;
4205 If a large request, scan through the chunks of current bin in
4206 sorted order to find smallest that fits. This is the only step
4207 where an unbounded number of chunks might be scanned without doing
4208 anything useful with them. However the lists tend to be short.
4211 if (!in_smallbin_range(nb)) {
4212 bin = bin_at(av, idx);
4214 /* skip scan if empty or largest chunk is too small */
4215 if ((victim = last(bin)) != bin &&
4216 (unsigned long)(first(bin)->size) >= (unsigned long)(nb)) {
4218 while (((unsigned long)(size = chunksize(victim)) <
4219 (unsigned long)(nb)))
4220 victim = victim->bk;
4222 remainder_size = size - nb;
4223 unlink(victim, bck, fwd);
4225 /* Exhaust */
4226 if (remainder_size < MINSIZE) {
4227 set_inuse_bit_at_offset(victim, size);
4228 if (av != &main_arena)
4229 victim->size |= NON_MAIN_ARENA;
4231 /* Split */
4232 else {
4233 remainder = chunk_at_offset(victim, nb);
4234 /* We cannot assume the unsorted list is empty and therefore
4235 have to perform a complete insert here. */
4236 bck = unsorted_chunks(av);
4237 fwd = bck->fd;
4238 remainder->bk = bck;
4239 remainder->fd = fwd;
4240 bck->fd = remainder;
4241 fwd->bk = remainder;
4242 set_head(victim, nb | PREV_INUSE |
4243 (av != &main_arena ? NON_MAIN_ARENA : 0));
4244 set_head(remainder, remainder_size | PREV_INUSE);
4245 set_foot(remainder, remainder_size);
4247 check_malloced_chunk(av, victim, nb);
4248 void *p = chunk2mem(victim);
4249 if (__builtin_expect (perturb_byte, 0))
4250 alloc_perturb (p, bytes);
4251 return p;
4256 Search for a chunk by scanning bins, starting with next largest
4257 bin. This search is strictly by best-fit; i.e., the smallest
4258 (with ties going to approximately the least recently used) chunk
4259 that fits is selected.
4261 The bitmap avoids needing to check that most blocks are nonempty.
4262 The particular case of skipping all bins during warm-up phases
4263 when no chunks have been returned yet is faster than it might look.
4266 ++idx;
4267 bin = bin_at(av,idx);
4268 block = idx2block(idx);
4269 map = av->binmap[block];
4270 bit = idx2bit(idx);
4272 for (;;) {
4274 /* Skip rest of block if there are no more set bits in this block. */
4275 if (bit > map || bit == 0) {
4276 do {
4277 if (++block >= BINMAPSIZE) /* out of bins */
4278 goto use_top;
4279 } while ( (map = av->binmap[block]) == 0);
4281 bin = bin_at(av, (block << BINMAPSHIFT));
4282 bit = 1;
4285 /* Advance to bin with set bit. There must be one. */
4286 while ((bit & map) == 0) {
4287 bin = next_bin(bin);
4288 bit <<= 1;
4289 assert(bit != 0);
4292 /* Inspect the bin. It is likely to be non-empty */
4293 victim = last(bin);
4295 /* If a false alarm (empty bin), clear the bit. */
4296 if (victim == bin) {
4297 av->binmap[block] = map &= ~bit; /* Write through */
4298 bin = next_bin(bin);
4299 bit <<= 1;
4302 else {
4303 size = chunksize(victim);
4305 /* We know the first chunk in this bin is big enough to use. */
4306 assert((unsigned long)(size) >= (unsigned long)(nb));
4308 remainder_size = size - nb;
4310 /* unlink */
4311 bck = victim->bk;
4312 bin->bk = bck;
4313 bck->fd = bin;
4315 /* Exhaust */
4316 if (remainder_size < MINSIZE) {
4317 set_inuse_bit_at_offset(victim, size);
4318 if (av != &main_arena)
4319 victim->size |= NON_MAIN_ARENA;
4322 /* Split */
4323 else {
4324 remainder = chunk_at_offset(victim, nb);
4326 /* We cannot assume the unsorted list is empty and therefore
4327 have to perform a complete insert here. */
4328 bck = unsorted_chunks(av);
4329 fwd = bck->fd;
4330 remainder->bk = bck;
4331 remainder->fd = fwd;
4332 bck->fd = remainder;
4333 fwd->bk = remainder;
4335 /* advertise as last remainder */
4336 if (in_smallbin_range(nb))
4337 av->last_remainder = remainder;
4339 set_head(victim, nb | PREV_INUSE |
4340 (av != &main_arena ? NON_MAIN_ARENA : 0));
4341 set_head(remainder, remainder_size | PREV_INUSE);
4342 set_foot(remainder, remainder_size);
4344 check_malloced_chunk(av, victim, nb);
4345 void *p = chunk2mem(victim);
4346 if (__builtin_expect (perturb_byte, 0))
4347 alloc_perturb (p, bytes);
4348 return p;
4352 use_top:
4354 If large enough, split off the chunk bordering the end of memory
4355 (held in av->top). Note that this is in accord with the best-fit
4356 search rule. In effect, av->top is treated as larger (and thus
4357 less well fitting) than any other available chunk since it can
4358 be extended to be as large as necessary (up to system
4359 limitations).
4361 We require that av->top always exists (i.e., has size >=
4362 MINSIZE) after initialization, so if it would otherwise be
4363 exhuasted by current request, it is replenished. (The main
4364 reason for ensuring it exists is that we may need MINSIZE space
4365 to put in fenceposts in sysmalloc.)
4368 victim = av->top;
4369 size = chunksize(victim);
4371 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
4372 remainder_size = size - nb;
4373 remainder = chunk_at_offset(victim, nb);
4374 av->top = remainder;
4375 set_head(victim, nb | PREV_INUSE |
4376 (av != &main_arena ? NON_MAIN_ARENA : 0));
4377 set_head(remainder, remainder_size | PREV_INUSE);
4379 check_malloced_chunk(av, victim, nb);
4380 void *p = chunk2mem(victim);
4381 if (__builtin_expect (perturb_byte, 0))
4382 alloc_perturb (p, bytes);
4383 return p;
4387 If there is space available in fastbins, consolidate and retry,
4388 to possibly avoid expanding memory. This can occur only if nb is
4389 in smallbin range so we didn't consolidate upon entry.
4392 else if (have_fastchunks(av)) {
4393 assert(in_smallbin_range(nb));
4394 malloc_consolidate(av);
4395 idx = smallbin_index(nb); /* restore original bin index */
4399 Otherwise, relay to handle system-dependent cases
4401 else {
4402 void *p = sYSMALLOc(nb, av);
4403 if (__builtin_expect (perturb_byte, 0))
4404 alloc_perturb (p, bytes);
4405 return p;
4411 ------------------------------ free ------------------------------
4414 void
4415 _int_free(mstate av, Void_t* mem)
4417 mchunkptr p; /* chunk corresponding to mem */
4418 INTERNAL_SIZE_T size; /* its size */
4419 mfastbinptr* fb; /* associated fastbin */
4420 mchunkptr nextchunk; /* next contiguous chunk */
4421 INTERNAL_SIZE_T nextsize; /* its size */
4422 int nextinuse; /* true if nextchunk is used */
4423 INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
4424 mchunkptr bck; /* misc temp for linking */
4425 mchunkptr fwd; /* misc temp for linking */
4427 const char *errstr = NULL;
4429 p = mem2chunk(mem);
4430 size = chunksize(p);
4432 /* Little security check which won't hurt performance: the
4433 allocator never wrapps around at the end of the address space.
4434 Therefore we can exclude some size values which might appear
4435 here by accident or by "design" from some intruder. */
4436 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
4437 || __builtin_expect (misaligned_chunk (p), 0))
4439 errstr = "free(): invalid pointer";
4440 errout:
4441 malloc_printerr (check_action, errstr, mem);
4442 return;
4444 /* We know that each chunk is at least MINSIZE bytes in size. */
4445 if (__builtin_expect (size < MINSIZE, 0))
4447 errstr = "free(): invalid size";
4448 goto errout;
4451 check_inuse_chunk(av, p);
4454 If eligible, place chunk on a fastbin so it can be found
4455 and used quickly in malloc.
4458 if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
4460 #if TRIM_FASTBINS
4462 If TRIM_FASTBINS set, don't place chunks
4463 bordering top into fastbins
4465 && (chunk_at_offset(p, size) != av->top)
4466 #endif
4469 if (__builtin_expect (chunk_at_offset (p, size)->size <= 2 * SIZE_SZ, 0)
4470 || __builtin_expect (chunksize (chunk_at_offset (p, size))
4471 >= av->system_mem, 0))
4473 errstr = "free(): invalid next size (fast)";
4474 goto errout;
4477 set_fastchunks(av);
4478 fb = &(av->fastbins[fastbin_index(size)]);
4479 /* Another simple check: make sure the top of the bin is not the
4480 record we are going to add (i.e., double free). */
4481 if (__builtin_expect (*fb == p, 0))
4483 errstr = "double free or corruption (fasttop)";
4484 goto errout;
4487 if (__builtin_expect (perturb_byte, 0))
4488 free_perturb (mem, size - SIZE_SZ);
4490 p->fd = *fb;
4491 *fb = p;
4495 Consolidate other non-mmapped chunks as they arrive.
4498 else if (!chunk_is_mmapped(p)) {
4499 nextchunk = chunk_at_offset(p, size);
4501 /* Lightweight tests: check whether the block is already the
4502 top block. */
4503 if (__builtin_expect (p == av->top, 0))
4505 errstr = "double free or corruption (top)";
4506 goto errout;
4508 /* Or whether the next chunk is beyond the boundaries of the arena. */
4509 if (__builtin_expect (contiguous (av)
4510 && (char *) nextchunk
4511 >= ((char *) av->top + chunksize(av->top)), 0))
4513 errstr = "double free or corruption (out)";
4514 goto errout;
4516 /* Or whether the block is actually not marked used. */
4517 if (__builtin_expect (!prev_inuse(nextchunk), 0))
4519 errstr = "double free or corruption (!prev)";
4520 goto errout;
4523 nextsize = chunksize(nextchunk);
4524 if (__builtin_expect (nextchunk->size <= 2 * SIZE_SZ, 0)
4525 || __builtin_expect (nextsize >= av->system_mem, 0))
4527 errstr = "free(): invalid next size (normal)";
4528 goto errout;
4531 if (__builtin_expect (perturb_byte, 0))
4532 free_perturb (mem, size - SIZE_SZ);
4534 /* consolidate backward */
4535 if (!prev_inuse(p)) {
4536 prevsize = p->prev_size;
4537 size += prevsize;
4538 p = chunk_at_offset(p, -((long) prevsize));
4539 unlink(p, bck, fwd);
4542 if (nextchunk != av->top) {
4543 /* get and clear inuse bit */
4544 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4546 /* consolidate forward */
4547 if (!nextinuse) {
4548 unlink(nextchunk, bck, fwd);
4549 size += nextsize;
4550 } else
4551 clear_inuse_bit_at_offset(nextchunk, 0);
4554 Place the chunk in unsorted chunk list. Chunks are
4555 not placed into regular bins until after they have
4556 been given one chance to be used in malloc.
4559 bck = unsorted_chunks(av);
4560 fwd = bck->fd;
4561 p->bk = bck;
4562 p->fd = fwd;
4563 bck->fd = p;
4564 fwd->bk = p;
4566 set_head(p, size | PREV_INUSE);
4567 set_foot(p, size);
4569 check_free_chunk(av, p);
4573 If the chunk borders the current high end of memory,
4574 consolidate into top
4577 else {
4578 size += nextsize;
4579 set_head(p, size | PREV_INUSE);
4580 av->top = p;
4581 check_chunk(av, p);
4585 If freeing a large space, consolidate possibly-surrounding
4586 chunks. Then, if the total unused topmost memory exceeds trim
4587 threshold, ask malloc_trim to reduce top.
4589 Unless max_fast is 0, we don't know if there are fastbins
4590 bordering top, so we cannot tell for sure whether threshold
4591 has been reached unless fastbins are consolidated. But we
4592 don't want to consolidate on each free. As a compromise,
4593 consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
4594 is reached.
4597 if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
4598 if (have_fastchunks(av))
4599 malloc_consolidate(av);
4601 if (av == &main_arena) {
4602 #ifndef MORECORE_CANNOT_TRIM
4603 if ((unsigned long)(chunksize(av->top)) >=
4604 (unsigned long)(mp_.trim_threshold))
4605 sYSTRIm(mp_.top_pad, av);
4606 #endif
4607 } else {
4608 /* Always try heap_trim(), even if the top chunk is not
4609 large, because the corresponding heap might go away. */
4610 heap_info *heap = heap_for_ptr(top(av));
4612 assert(heap->ar_ptr == av);
4613 heap_trim(heap, mp_.top_pad);
4619 If the chunk was allocated via mmap, release via munmap(). Note
4620 that if HAVE_MMAP is false but chunk_is_mmapped is true, then
4621 user must have overwritten memory. There's nothing we can do to
4622 catch this error unless MALLOC_DEBUG is set, in which case
4623 check_inuse_chunk (above) will have triggered error.
4626 else {
4627 #if HAVE_MMAP
4628 munmap_chunk (p);
4629 #endif
4634 ------------------------- malloc_consolidate -------------------------
4636 malloc_consolidate is a specialized version of free() that tears
4637 down chunks held in fastbins. Free itself cannot be used for this
4638 purpose since, among other things, it might place chunks back onto
4639 fastbins. So, instead, we need to use a minor variant of the same
4640 code.
4642 Also, because this routine needs to be called the first time through
4643 malloc anyway, it turns out to be the perfect place to trigger
4644 initialization code.
4647 #if __STD_C
4648 static void malloc_consolidate(mstate av)
4649 #else
4650 static void malloc_consolidate(av) mstate av;
4651 #endif
4653 mfastbinptr* fb; /* current fastbin being consolidated */
4654 mfastbinptr* maxfb; /* last fastbin (for loop control) */
4655 mchunkptr p; /* current chunk being consolidated */
4656 mchunkptr nextp; /* next chunk to consolidate */
4657 mchunkptr unsorted_bin; /* bin header */
4658 mchunkptr first_unsorted; /* chunk to link to */
4660 /* These have same use as in free() */
4661 mchunkptr nextchunk;
4662 INTERNAL_SIZE_T size;
4663 INTERNAL_SIZE_T nextsize;
4664 INTERNAL_SIZE_T prevsize;
4665 int nextinuse;
4666 mchunkptr bck;
4667 mchunkptr fwd;
4670 If max_fast is 0, we know that av hasn't
4671 yet been initialized, in which case do so below
4674 if (get_max_fast () != 0) {
4675 clear_fastchunks(av);
4677 unsorted_bin = unsorted_chunks(av);
4680 Remove each chunk from fast bin and consolidate it, placing it
4681 then in unsorted bin. Among other reasons for doing this,
4682 placing in unsorted bin avoids needing to calculate actual bins
4683 until malloc is sure that chunks aren't immediately going to be
4684 reused anyway.
4687 maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
4688 fb = &(av->fastbins[0]);
4689 do {
4690 if ( (p = *fb) != 0) {
4691 *fb = 0;
4693 do {
4694 check_inuse_chunk(av, p);
4695 nextp = p->fd;
4697 /* Slightly streamlined version of consolidation code in free() */
4698 size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
4699 nextchunk = chunk_at_offset(p, size);
4700 nextsize = chunksize(nextchunk);
4702 if (!prev_inuse(p)) {
4703 prevsize = p->prev_size;
4704 size += prevsize;
4705 p = chunk_at_offset(p, -((long) prevsize));
4706 unlink(p, bck, fwd);
4709 if (nextchunk != av->top) {
4710 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4712 if (!nextinuse) {
4713 size += nextsize;
4714 unlink(nextchunk, bck, fwd);
4715 } else
4716 clear_inuse_bit_at_offset(nextchunk, 0);
4718 first_unsorted = unsorted_bin->fd;
4719 unsorted_bin->fd = p;
4720 first_unsorted->bk = p;
4722 set_head(p, size | PREV_INUSE);
4723 p->bk = unsorted_bin;
4724 p->fd = first_unsorted;
4725 set_foot(p, size);
4728 else {
4729 size += nextsize;
4730 set_head(p, size | PREV_INUSE);
4731 av->top = p;
4734 } while ( (p = nextp) != 0);
4737 } while (fb++ != maxfb);
4739 else {
4740 malloc_init_state(av);
4741 check_malloc_state(av);
4746 ------------------------------ realloc ------------------------------
4749 Void_t*
4750 _int_realloc(mstate av, Void_t* oldmem, size_t bytes)
4752 INTERNAL_SIZE_T nb; /* padded request size */
4754 mchunkptr oldp; /* chunk corresponding to oldmem */
4755 INTERNAL_SIZE_T oldsize; /* its size */
4757 mchunkptr newp; /* chunk to return */
4758 INTERNAL_SIZE_T newsize; /* its size */
4759 Void_t* newmem; /* corresponding user mem */
4761 mchunkptr next; /* next contiguous chunk after oldp */
4763 mchunkptr remainder; /* extra space at end of newp */
4764 unsigned long remainder_size; /* its size */
4766 mchunkptr bck; /* misc temp for linking */
4767 mchunkptr fwd; /* misc temp for linking */
4769 unsigned long copysize; /* bytes to copy */
4770 unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
4771 INTERNAL_SIZE_T* s; /* copy source */
4772 INTERNAL_SIZE_T* d; /* copy destination */
4774 const char *errstr = NULL;
4777 checked_request2size(bytes, nb);
4779 oldp = mem2chunk(oldmem);
4780 oldsize = chunksize(oldp);
4782 /* Simple tests for old block integrity. */
4783 if (__builtin_expect (misaligned_chunk (oldp), 0))
4785 errstr = "realloc(): invalid pointer";
4786 errout:
4787 malloc_printerr (check_action, errstr, oldmem);
4788 return NULL;
4790 if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0)
4791 || __builtin_expect (oldsize >= av->system_mem, 0))
4793 errstr = "realloc(): invalid old size";
4794 goto errout;
4797 check_inuse_chunk(av, oldp);
4799 if (!chunk_is_mmapped(oldp)) {
4801 next = chunk_at_offset(oldp, oldsize);
4802 INTERNAL_SIZE_T nextsize = chunksize(next);
4803 if (__builtin_expect (next->size <= 2 * SIZE_SZ, 0)
4804 || __builtin_expect (nextsize >= av->system_mem, 0))
4806 errstr = "realloc(): invalid next size";
4807 goto errout;
4810 if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
4811 /* already big enough; split below */
4812 newp = oldp;
4813 newsize = oldsize;
4816 else {
4817 /* Try to expand forward into top */
4818 if (next == av->top &&
4819 (unsigned long)(newsize = oldsize + nextsize) >=
4820 (unsigned long)(nb + MINSIZE)) {
4821 set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4822 av->top = chunk_at_offset(oldp, nb);
4823 set_head(av->top, (newsize - nb) | PREV_INUSE);
4824 check_inuse_chunk(av, oldp);
4825 return chunk2mem(oldp);
4828 /* Try to expand forward into next chunk; split off remainder below */
4829 else if (next != av->top &&
4830 !inuse(next) &&
4831 (unsigned long)(newsize = oldsize + nextsize) >=
4832 (unsigned long)(nb)) {
4833 newp = oldp;
4834 unlink(next, bck, fwd);
4837 /* allocate, copy, free */
4838 else {
4839 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4840 if (newmem == 0)
4841 return 0; /* propagate failure */
4843 newp = mem2chunk(newmem);
4844 newsize = chunksize(newp);
4847 Avoid copy if newp is next chunk after oldp.
4849 if (newp == next) {
4850 newsize += oldsize;
4851 newp = oldp;
4853 else {
4855 Unroll copy of <= 36 bytes (72 if 8byte sizes)
4856 We know that contents have an odd number of
4857 INTERNAL_SIZE_T-sized words; minimally 3.
4860 copysize = oldsize - SIZE_SZ;
4861 s = (INTERNAL_SIZE_T*)(oldmem);
4862 d = (INTERNAL_SIZE_T*)(newmem);
4863 ncopies = copysize / sizeof(INTERNAL_SIZE_T);
4864 assert(ncopies >= 3);
4866 if (ncopies > 9)
4867 MALLOC_COPY(d, s, copysize);
4869 else {
4870 *(d+0) = *(s+0);
4871 *(d+1) = *(s+1);
4872 *(d+2) = *(s+2);
4873 if (ncopies > 4) {
4874 *(d+3) = *(s+3);
4875 *(d+4) = *(s+4);
4876 if (ncopies > 6) {
4877 *(d+5) = *(s+5);
4878 *(d+6) = *(s+6);
4879 if (ncopies > 8) {
4880 *(d+7) = *(s+7);
4881 *(d+8) = *(s+8);
4887 _int_free(av, oldmem);
4888 check_inuse_chunk(av, newp);
4889 return chunk2mem(newp);
4894 /* If possible, free extra space in old or extended chunk */
4896 assert((unsigned long)(newsize) >= (unsigned long)(nb));
4898 remainder_size = newsize - nb;
4900 if (remainder_size < MINSIZE) { /* not enough extra to split off */
4901 set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
4902 set_inuse_bit_at_offset(newp, newsize);
4904 else { /* split remainder */
4905 remainder = chunk_at_offset(newp, nb);
4906 set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4907 set_head(remainder, remainder_size | PREV_INUSE |
4908 (av != &main_arena ? NON_MAIN_ARENA : 0));
4909 /* Mark remainder as inuse so free() won't complain */
4910 set_inuse_bit_at_offset(remainder, remainder_size);
4911 _int_free(av, chunk2mem(remainder));
4914 check_inuse_chunk(av, newp);
4915 return chunk2mem(newp);
4919 Handle mmap cases
4922 else {
4923 #if HAVE_MMAP
4925 #if HAVE_MREMAP
4926 INTERNAL_SIZE_T offset = oldp->prev_size;
4927 size_t pagemask = mp_.pagesize - 1;
4928 char *cp;
4929 unsigned long sum;
4931 /* Note the extra SIZE_SZ overhead */
4932 newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
4934 /* don't need to remap if still within same page */
4935 if (oldsize == newsize - offset)
4936 return oldmem;
4938 cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
4940 if (cp != MAP_FAILED) {
4942 newp = (mchunkptr)(cp + offset);
4943 set_head(newp, (newsize - offset)|IS_MMAPPED);
4945 assert(aligned_OK(chunk2mem(newp)));
4946 assert((newp->prev_size == offset));
4948 /* update statistics */
4949 sum = mp_.mmapped_mem += newsize - oldsize;
4950 if (sum > (unsigned long)(mp_.max_mmapped_mem))
4951 mp_.max_mmapped_mem = sum;
4952 #ifdef NO_THREADS
4953 sum += main_arena.system_mem;
4954 if (sum > (unsigned long)(mp_.max_total_mem))
4955 mp_.max_total_mem = sum;
4956 #endif
4958 return chunk2mem(newp);
4960 #endif
4962 /* Note the extra SIZE_SZ overhead. */
4963 if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
4964 newmem = oldmem; /* do nothing */
4965 else {
4966 /* Must alloc, copy, free. */
4967 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4968 if (newmem != 0) {
4969 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
4970 _int_free(av, oldmem);
4973 return newmem;
4975 #else
4976 /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
4977 check_malloc_state(av);
4978 MALLOC_FAILURE_ACTION;
4979 return 0;
4980 #endif
4985 ------------------------------ memalign ------------------------------
4988 Void_t*
4989 _int_memalign(mstate av, size_t alignment, size_t bytes)
4991 INTERNAL_SIZE_T nb; /* padded request size */
4992 char* m; /* memory returned by malloc call */
4993 mchunkptr p; /* corresponding chunk */
4994 char* brk; /* alignment point within p */
4995 mchunkptr newp; /* chunk to return */
4996 INTERNAL_SIZE_T newsize; /* its size */
4997 INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
4998 mchunkptr remainder; /* spare room at end to split off */
4999 unsigned long remainder_size; /* its size */
5000 INTERNAL_SIZE_T size;
5002 /* If need less alignment than we give anyway, just relay to malloc */
5004 if (alignment <= MALLOC_ALIGNMENT) return _int_malloc(av, bytes);
5006 /* Otherwise, ensure that it is at least a minimum chunk size */
5008 if (alignment < MINSIZE) alignment = MINSIZE;
5010 /* Make sure alignment is power of 2 (in case MINSIZE is not). */
5011 if ((alignment & (alignment - 1)) != 0) {
5012 size_t a = MALLOC_ALIGNMENT * 2;
5013 while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
5014 alignment = a;
5017 checked_request2size(bytes, nb);
5020 Strategy: find a spot within that chunk that meets the alignment
5021 request, and then possibly free the leading and trailing space.
5025 /* Call malloc with worst case padding to hit alignment. */
5027 m = (char*)(_int_malloc(av, nb + alignment + MINSIZE));
5029 if (m == 0) return 0; /* propagate failure */
5031 p = mem2chunk(m);
5033 if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
5036 Find an aligned spot inside chunk. Since we need to give back
5037 leading space in a chunk of at least MINSIZE, if the first
5038 calculation places us at a spot with less than MINSIZE leader,
5039 we can move to the next aligned spot -- we've allocated enough
5040 total room so that this is always possible.
5043 brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
5044 -((signed long) alignment));
5045 if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
5046 brk += alignment;
5048 newp = (mchunkptr)brk;
5049 leadsize = brk - (char*)(p);
5050 newsize = chunksize(p) - leadsize;
5052 /* For mmapped chunks, just adjust offset */
5053 if (chunk_is_mmapped(p)) {
5054 newp->prev_size = p->prev_size + leadsize;
5055 set_head(newp, newsize|IS_MMAPPED);
5056 return chunk2mem(newp);
5059 /* Otherwise, give back leader, use the rest */
5060 set_head(newp, newsize | PREV_INUSE |
5061 (av != &main_arena ? NON_MAIN_ARENA : 0));
5062 set_inuse_bit_at_offset(newp, newsize);
5063 set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5064 _int_free(av, chunk2mem(p));
5065 p = newp;
5067 assert (newsize >= nb &&
5068 (((unsigned long)(chunk2mem(p))) % alignment) == 0);
5071 /* Also give back spare room at the end */
5072 if (!chunk_is_mmapped(p)) {
5073 size = chunksize(p);
5074 if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
5075 remainder_size = size - nb;
5076 remainder = chunk_at_offset(p, nb);
5077 set_head(remainder, remainder_size | PREV_INUSE |
5078 (av != &main_arena ? NON_MAIN_ARENA : 0));
5079 set_head_size(p, nb);
5080 _int_free(av, chunk2mem(remainder));
5084 check_inuse_chunk(av, p);
5085 return chunk2mem(p);
5088 #if 0
5090 ------------------------------ calloc ------------------------------
5093 #if __STD_C
5094 Void_t* cALLOc(size_t n_elements, size_t elem_size)
5095 #else
5096 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
5097 #endif
5099 mchunkptr p;
5100 unsigned long clearsize;
5101 unsigned long nclears;
5102 INTERNAL_SIZE_T* d;
5104 Void_t* mem = mALLOc(n_elements * elem_size);
5106 if (mem != 0) {
5107 p = mem2chunk(mem);
5109 #if MMAP_CLEARS
5110 if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
5111 #endif
5114 Unroll clear of <= 36 bytes (72 if 8byte sizes)
5115 We know that contents have an odd number of
5116 INTERNAL_SIZE_T-sized words; minimally 3.
5119 d = (INTERNAL_SIZE_T*)mem;
5120 clearsize = chunksize(p) - SIZE_SZ;
5121 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
5122 assert(nclears >= 3);
5124 if (nclears > 9)
5125 MALLOC_ZERO(d, clearsize);
5127 else {
5128 *(d+0) = 0;
5129 *(d+1) = 0;
5130 *(d+2) = 0;
5131 if (nclears > 4) {
5132 *(d+3) = 0;
5133 *(d+4) = 0;
5134 if (nclears > 6) {
5135 *(d+5) = 0;
5136 *(d+6) = 0;
5137 if (nclears > 8) {
5138 *(d+7) = 0;
5139 *(d+8) = 0;
5146 return mem;
5148 #endif /* 0 */
5150 #ifndef _LIBC
5152 ------------------------- independent_calloc -------------------------
5155 Void_t**
5156 #if __STD_C
5157 _int_icalloc(mstate av, size_t n_elements, size_t elem_size, Void_t* chunks[])
5158 #else
5159 _int_icalloc(av, n_elements, elem_size, chunks)
5160 mstate av; size_t n_elements; size_t elem_size; Void_t* chunks[];
5161 #endif
5163 size_t sz = elem_size; /* serves as 1-element array */
5164 /* opts arg of 3 means all elements are same size, and should be cleared */
5165 return iALLOc(av, n_elements, &sz, 3, chunks);
5169 ------------------------- independent_comalloc -------------------------
5172 Void_t**
5173 #if __STD_C
5174 _int_icomalloc(mstate av, size_t n_elements, size_t sizes[], Void_t* chunks[])
5175 #else
5176 _int_icomalloc(av, n_elements, sizes, chunks)
5177 mstate av; size_t n_elements; size_t sizes[]; Void_t* chunks[];
5178 #endif
5180 return iALLOc(av, n_elements, sizes, 0, chunks);
5185 ------------------------------ ialloc ------------------------------
5186 ialloc provides common support for independent_X routines, handling all of
5187 the combinations that can result.
5189 The opts arg has:
5190 bit 0 set if all elements are same size (using sizes[0])
5191 bit 1 set if elements should be zeroed
5195 static Void_t**
5196 #if __STD_C
5197 iALLOc(mstate av, size_t n_elements, size_t* sizes, int opts, Void_t* chunks[])
5198 #else
5199 iALLOc(av, n_elements, sizes, opts, chunks)
5200 mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
5201 #endif
5203 INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
5204 INTERNAL_SIZE_T contents_size; /* total size of elements */
5205 INTERNAL_SIZE_T array_size; /* request size of pointer array */
5206 Void_t* mem; /* malloced aggregate space */
5207 mchunkptr p; /* corresponding chunk */
5208 INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
5209 Void_t** marray; /* either "chunks" or malloced ptr array */
5210 mchunkptr array_chunk; /* chunk for malloced ptr array */
5211 int mmx; /* to disable mmap */
5212 INTERNAL_SIZE_T size;
5213 INTERNAL_SIZE_T size_flags;
5214 size_t i;
5216 /* Ensure initialization/consolidation */
5217 if (have_fastchunks(av)) malloc_consolidate(av);
5219 /* compute array length, if needed */
5220 if (chunks != 0) {
5221 if (n_elements == 0)
5222 return chunks; /* nothing to do */
5223 marray = chunks;
5224 array_size = 0;
5226 else {
5227 /* if empty req, must still return chunk representing empty array */
5228 if (n_elements == 0)
5229 return (Void_t**) _int_malloc(av, 0);
5230 marray = 0;
5231 array_size = request2size(n_elements * (sizeof(Void_t*)));
5234 /* compute total element size */
5235 if (opts & 0x1) { /* all-same-size */
5236 element_size = request2size(*sizes);
5237 contents_size = n_elements * element_size;
5239 else { /* add up all the sizes */
5240 element_size = 0;
5241 contents_size = 0;
5242 for (i = 0; i != n_elements; ++i)
5243 contents_size += request2size(sizes[i]);
5246 /* subtract out alignment bytes from total to minimize overallocation */
5247 size = contents_size + array_size - MALLOC_ALIGN_MASK;
5250 Allocate the aggregate chunk.
5251 But first disable mmap so malloc won't use it, since
5252 we would not be able to later free/realloc space internal
5253 to a segregated mmap region.
5255 mmx = mp_.n_mmaps_max; /* disable mmap */
5256 mp_.n_mmaps_max = 0;
5257 mem = _int_malloc(av, size);
5258 mp_.n_mmaps_max = mmx; /* reset mmap */
5259 if (mem == 0)
5260 return 0;
5262 p = mem2chunk(mem);
5263 assert(!chunk_is_mmapped(p));
5264 remainder_size = chunksize(p);
5266 if (opts & 0x2) { /* optionally clear the elements */
5267 MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
5270 size_flags = PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0);
5272 /* If not provided, allocate the pointer array as final part of chunk */
5273 if (marray == 0) {
5274 array_chunk = chunk_at_offset(p, contents_size);
5275 marray = (Void_t**) (chunk2mem(array_chunk));
5276 set_head(array_chunk, (remainder_size - contents_size) | size_flags);
5277 remainder_size = contents_size;
5280 /* split out elements */
5281 for (i = 0; ; ++i) {
5282 marray[i] = chunk2mem(p);
5283 if (i != n_elements-1) {
5284 if (element_size != 0)
5285 size = element_size;
5286 else
5287 size = request2size(sizes[i]);
5288 remainder_size -= size;
5289 set_head(p, size | size_flags);
5290 p = chunk_at_offset(p, size);
5292 else { /* the final element absorbs any overallocation slop */
5293 set_head(p, remainder_size | size_flags);
5294 break;
5298 #if MALLOC_DEBUG
5299 if (marray != chunks) {
5300 /* final element must have exactly exhausted chunk */
5301 if (element_size != 0)
5302 assert(remainder_size == element_size);
5303 else
5304 assert(remainder_size == request2size(sizes[i]));
5305 check_inuse_chunk(av, mem2chunk(marray));
5308 for (i = 0; i != n_elements; ++i)
5309 check_inuse_chunk(av, mem2chunk(marray[i]));
5310 #endif
5312 return marray;
5314 #endif /* _LIBC */
5318 ------------------------------ valloc ------------------------------
5321 Void_t*
5322 #if __STD_C
5323 _int_valloc(mstate av, size_t bytes)
5324 #else
5325 _int_valloc(av, bytes) mstate av; size_t bytes;
5326 #endif
5328 /* Ensure initialization/consolidation */
5329 if (have_fastchunks(av)) malloc_consolidate(av);
5330 return _int_memalign(av, mp_.pagesize, bytes);
5334 ------------------------------ pvalloc ------------------------------
5338 Void_t*
5339 #if __STD_C
5340 _int_pvalloc(mstate av, size_t bytes)
5341 #else
5342 _int_pvalloc(av, bytes) mstate av, size_t bytes;
5343 #endif
5345 size_t pagesz;
5347 /* Ensure initialization/consolidation */
5348 if (have_fastchunks(av)) malloc_consolidate(av);
5349 pagesz = mp_.pagesize;
5350 return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
5355 ------------------------------ malloc_trim ------------------------------
5358 #if __STD_C
5359 int mTRIm(size_t pad)
5360 #else
5361 int mTRIm(pad) size_t pad;
5362 #endif
5364 mstate av = &main_arena; /* already locked */
5366 /* Ensure initialization/consolidation */
5367 malloc_consolidate(av);
5369 #ifndef MORECORE_CANNOT_TRIM
5370 return sYSTRIm(pad, av);
5371 #else
5372 return 0;
5373 #endif
5378 ------------------------- malloc_usable_size -------------------------
5381 #if __STD_C
5382 size_t mUSABLe(Void_t* mem)
5383 #else
5384 size_t mUSABLe(mem) Void_t* mem;
5385 #endif
5387 mchunkptr p;
5388 if (mem != 0) {
5389 p = mem2chunk(mem);
5390 if (chunk_is_mmapped(p))
5391 return chunksize(p) - 2*SIZE_SZ;
5392 else if (inuse(p))
5393 return chunksize(p) - SIZE_SZ;
5395 return 0;
5399 ------------------------------ mallinfo ------------------------------
5402 struct mallinfo mALLINFo(mstate av)
5404 struct mallinfo mi;
5405 size_t i;
5406 mbinptr b;
5407 mchunkptr p;
5408 INTERNAL_SIZE_T avail;
5409 INTERNAL_SIZE_T fastavail;
5410 int nblocks;
5411 int nfastblocks;
5413 /* Ensure initialization */
5414 if (av->top == 0) malloc_consolidate(av);
5416 check_malloc_state(av);
5418 /* Account for top */
5419 avail = chunksize(av->top);
5420 nblocks = 1; /* top always exists */
5422 /* traverse fastbins */
5423 nfastblocks = 0;
5424 fastavail = 0;
5426 for (i = 0; i < NFASTBINS; ++i) {
5427 for (p = av->fastbins[i]; p != 0; p = p->fd) {
5428 ++nfastblocks;
5429 fastavail += chunksize(p);
5433 avail += fastavail;
5435 /* traverse regular bins */
5436 for (i = 1; i < NBINS; ++i) {
5437 b = bin_at(av, i);
5438 for (p = last(b); p != b; p = p->bk) {
5439 ++nblocks;
5440 avail += chunksize(p);
5444 mi.smblks = nfastblocks;
5445 mi.ordblks = nblocks;
5446 mi.fordblks = avail;
5447 mi.uordblks = av->system_mem - avail;
5448 mi.arena = av->system_mem;
5449 mi.hblks = mp_.n_mmaps;
5450 mi.hblkhd = mp_.mmapped_mem;
5451 mi.fsmblks = fastavail;
5452 mi.keepcost = chunksize(av->top);
5453 mi.usmblks = mp_.max_total_mem;
5454 return mi;
5458 ------------------------------ malloc_stats ------------------------------
5461 void mSTATs()
5463 int i;
5464 mstate ar_ptr;
5465 struct mallinfo mi;
5466 unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
5467 #if THREAD_STATS
5468 long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
5469 #endif
5471 if(__malloc_initialized < 0)
5472 ptmalloc_init ();
5473 #ifdef _LIBC
5474 _IO_flockfile (stderr);
5475 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
5476 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
5477 #endif
5478 for (i=0, ar_ptr = &main_arena;; i++) {
5479 (void)mutex_lock(&ar_ptr->mutex);
5480 mi = mALLINFo(ar_ptr);
5481 fprintf(stderr, "Arena %d:\n", i);
5482 fprintf(stderr, "system bytes = %10u\n", (unsigned int)mi.arena);
5483 fprintf(stderr, "in use bytes = %10u\n", (unsigned int)mi.uordblks);
5484 #if MALLOC_DEBUG > 1
5485 if (i > 0)
5486 dump_heap(heap_for_ptr(top(ar_ptr)));
5487 #endif
5488 system_b += mi.arena;
5489 in_use_b += mi.uordblks;
5490 #if THREAD_STATS
5491 stat_lock_direct += ar_ptr->stat_lock_direct;
5492 stat_lock_loop += ar_ptr->stat_lock_loop;
5493 stat_lock_wait += ar_ptr->stat_lock_wait;
5494 #endif
5495 (void)mutex_unlock(&ar_ptr->mutex);
5496 ar_ptr = ar_ptr->next;
5497 if(ar_ptr == &main_arena) break;
5499 #if HAVE_MMAP
5500 fprintf(stderr, "Total (incl. mmap):\n");
5501 #else
5502 fprintf(stderr, "Total:\n");
5503 #endif
5504 fprintf(stderr, "system bytes = %10u\n", system_b);
5505 fprintf(stderr, "in use bytes = %10u\n", in_use_b);
5506 #ifdef NO_THREADS
5507 fprintf(stderr, "max system bytes = %10u\n", (unsigned int)mp_.max_total_mem);
5508 #endif
5509 #if HAVE_MMAP
5510 fprintf(stderr, "max mmap regions = %10u\n", (unsigned int)mp_.max_n_mmaps);
5511 fprintf(stderr, "max mmap bytes = %10lu\n",
5512 (unsigned long)mp_.max_mmapped_mem);
5513 #endif
5514 #if THREAD_STATS
5515 fprintf(stderr, "heaps created = %10d\n", stat_n_heaps);
5516 fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
5517 fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
5518 fprintf(stderr, "locked waiting = %10ld\n", stat_lock_wait);
5519 fprintf(stderr, "locked total = %10ld\n",
5520 stat_lock_direct + stat_lock_loop + stat_lock_wait);
5521 #endif
5522 #ifdef _LIBC
5523 ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
5524 _IO_funlockfile (stderr);
5525 #endif
5530 ------------------------------ mallopt ------------------------------
5533 #if __STD_C
5534 int mALLOPt(int param_number, int value)
5535 #else
5536 int mALLOPt(param_number, value) int param_number; int value;
5537 #endif
5539 mstate av = &main_arena;
5540 int res = 1;
5542 if(__malloc_initialized < 0)
5543 ptmalloc_init ();
5544 (void)mutex_lock(&av->mutex);
5545 /* Ensure initialization/consolidation */
5546 malloc_consolidate(av);
5548 switch(param_number) {
5549 case M_MXFAST:
5550 if (value >= 0 && value <= MAX_FAST_SIZE) {
5551 set_max_fast(value);
5553 else
5554 res = 0;
5555 break;
5557 case M_TRIM_THRESHOLD:
5558 mp_.trim_threshold = value;
5559 mp_.no_dyn_threshold = 1;
5560 break;
5562 case M_TOP_PAD:
5563 mp_.top_pad = value;
5564 mp_.no_dyn_threshold = 1;
5565 break;
5567 case M_MMAP_THRESHOLD:
5568 #if USE_ARENAS
5569 /* Forbid setting the threshold too high. */
5570 if((unsigned long)value > HEAP_MAX_SIZE/2)
5571 res = 0;
5572 else
5573 #endif
5574 mp_.mmap_threshold = value;
5575 mp_.no_dyn_threshold = 1;
5576 break;
5578 case M_MMAP_MAX:
5579 #if !HAVE_MMAP
5580 if (value != 0)
5581 res = 0;
5582 else
5583 #endif
5584 mp_.n_mmaps_max = value;
5585 mp_.no_dyn_threshold = 1;
5586 break;
5588 case M_CHECK_ACTION:
5589 check_action = value;
5590 break;
5592 case M_PERTURB:
5593 perturb_byte = value;
5594 break;
5596 (void)mutex_unlock(&av->mutex);
5597 return res;
5602 -------------------- Alternative MORECORE functions --------------------
5607 General Requirements for MORECORE.
5609 The MORECORE function must have the following properties:
5611 If MORECORE_CONTIGUOUS is false:
5613 * MORECORE must allocate in multiples of pagesize. It will
5614 only be called with arguments that are multiples of pagesize.
5616 * MORECORE(0) must return an address that is at least
5617 MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
5619 else (i.e. If MORECORE_CONTIGUOUS is true):
5621 * Consecutive calls to MORECORE with positive arguments
5622 return increasing addresses, indicating that space has been
5623 contiguously extended.
5625 * MORECORE need not allocate in multiples of pagesize.
5626 Calls to MORECORE need not have args of multiples of pagesize.
5628 * MORECORE need not page-align.
5630 In either case:
5632 * MORECORE may allocate more memory than requested. (Or even less,
5633 but this will generally result in a malloc failure.)
5635 * MORECORE must not allocate memory when given argument zero, but
5636 instead return one past the end address of memory from previous
5637 nonzero call. This malloc does NOT call MORECORE(0)
5638 until at least one call with positive arguments is made, so
5639 the initial value returned is not important.
5641 * Even though consecutive calls to MORECORE need not return contiguous
5642 addresses, it must be OK for malloc'ed chunks to span multiple
5643 regions in those cases where they do happen to be contiguous.
5645 * MORECORE need not handle negative arguments -- it may instead
5646 just return MORECORE_FAILURE when given negative arguments.
5647 Negative arguments are always multiples of pagesize. MORECORE
5648 must not misinterpret negative args as large positive unsigned
5649 args. You can suppress all such calls from even occurring by defining
5650 MORECORE_CANNOT_TRIM,
5652 There is some variation across systems about the type of the
5653 argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
5654 actually be size_t, because sbrk supports negative args, so it is
5655 normally the signed type of the same width as size_t (sometimes
5656 declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
5657 matter though. Internally, we use "long" as arguments, which should
5658 work across all reasonable possibilities.
5660 Additionally, if MORECORE ever returns failure for a positive
5661 request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
5662 system allocator. This is a useful backup strategy for systems with
5663 holes in address spaces -- in this case sbrk cannot contiguously
5664 expand the heap, but mmap may be able to map noncontiguous space.
5666 If you'd like mmap to ALWAYS be used, you can define MORECORE to be
5667 a function that always returns MORECORE_FAILURE.
5669 If you are using this malloc with something other than sbrk (or its
5670 emulation) to supply memory regions, you probably want to set
5671 MORECORE_CONTIGUOUS as false. As an example, here is a custom
5672 allocator kindly contributed for pre-OSX macOS. It uses virtually
5673 but not necessarily physically contiguous non-paged memory (locked
5674 in, present and won't get swapped out). You can use it by
5675 uncommenting this section, adding some #includes, and setting up the
5676 appropriate defines above:
5678 #define MORECORE osMoreCore
5679 #define MORECORE_CONTIGUOUS 0
5681 There is also a shutdown routine that should somehow be called for
5682 cleanup upon program exit.
5684 #define MAX_POOL_ENTRIES 100
5685 #define MINIMUM_MORECORE_SIZE (64 * 1024)
5686 static int next_os_pool;
5687 void *our_os_pools[MAX_POOL_ENTRIES];
5689 void *osMoreCore(int size)
5691 void *ptr = 0;
5692 static void *sbrk_top = 0;
5694 if (size > 0)
5696 if (size < MINIMUM_MORECORE_SIZE)
5697 size = MINIMUM_MORECORE_SIZE;
5698 if (CurrentExecutionLevel() == kTaskLevel)
5699 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
5700 if (ptr == 0)
5702 return (void *) MORECORE_FAILURE;
5704 // save ptrs so they can be freed during cleanup
5705 our_os_pools[next_os_pool] = ptr;
5706 next_os_pool++;
5707 ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
5708 sbrk_top = (char *) ptr + size;
5709 return ptr;
5711 else if (size < 0)
5713 // we don't currently support shrink behavior
5714 return (void *) MORECORE_FAILURE;
5716 else
5718 return sbrk_top;
5722 // cleanup any allocated memory pools
5723 // called as last thing before shutting down driver
5725 void osCleanupMem(void)
5727 void **ptr;
5729 for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
5730 if (*ptr)
5732 PoolDeallocate(*ptr);
5733 *ptr = 0;
5740 /* Helper code. */
5742 extern char **__libc_argv attribute_hidden;
5744 static void
5745 malloc_printerr(int action, const char *str, void *ptr)
5747 if ((action & 5) == 5)
5748 __libc_message (action & 2, "%s\n", str);
5749 else if (action & 1)
5751 char buf[2 * sizeof (uintptr_t) + 1];
5753 buf[sizeof (buf) - 1] = '\0';
5754 char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
5755 while (cp > buf)
5756 *--cp = '0';
5758 __libc_message (action & 2,
5759 "*** glibc detected *** %s: %s: 0x%s ***\n",
5760 __libc_argv[0] ?: "<unknown>", str, cp);
5762 else if (action & 2)
5763 abort ();
5766 #ifdef _LIBC
5767 # include <sys/param.h>
5769 /* We need a wrapper function for one of the additions of POSIX. */
5771 __posix_memalign (void **memptr, size_t alignment, size_t size)
5773 void *mem;
5774 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
5775 __const __malloc_ptr_t)) =
5776 __memalign_hook;
5778 /* Test whether the SIZE argument is valid. It must be a power of
5779 two multiple of sizeof (void *). */
5780 if (alignment % sizeof (void *) != 0
5781 || !powerof2 (alignment / sizeof (void *)) != 0
5782 || alignment == 0)
5783 return EINVAL;
5785 /* Call the hook here, so that caller is posix_memalign's caller
5786 and not posix_memalign itself. */
5787 if (hook != NULL)
5788 mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
5789 else
5790 mem = public_mEMALIGn (alignment, size);
5792 if (mem != NULL) {
5793 *memptr = mem;
5794 return 0;
5797 return ENOMEM;
5799 weak_alias (__posix_memalign, posix_memalign)
5801 strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
5802 strong_alias (__libc_free, __cfree) weak_alias (__libc_free, cfree)
5803 strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
5804 strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
5805 strong_alias (__libc_memalign, __memalign)
5806 weak_alias (__libc_memalign, memalign)
5807 strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
5808 strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
5809 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
5810 strong_alias (__libc_mallinfo, __mallinfo)
5811 weak_alias (__libc_mallinfo, mallinfo)
5812 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
5814 weak_alias (__malloc_stats, malloc_stats)
5815 weak_alias (__malloc_usable_size, malloc_usable_size)
5816 weak_alias (__malloc_trim, malloc_trim)
5817 weak_alias (__malloc_get_state, malloc_get_state)
5818 weak_alias (__malloc_set_state, malloc_set_state)
5820 #endif /* _LIBC */
5822 /* ------------------------------------------------------------
5823 History:
5825 [see ftp://g.oswego.edu/pub/misc/malloc.c for the history of dlmalloc]
5829 * Local variables:
5830 * c-basic-offset: 2
5831 * End: