* dlfcn/Makefile (LDLIBS-bug-atexit3-lib.so): Add
[glibc.git] / malloc / malloc.c
blob206f3e1b6a9dac3a9d75ab1cc01793ba6d57c819
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 (grow_heap(old_heap, MINSIZE + nb - old_size) == 0) {
2974 av->system_mem += old_heap->size - old_heap_size;
2975 arena_mem += old_heap->size - old_heap_size;
2976 #if 0
2977 if(mmapped_mem + arena_mem + sbrked_mem > max_total_mem)
2978 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
2979 #endif
2980 set_head(old_top, (((char *)old_heap + old_heap->size) - (char *)old_top)
2981 | PREV_INUSE);
2983 else if ((heap = new_heap(nb + (MINSIZE + sizeof(*heap)), mp_.top_pad))) {
2984 /* Use a newly allocated heap. */
2985 heap->ar_ptr = av;
2986 heap->prev = old_heap;
2987 av->system_mem += heap->size;
2988 arena_mem += heap->size;
2989 #if 0
2990 if((unsigned long)(mmapped_mem + arena_mem + sbrked_mem) > max_total_mem)
2991 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
2992 #endif
2993 /* Set up the new top. */
2994 top(av) = chunk_at_offset(heap, sizeof(*heap));
2995 set_head(top(av), (heap->size - sizeof(*heap)) | PREV_INUSE);
2997 /* Setup fencepost and free the old top chunk. */
2998 /* The fencepost takes at least MINSIZE bytes, because it might
2999 become the top chunk again later. Note that a footer is set
3000 up, too, although the chunk is marked in use. */
3001 old_size -= MINSIZE;
3002 set_head(chunk_at_offset(old_top, old_size + 2*SIZE_SZ), 0|PREV_INUSE);
3003 if (old_size >= MINSIZE) {
3004 set_head(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)|PREV_INUSE);
3005 set_foot(chunk_at_offset(old_top, old_size), (2*SIZE_SZ));
3006 set_head(old_top, old_size|PREV_INUSE|NON_MAIN_ARENA);
3007 _int_free(av, chunk2mem(old_top));
3008 } else {
3009 set_head(old_top, (old_size + 2*SIZE_SZ)|PREV_INUSE);
3010 set_foot(old_top, (old_size + 2*SIZE_SZ));
3013 else if (!tried_mmap)
3014 /* We can at least try to use to mmap memory. */
3015 goto try_mmap;
3017 } else { /* av == main_arena */
3020 /* Request enough space for nb + pad + overhead */
3022 size = nb + mp_.top_pad + MINSIZE;
3025 If contiguous, we can subtract out existing space that we hope to
3026 combine with new space. We add it back later only if
3027 we don't actually get contiguous space.
3030 if (contiguous(av))
3031 size -= old_size;
3034 Round to a multiple of page size.
3035 If MORECORE is not contiguous, this ensures that we only call it
3036 with whole-page arguments. And if MORECORE is contiguous and
3037 this is not first time through, this preserves page-alignment of
3038 previous calls. Otherwise, we correct to page-align below.
3041 size = (size + pagemask) & ~pagemask;
3044 Don't try to call MORECORE if argument is so big as to appear
3045 negative. Note that since mmap takes size_t arg, it may succeed
3046 below even if we cannot call MORECORE.
3049 if (size > 0)
3050 brk = (char*)(MORECORE(size));
3052 if (brk != (char*)(MORECORE_FAILURE)) {
3053 /* Call the `morecore' hook if necessary. */
3054 if (__after_morecore_hook)
3055 (*__after_morecore_hook) ();
3056 } else {
3058 If have mmap, try using it as a backup when MORECORE fails or
3059 cannot be used. This is worth doing on systems that have "holes" in
3060 address space, so sbrk cannot extend to give contiguous space, but
3061 space is available elsewhere. Note that we ignore mmap max count
3062 and threshold limits, since the space will not be used as a
3063 segregated mmap region.
3066 #if HAVE_MMAP
3067 /* Cannot merge with old top, so add its size back in */
3068 if (contiguous(av))
3069 size = (size + old_size + pagemask) & ~pagemask;
3071 /* If we are relying on mmap as backup, then use larger units */
3072 if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
3073 size = MMAP_AS_MORECORE_SIZE;
3075 /* Don't try if size wraps around 0 */
3076 if ((unsigned long)(size) > (unsigned long)(nb)) {
3078 char *mbrk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
3080 if (mbrk != MAP_FAILED) {
3082 /* We do not need, and cannot use, another sbrk call to find end */
3083 brk = mbrk;
3084 snd_brk = brk + size;
3087 Record that we no longer have a contiguous sbrk region.
3088 After the first time mmap is used as backup, we do not
3089 ever rely on contiguous space since this could incorrectly
3090 bridge regions.
3092 set_noncontiguous(av);
3095 #endif
3098 if (brk != (char*)(MORECORE_FAILURE)) {
3099 if (mp_.sbrk_base == 0)
3100 mp_.sbrk_base = brk;
3101 av->system_mem += size;
3104 If MORECORE extends previous space, we can likewise extend top size.
3107 if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE))
3108 set_head(old_top, (size + old_size) | PREV_INUSE);
3110 else if (contiguous(av) && old_size && brk < old_end) {
3111 /* Oops! Someone else killed our space.. Can't touch anything. */
3112 assert(0);
3116 Otherwise, make adjustments:
3118 * If the first time through or noncontiguous, we need to call sbrk
3119 just to find out where the end of memory lies.
3121 * We need to ensure that all returned chunks from malloc will meet
3122 MALLOC_ALIGNMENT
3124 * If there was an intervening foreign sbrk, we need to adjust sbrk
3125 request size to account for fact that we will not be able to
3126 combine new space with existing space in old_top.
3128 * Almost all systems internally allocate whole pages at a time, in
3129 which case we might as well use the whole last page of request.
3130 So we allocate enough more memory to hit a page boundary now,
3131 which in turn causes future contiguous calls to page-align.
3134 else {
3135 front_misalign = 0;
3136 end_misalign = 0;
3137 correction = 0;
3138 aligned_brk = brk;
3140 /* handle contiguous cases */
3141 if (contiguous(av)) {
3143 /* Count foreign sbrk as system_mem. */
3144 if (old_size)
3145 av->system_mem += brk - old_end;
3147 /* Guarantee alignment of first new chunk made from this space */
3149 front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3150 if (front_misalign > 0) {
3153 Skip over some bytes to arrive at an aligned position.
3154 We don't need to specially mark these wasted front bytes.
3155 They will never be accessed anyway because
3156 prev_inuse of av->top (and any chunk created from its start)
3157 is always true after initialization.
3160 correction = MALLOC_ALIGNMENT - front_misalign;
3161 aligned_brk += correction;
3165 If this isn't adjacent to existing space, then we will not
3166 be able to merge with old_top space, so must add to 2nd request.
3169 correction += old_size;
3171 /* Extend the end address to hit a page boundary */
3172 end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3173 correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3175 assert(correction >= 0);
3176 snd_brk = (char*)(MORECORE(correction));
3179 If can't allocate correction, try to at least find out current
3180 brk. It might be enough to proceed without failing.
3182 Note that if second sbrk did NOT fail, we assume that space
3183 is contiguous with first sbrk. This is a safe assumption unless
3184 program is multithreaded but doesn't use locks and a foreign sbrk
3185 occurred between our first and second calls.
3188 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3189 correction = 0;
3190 snd_brk = (char*)(MORECORE(0));
3191 } else
3192 /* Call the `morecore' hook if necessary. */
3193 if (__after_morecore_hook)
3194 (*__after_morecore_hook) ();
3197 /* handle non-contiguous cases */
3198 else {
3199 /* MORECORE/mmap must correctly align */
3200 assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3202 /* Find out current end of memory */
3203 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3204 snd_brk = (char*)(MORECORE(0));
3208 /* Adjust top based on results of second sbrk */
3209 if (snd_brk != (char*)(MORECORE_FAILURE)) {
3210 av->top = (mchunkptr)aligned_brk;
3211 set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3212 av->system_mem += correction;
3215 If not the first time through, we either have a
3216 gap due to foreign sbrk or a non-contiguous region. Insert a
3217 double fencepost at old_top to prevent consolidation with space
3218 we don't own. These fenceposts are artificial chunks that are
3219 marked as inuse and are in any case too small to use. We need
3220 two to make sizes and alignments work out.
3223 if (old_size != 0) {
3225 Shrink old_top to insert fenceposts, keeping size a
3226 multiple of MALLOC_ALIGNMENT. We know there is at least
3227 enough space in old_top to do this.
3229 old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3230 set_head(old_top, old_size | PREV_INUSE);
3233 Note that the following assignments completely overwrite
3234 old_top when old_size was previously MINSIZE. This is
3235 intentional. We need the fencepost, even if old_top otherwise gets
3236 lost.
3238 chunk_at_offset(old_top, old_size )->size =
3239 (2*SIZE_SZ)|PREV_INUSE;
3241 chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
3242 (2*SIZE_SZ)|PREV_INUSE;
3244 /* If possible, release the rest. */
3245 if (old_size >= MINSIZE) {
3246 _int_free(av, chunk2mem(old_top));
3253 /* Update statistics */
3254 #ifdef NO_THREADS
3255 sum = av->system_mem + mp_.mmapped_mem;
3256 if (sum > (unsigned long)(mp_.max_total_mem))
3257 mp_.max_total_mem = sum;
3258 #endif
3262 } /* if (av != &main_arena) */
3264 if ((unsigned long)av->system_mem > (unsigned long)(av->max_system_mem))
3265 av->max_system_mem = av->system_mem;
3266 check_malloc_state(av);
3268 /* finally, do the allocation */
3269 p = av->top;
3270 size = chunksize(p);
3272 /* check that one of the above allocation paths succeeded */
3273 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3274 remainder_size = size - nb;
3275 remainder = chunk_at_offset(p, nb);
3276 av->top = remainder;
3277 set_head(p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0));
3278 set_head(remainder, remainder_size | PREV_INUSE);
3279 check_malloced_chunk(av, p, nb);
3280 return chunk2mem(p);
3283 /* catch all failure paths */
3284 MALLOC_FAILURE_ACTION;
3285 return 0;
3290 sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
3291 to the system (via negative arguments to sbrk) if there is unused
3292 memory at the `high' end of the malloc pool. It is called
3293 automatically by free() when top space exceeds the trim
3294 threshold. It is also called by the public malloc_trim routine. It
3295 returns 1 if it actually released any memory, else 0.
3298 #if __STD_C
3299 static int sYSTRIm(size_t pad, mstate av)
3300 #else
3301 static int sYSTRIm(pad, av) size_t pad; mstate av;
3302 #endif
3304 long top_size; /* Amount of top-most memory */
3305 long extra; /* Amount to release */
3306 long released; /* Amount actually released */
3307 char* current_brk; /* address returned by pre-check sbrk call */
3308 char* new_brk; /* address returned by post-check sbrk call */
3309 size_t pagesz;
3311 pagesz = mp_.pagesize;
3312 top_size = chunksize(av->top);
3314 /* Release in pagesize units, keeping at least one page */
3315 extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3317 if (extra > 0) {
3320 Only proceed if end of memory is where we last set it.
3321 This avoids problems if there were foreign sbrk calls.
3323 current_brk = (char*)(MORECORE(0));
3324 if (current_brk == (char*)(av->top) + top_size) {
3327 Attempt to release memory. We ignore MORECORE return value,
3328 and instead call again to find out where new end of memory is.
3329 This avoids problems if first call releases less than we asked,
3330 of if failure somehow altered brk value. (We could still
3331 encounter problems if it altered brk in some very bad way,
3332 but the only thing we can do is adjust anyway, which will cause
3333 some downstream failure.)
3336 MORECORE(-extra);
3337 /* Call the `morecore' hook if necessary. */
3338 if (__after_morecore_hook)
3339 (*__after_morecore_hook) ();
3340 new_brk = (char*)(MORECORE(0));
3342 if (new_brk != (char*)MORECORE_FAILURE) {
3343 released = (long)(current_brk - new_brk);
3345 if (released != 0) {
3346 /* Success. Adjust top. */
3347 av->system_mem -= released;
3348 set_head(av->top, (top_size - released) | PREV_INUSE);
3349 check_malloc_state(av);
3350 return 1;
3355 return 0;
3358 #ifdef HAVE_MMAP
3360 static void
3361 internal_function
3362 #if __STD_C
3363 munmap_chunk(mchunkptr p)
3364 #else
3365 munmap_chunk(p) mchunkptr p;
3366 #endif
3368 INTERNAL_SIZE_T size = chunksize(p);
3370 assert (chunk_is_mmapped(p));
3371 #if 0
3372 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3373 assert((mp_.n_mmaps > 0));
3374 #endif
3376 uintptr_t block = (uintptr_t) p - p->prev_size;
3377 size_t total_size = p->prev_size + size;
3378 /* Unfortunately we have to do the compilers job by hand here. Normally
3379 we would test BLOCK and TOTAL-SIZE separately for compliance with the
3380 page size. But gcc does not recognize the optimization possibility
3381 (in the moment at least) so we combine the two values into one before
3382 the bit test. */
3383 if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
3385 malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
3386 chunk2mem (p));
3387 return;
3390 mp_.n_mmaps--;
3391 mp_.mmapped_mem -= total_size;
3393 int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
3395 /* munmap returns non-zero on failure */
3396 assert(ret == 0);
3399 #if HAVE_MREMAP
3401 static mchunkptr
3402 internal_function
3403 #if __STD_C
3404 mremap_chunk(mchunkptr p, size_t new_size)
3405 #else
3406 mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
3407 #endif
3409 size_t page_mask = mp_.pagesize - 1;
3410 INTERNAL_SIZE_T offset = p->prev_size;
3411 INTERNAL_SIZE_T size = chunksize(p);
3412 char *cp;
3414 assert (chunk_is_mmapped(p));
3415 #if 0
3416 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3417 assert((mp_.n_mmaps > 0));
3418 #endif
3419 assert(((size + offset) & (mp_.pagesize-1)) == 0);
3421 /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
3422 new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
3424 cp = (char *)mremap((char *)p - offset, size + offset, new_size,
3425 MREMAP_MAYMOVE);
3427 if (cp == MAP_FAILED) return 0;
3429 p = (mchunkptr)(cp + offset);
3431 assert(aligned_OK(chunk2mem(p)));
3433 assert((p->prev_size == offset));
3434 set_head(p, (new_size - offset)|IS_MMAPPED);
3436 mp_.mmapped_mem -= size + offset;
3437 mp_.mmapped_mem += new_size;
3438 if ((unsigned long)mp_.mmapped_mem > (unsigned long)mp_.max_mmapped_mem)
3439 mp_.max_mmapped_mem = mp_.mmapped_mem;
3440 #ifdef NO_THREADS
3441 if ((unsigned long)(mp_.mmapped_mem + arena_mem + main_arena.system_mem) >
3442 mp_.max_total_mem)
3443 mp_.max_total_mem = mp_.mmapped_mem + arena_mem + main_arena.system_mem;
3444 #endif
3445 return p;
3448 #endif /* HAVE_MREMAP */
3450 #endif /* HAVE_MMAP */
3452 /*------------------------ Public wrappers. --------------------------------*/
3454 Void_t*
3455 public_mALLOc(size_t bytes)
3457 mstate ar_ptr;
3458 Void_t *victim;
3460 __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t) = __malloc_hook;
3461 if (hook != NULL)
3462 return (*hook)(bytes, RETURN_ADDRESS (0));
3464 arena_get(ar_ptr, bytes);
3465 if(!ar_ptr)
3466 return 0;
3467 victim = _int_malloc(ar_ptr, bytes);
3468 if(!victim) {
3469 /* Maybe the failure is due to running out of mmapped areas. */
3470 if(ar_ptr != &main_arena) {
3471 (void)mutex_unlock(&ar_ptr->mutex);
3472 (void)mutex_lock(&main_arena.mutex);
3473 victim = _int_malloc(&main_arena, bytes);
3474 (void)mutex_unlock(&main_arena.mutex);
3475 } else {
3476 #if USE_ARENAS
3477 /* ... or sbrk() has failed and there is still a chance to mmap() */
3478 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3479 (void)mutex_unlock(&main_arena.mutex);
3480 if(ar_ptr) {
3481 victim = _int_malloc(ar_ptr, bytes);
3482 (void)mutex_unlock(&ar_ptr->mutex);
3484 #endif
3486 } else
3487 (void)mutex_unlock(&ar_ptr->mutex);
3488 assert(!victim || chunk_is_mmapped(mem2chunk(victim)) ||
3489 ar_ptr == arena_for_chunk(mem2chunk(victim)));
3490 return victim;
3492 #ifdef libc_hidden_def
3493 libc_hidden_def(public_mALLOc)
3494 #endif
3496 void
3497 public_fREe(Void_t* mem)
3499 mstate ar_ptr;
3500 mchunkptr p; /* chunk corresponding to mem */
3502 void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t) = __free_hook;
3503 if (hook != NULL) {
3504 (*hook)(mem, RETURN_ADDRESS (0));
3505 return;
3508 if (mem == 0) /* free(0) has no effect */
3509 return;
3511 p = mem2chunk(mem);
3513 #if HAVE_MMAP
3514 if (chunk_is_mmapped(p)) /* release mmapped memory. */
3516 /* see if the dynamic brk/mmap threshold needs adjusting */
3517 if (!mp_.no_dyn_threshold
3518 && p->size > mp_.mmap_threshold
3519 && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
3521 mp_.mmap_threshold = chunksize (p);
3522 mp_.trim_threshold = 2 * mp_.mmap_threshold;
3524 munmap_chunk(p);
3525 return;
3527 #endif
3529 ar_ptr = arena_for_chunk(p);
3530 #if THREAD_STATS
3531 if(!mutex_trylock(&ar_ptr->mutex))
3532 ++(ar_ptr->stat_lock_direct);
3533 else {
3534 (void)mutex_lock(&ar_ptr->mutex);
3535 ++(ar_ptr->stat_lock_wait);
3537 #else
3538 (void)mutex_lock(&ar_ptr->mutex);
3539 #endif
3540 _int_free(ar_ptr, mem);
3541 (void)mutex_unlock(&ar_ptr->mutex);
3543 #ifdef libc_hidden_def
3544 libc_hidden_def (public_fREe)
3545 #endif
3547 Void_t*
3548 public_rEALLOc(Void_t* oldmem, size_t bytes)
3550 mstate ar_ptr;
3551 INTERNAL_SIZE_T nb; /* padded request size */
3553 mchunkptr oldp; /* chunk corresponding to oldmem */
3554 INTERNAL_SIZE_T oldsize; /* its size */
3556 Void_t* newp; /* chunk to return */
3558 __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) =
3559 __realloc_hook;
3560 if (hook != NULL)
3561 return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
3563 #if REALLOC_ZERO_BYTES_FREES
3564 if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; }
3565 #endif
3567 /* realloc of null is supposed to be same as malloc */
3568 if (oldmem == 0) return public_mALLOc(bytes);
3570 oldp = mem2chunk(oldmem);
3571 oldsize = chunksize(oldp);
3573 /* Little security check which won't hurt performance: the
3574 allocator never wrapps around at the end of the address space.
3575 Therefore we can exclude some size values which might appear
3576 here by accident or by "design" from some intruder. */
3577 if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
3578 || __builtin_expect (misaligned_chunk (oldp), 0))
3580 malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
3581 return NULL;
3584 checked_request2size(bytes, nb);
3586 #if HAVE_MMAP
3587 if (chunk_is_mmapped(oldp))
3589 Void_t* newmem;
3591 #if HAVE_MREMAP
3592 newp = mremap_chunk(oldp, nb);
3593 if(newp) return chunk2mem(newp);
3594 #endif
3595 /* Note the extra SIZE_SZ overhead. */
3596 if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
3597 /* Must alloc, copy, free. */
3598 newmem = public_mALLOc(bytes);
3599 if (newmem == 0) return 0; /* propagate failure */
3600 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
3601 munmap_chunk(oldp);
3602 return newmem;
3604 #endif
3606 ar_ptr = arena_for_chunk(oldp);
3607 #if THREAD_STATS
3608 if(!mutex_trylock(&ar_ptr->mutex))
3609 ++(ar_ptr->stat_lock_direct);
3610 else {
3611 (void)mutex_lock(&ar_ptr->mutex);
3612 ++(ar_ptr->stat_lock_wait);
3614 #else
3615 (void)mutex_lock(&ar_ptr->mutex);
3616 #endif
3618 #ifndef NO_THREADS
3619 /* As in malloc(), remember this arena for the next allocation. */
3620 tsd_setspecific(arena_key, (Void_t *)ar_ptr);
3621 #endif
3623 newp = _int_realloc(ar_ptr, oldmem, bytes);
3625 (void)mutex_unlock(&ar_ptr->mutex);
3626 assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
3627 ar_ptr == arena_for_chunk(mem2chunk(newp)));
3629 if (newp == NULL)
3631 /* Try harder to allocate memory in other arenas. */
3632 newp = public_mALLOc(bytes);
3633 if (newp != NULL)
3635 MALLOC_COPY (newp, oldmem, oldsize - 2 * SIZE_SZ);
3636 #if THREAD_STATS
3637 if(!mutex_trylock(&ar_ptr->mutex))
3638 ++(ar_ptr->stat_lock_direct);
3639 else {
3640 (void)mutex_lock(&ar_ptr->mutex);
3641 ++(ar_ptr->stat_lock_wait);
3643 #else
3644 (void)mutex_lock(&ar_ptr->mutex);
3645 #endif
3646 _int_free(ar_ptr, oldmem);
3647 (void)mutex_unlock(&ar_ptr->mutex);
3651 return newp;
3653 #ifdef libc_hidden_def
3654 libc_hidden_def (public_rEALLOc)
3655 #endif
3657 Void_t*
3658 public_mEMALIGn(size_t alignment, size_t bytes)
3660 mstate ar_ptr;
3661 Void_t *p;
3663 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3664 __const __malloc_ptr_t)) =
3665 __memalign_hook;
3666 if (hook != NULL)
3667 return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
3669 /* If need less alignment than we give anyway, just relay to malloc */
3670 if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes);
3672 /* Otherwise, ensure that it is at least a minimum chunk size */
3673 if (alignment < MINSIZE) alignment = MINSIZE;
3675 arena_get(ar_ptr, bytes + alignment + MINSIZE);
3676 if(!ar_ptr)
3677 return 0;
3678 p = _int_memalign(ar_ptr, alignment, bytes);
3679 (void)mutex_unlock(&ar_ptr->mutex);
3680 if(!p) {
3681 /* Maybe the failure is due to running out of mmapped areas. */
3682 if(ar_ptr != &main_arena) {
3683 (void)mutex_lock(&main_arena.mutex);
3684 p = _int_memalign(&main_arena, alignment, bytes);
3685 (void)mutex_unlock(&main_arena.mutex);
3686 } else {
3687 #if USE_ARENAS
3688 /* ... or sbrk() has failed and there is still a chance to mmap() */
3689 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3690 if(ar_ptr) {
3691 p = _int_memalign(ar_ptr, alignment, bytes);
3692 (void)mutex_unlock(&ar_ptr->mutex);
3694 #endif
3697 assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3698 ar_ptr == arena_for_chunk(mem2chunk(p)));
3699 return p;
3701 #ifdef libc_hidden_def
3702 libc_hidden_def (public_mEMALIGn)
3703 #endif
3705 Void_t*
3706 public_vALLOc(size_t bytes)
3708 mstate ar_ptr;
3709 Void_t *p;
3711 if(__malloc_initialized < 0)
3712 ptmalloc_init ();
3714 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3715 __const __malloc_ptr_t)) =
3716 __memalign_hook;
3717 if (hook != NULL)
3718 return (*hook)(mp_.pagesize, bytes, RETURN_ADDRESS (0));
3720 arena_get(ar_ptr, bytes + mp_.pagesize + MINSIZE);
3721 if(!ar_ptr)
3722 return 0;
3723 p = _int_valloc(ar_ptr, bytes);
3724 (void)mutex_unlock(&ar_ptr->mutex);
3725 return p;
3728 Void_t*
3729 public_pVALLOc(size_t bytes)
3731 mstate ar_ptr;
3732 Void_t *p;
3734 if(__malloc_initialized < 0)
3735 ptmalloc_init ();
3737 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3738 __const __malloc_ptr_t)) =
3739 __memalign_hook;
3740 if (hook != NULL)
3741 return (*hook)(mp_.pagesize,
3742 (bytes + mp_.pagesize - 1) & ~(mp_.pagesize - 1),
3743 RETURN_ADDRESS (0));
3745 arena_get(ar_ptr, bytes + 2*mp_.pagesize + MINSIZE);
3746 p = _int_pvalloc(ar_ptr, bytes);
3747 (void)mutex_unlock(&ar_ptr->mutex);
3748 return p;
3751 Void_t*
3752 public_cALLOc(size_t n, size_t elem_size)
3754 mstate av;
3755 mchunkptr oldtop, p;
3756 INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
3757 Void_t* mem;
3758 unsigned long clearsize;
3759 unsigned long nclears;
3760 INTERNAL_SIZE_T* d;
3761 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, __const __malloc_ptr_t)) =
3762 __malloc_hook;
3764 /* size_t is unsigned so the behavior on overflow is defined. */
3765 bytes = n * elem_size;
3766 #define HALF_INTERNAL_SIZE_T \
3767 (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2))
3768 if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) {
3769 if (elem_size != 0 && bytes / elem_size != n) {
3770 MALLOC_FAILURE_ACTION;
3771 return 0;
3775 if (hook != NULL) {
3776 sz = bytes;
3777 mem = (*hook)(sz, RETURN_ADDRESS (0));
3778 if(mem == 0)
3779 return 0;
3780 #ifdef HAVE_MEMCPY
3781 return memset(mem, 0, sz);
3782 #else
3783 while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
3784 return mem;
3785 #endif
3788 sz = bytes;
3790 arena_get(av, sz);
3791 if(!av)
3792 return 0;
3794 /* Check if we hand out the top chunk, in which case there may be no
3795 need to clear. */
3796 #if MORECORE_CLEARS
3797 oldtop = top(av);
3798 oldtopsize = chunksize(top(av));
3799 #if MORECORE_CLEARS < 2
3800 /* Only newly allocated memory is guaranteed to be cleared. */
3801 if (av == &main_arena &&
3802 oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
3803 oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
3804 #endif
3805 #endif
3806 mem = _int_malloc(av, sz);
3808 /* Only clearing follows, so we can unlock early. */
3809 (void)mutex_unlock(&av->mutex);
3811 assert(!mem || chunk_is_mmapped(mem2chunk(mem)) ||
3812 av == arena_for_chunk(mem2chunk(mem)));
3814 if (mem == 0) {
3815 /* Maybe the failure is due to running out of mmapped areas. */
3816 if(av != &main_arena) {
3817 (void)mutex_lock(&main_arena.mutex);
3818 mem = _int_malloc(&main_arena, sz);
3819 (void)mutex_unlock(&main_arena.mutex);
3820 } else {
3821 #if USE_ARENAS
3822 /* ... or sbrk() has failed and there is still a chance to mmap() */
3823 (void)mutex_lock(&main_arena.mutex);
3824 av = arena_get2(av->next ? av : 0, sz);
3825 (void)mutex_unlock(&main_arena.mutex);
3826 if(av) {
3827 mem = _int_malloc(av, sz);
3828 (void)mutex_unlock(&av->mutex);
3830 #endif
3832 if (mem == 0) return 0;
3834 p = mem2chunk(mem);
3836 /* Two optional cases in which clearing not necessary */
3837 #if HAVE_MMAP
3838 if (chunk_is_mmapped (p))
3840 if (__builtin_expect (perturb_byte, 0))
3841 MALLOC_ZERO (mem, sz);
3842 return mem;
3844 #endif
3846 csz = chunksize(p);
3848 #if MORECORE_CLEARS
3849 if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) {
3850 /* clear only the bytes from non-freshly-sbrked memory */
3851 csz = oldtopsize;
3853 #endif
3855 /* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that
3856 contents have an odd number of INTERNAL_SIZE_T-sized words;
3857 minimally 3. */
3858 d = (INTERNAL_SIZE_T*)mem;
3859 clearsize = csz - SIZE_SZ;
3860 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
3861 assert(nclears >= 3);
3863 if (nclears > 9)
3864 MALLOC_ZERO(d, clearsize);
3866 else {
3867 *(d+0) = 0;
3868 *(d+1) = 0;
3869 *(d+2) = 0;
3870 if (nclears > 4) {
3871 *(d+3) = 0;
3872 *(d+4) = 0;
3873 if (nclears > 6) {
3874 *(d+5) = 0;
3875 *(d+6) = 0;
3876 if (nclears > 8) {
3877 *(d+7) = 0;
3878 *(d+8) = 0;
3884 return mem;
3887 #ifndef _LIBC
3889 Void_t**
3890 public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
3892 mstate ar_ptr;
3893 Void_t** m;
3895 arena_get(ar_ptr, n*elem_size);
3896 if(!ar_ptr)
3897 return 0;
3899 m = _int_icalloc(ar_ptr, n, elem_size, chunks);
3900 (void)mutex_unlock(&ar_ptr->mutex);
3901 return m;
3904 Void_t**
3905 public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
3907 mstate ar_ptr;
3908 Void_t** m;
3910 arena_get(ar_ptr, 0);
3911 if(!ar_ptr)
3912 return 0;
3914 m = _int_icomalloc(ar_ptr, n, sizes, chunks);
3915 (void)mutex_unlock(&ar_ptr->mutex);
3916 return m;
3919 void
3920 public_cFREe(Void_t* m)
3922 public_fREe(m);
3925 #endif /* _LIBC */
3928 public_mTRIm(size_t s)
3930 int result;
3932 if(__malloc_initialized < 0)
3933 ptmalloc_init ();
3934 (void)mutex_lock(&main_arena.mutex);
3935 result = mTRIm(s);
3936 (void)mutex_unlock(&main_arena.mutex);
3937 return result;
3940 size_t
3941 public_mUSABLe(Void_t* m)
3943 size_t result;
3945 result = mUSABLe(m);
3946 return result;
3949 void
3950 public_mSTATs()
3952 mSTATs();
3955 struct mallinfo public_mALLINFo()
3957 struct mallinfo m;
3959 if(__malloc_initialized < 0)
3960 ptmalloc_init ();
3961 (void)mutex_lock(&main_arena.mutex);
3962 m = mALLINFo(&main_arena);
3963 (void)mutex_unlock(&main_arena.mutex);
3964 return m;
3968 public_mALLOPt(int p, int v)
3970 int result;
3971 result = mALLOPt(p, v);
3972 return result;
3976 ------------------------------ malloc ------------------------------
3979 Void_t*
3980 _int_malloc(mstate av, size_t bytes)
3982 INTERNAL_SIZE_T nb; /* normalized request size */
3983 unsigned int idx; /* associated bin index */
3984 mbinptr bin; /* associated bin */
3985 mfastbinptr* fb; /* associated fastbin */
3987 mchunkptr victim; /* inspected/selected chunk */
3988 INTERNAL_SIZE_T size; /* its size */
3989 int victim_index; /* its bin index */
3991 mchunkptr remainder; /* remainder from a split */
3992 unsigned long remainder_size; /* its size */
3994 unsigned int block; /* bit map traverser */
3995 unsigned int bit; /* bit map traverser */
3996 unsigned int map; /* current word of binmap */
3998 mchunkptr fwd; /* misc temp for linking */
3999 mchunkptr bck; /* misc temp for linking */
4002 Convert request size to internal form by adding SIZE_SZ bytes
4003 overhead plus possibly more to obtain necessary alignment and/or
4004 to obtain a size of at least MINSIZE, the smallest allocatable
4005 size. Also, checked_request2size traps (returning 0) request sizes
4006 that are so large that they wrap around zero when padded and
4007 aligned.
4010 checked_request2size(bytes, nb);
4013 If the size qualifies as a fastbin, first check corresponding bin.
4014 This code is safe to execute even if av is not yet initialized, so we
4015 can try it without checking, which saves some time on this fast path.
4018 if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
4019 long int idx = fastbin_index(nb);
4020 fb = &(av->fastbins[idx]);
4021 if ( (victim = *fb) != 0) {
4022 if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
4023 malloc_printerr (check_action, "malloc(): memory corruption (fast)",
4024 chunk2mem (victim));
4025 *fb = victim->fd;
4026 check_remalloced_chunk(av, victim, nb);
4027 void *p = chunk2mem(victim);
4028 if (__builtin_expect (perturb_byte, 0))
4029 alloc_perturb (p, bytes);
4030 return p;
4035 If a small request, check regular bin. Since these "smallbins"
4036 hold one size each, no searching within bins is necessary.
4037 (For a large request, we need to wait until unsorted chunks are
4038 processed to find best fit. But for small ones, fits are exact
4039 anyway, so we can check now, which is faster.)
4042 if (in_smallbin_range(nb)) {
4043 idx = smallbin_index(nb);
4044 bin = bin_at(av,idx);
4046 if ( (victim = last(bin)) != bin) {
4047 if (victim == 0) /* initialization check */
4048 malloc_consolidate(av);
4049 else {
4050 bck = victim->bk;
4051 set_inuse_bit_at_offset(victim, nb);
4052 bin->bk = bck;
4053 bck->fd = bin;
4055 if (av != &main_arena)
4056 victim->size |= NON_MAIN_ARENA;
4057 check_malloced_chunk(av, victim, nb);
4058 void *p = chunk2mem(victim);
4059 if (__builtin_expect (perturb_byte, 0))
4060 alloc_perturb (p, bytes);
4061 return p;
4067 If this is a large request, consolidate fastbins before continuing.
4068 While it might look excessive to kill all fastbins before
4069 even seeing if there is space available, this avoids
4070 fragmentation problems normally associated with fastbins.
4071 Also, in practice, programs tend to have runs of either small or
4072 large requests, but less often mixtures, so consolidation is not
4073 invoked all that often in most programs. And the programs that
4074 it is called frequently in otherwise tend to fragment.
4077 else {
4078 idx = largebin_index(nb);
4079 if (have_fastchunks(av))
4080 malloc_consolidate(av);
4084 Process recently freed or remaindered chunks, taking one only if
4085 it is exact fit, or, if this a small request, the chunk is remainder from
4086 the most recent non-exact fit. Place other traversed chunks in
4087 bins. Note that this step is the only place in any routine where
4088 chunks are placed in bins.
4090 The outer loop here is needed because we might not realize until
4091 near the end of malloc that we should have consolidated, so must
4092 do so and retry. This happens at most once, and only when we would
4093 otherwise need to expand memory to service a "small" request.
4096 for(;;) {
4098 int iters = 0;
4099 bool any_larger = false;
4100 while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
4101 bck = victim->bk;
4102 if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
4103 || __builtin_expect (victim->size > av->system_mem, 0))
4104 malloc_printerr (check_action, "malloc(): memory corruption",
4105 chunk2mem (victim));
4106 size = chunksize(victim);
4109 If a small request, try to use last remainder if it is the
4110 only chunk in unsorted bin. This helps promote locality for
4111 runs of consecutive small requests. This is the only
4112 exception to best-fit, and applies only when there is
4113 no exact fit for a small chunk.
4116 if (in_smallbin_range(nb) &&
4117 bck == unsorted_chunks(av) &&
4118 victim == av->last_remainder &&
4119 (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4121 /* split and reattach remainder */
4122 remainder_size = size - nb;
4123 remainder = chunk_at_offset(victim, nb);
4124 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
4125 av->last_remainder = remainder;
4126 remainder->bk = remainder->fd = unsorted_chunks(av);
4128 set_head(victim, nb | PREV_INUSE |
4129 (av != &main_arena ? NON_MAIN_ARENA : 0));
4130 set_head(remainder, remainder_size | PREV_INUSE);
4131 set_foot(remainder, remainder_size);
4133 check_malloced_chunk(av, victim, nb);
4134 void *p = chunk2mem(victim);
4135 if (__builtin_expect (perturb_byte, 0))
4136 alloc_perturb (p, bytes);
4137 return p;
4140 /* remove from unsorted list */
4141 unsorted_chunks(av)->bk = bck;
4142 bck->fd = unsorted_chunks(av);
4144 /* Take now instead of binning if exact fit */
4146 if (size == nb) {
4147 set_inuse_bit_at_offset(victim, size);
4148 if (av != &main_arena)
4149 victim->size |= NON_MAIN_ARENA;
4150 check_malloced_chunk(av, victim, nb);
4151 void *p = chunk2mem(victim);
4152 if (__builtin_expect (perturb_byte, 0))
4153 alloc_perturb (p, bytes);
4154 return p;
4157 /* place chunk in bin */
4159 if (in_smallbin_range(size)) {
4160 victim_index = smallbin_index(size);
4161 bck = bin_at(av, victim_index);
4162 fwd = bck->fd;
4164 else {
4165 victim_index = largebin_index(size);
4166 bck = bin_at(av, victim_index);
4167 fwd = bck->fd;
4169 /* maintain large bins in sorted order */
4170 if (fwd != bck) {
4171 /* Or with inuse bit to speed comparisons */
4172 size |= PREV_INUSE;
4173 /* if smaller than smallest, bypass loop below */
4174 assert((bck->bk->size & NON_MAIN_ARENA) == 0);
4175 if ((unsigned long)(size) <= (unsigned long)(bck->bk->size)) {
4176 fwd = bck;
4177 bck = bck->bk;
4179 else {
4180 assert((fwd->size & NON_MAIN_ARENA) == 0);
4181 while ((unsigned long)(size) < (unsigned long)(fwd->size)) {
4182 fwd = fwd->fd;
4183 assert((fwd->size & NON_MAIN_ARENA) == 0);
4185 bck = fwd->bk;
4190 mark_bin(av, victim_index);
4191 victim->bk = bck;
4192 victim->fd = fwd;
4193 fwd->bk = victim;
4194 bck->fd = victim;
4196 if (size >= nb + MINSIZE)
4197 any_larger = true;
4198 #define MAX_ITERS 10000
4199 if (++iters >= MAX_ITERS)
4200 break;
4204 If a large request, scan through the chunks of current bin in
4205 sorted order to find smallest that fits. This is the only step
4206 where an unbounded number of chunks might be scanned without doing
4207 anything useful with them. However the lists tend to be short.
4210 if (!in_smallbin_range(nb)) {
4211 bin = bin_at(av, idx);
4213 /* skip scan if empty or largest chunk is too small */
4214 if ((victim = last(bin)) != bin &&
4215 (unsigned long)(first(bin)->size) >= (unsigned long)(nb)) {
4217 while (((unsigned long)(size = chunksize(victim)) <
4218 (unsigned long)(nb)))
4219 victim = victim->bk;
4221 remainder_size = size - nb;
4222 unlink(victim, bck, fwd);
4224 /* Exhaust */
4225 if (remainder_size < MINSIZE) {
4226 set_inuse_bit_at_offset(victim, size);
4227 if (av != &main_arena)
4228 victim->size |= NON_MAIN_ARENA;
4230 /* Split */
4231 else {
4232 remainder = chunk_at_offset(victim, nb);
4233 /* We cannot assume the unsorted list is empty and therefore
4234 have to perform a complete insert here. */
4235 bck = unsorted_chunks(av);
4236 fwd = bck->fd;
4237 remainder->bk = bck;
4238 remainder->fd = fwd;
4239 bck->fd = remainder;
4240 fwd->bk = remainder;
4241 set_head(victim, nb | PREV_INUSE |
4242 (av != &main_arena ? NON_MAIN_ARENA : 0));
4243 set_head(remainder, remainder_size | PREV_INUSE);
4244 set_foot(remainder, remainder_size);
4246 check_malloced_chunk(av, victim, nb);
4247 void *p = chunk2mem(victim);
4248 if (__builtin_expect (perturb_byte, 0))
4249 alloc_perturb (p, bytes);
4250 return p;
4255 Search for a chunk by scanning bins, starting with next largest
4256 bin. This search is strictly by best-fit; i.e., the smallest
4257 (with ties going to approximately the least recently used) chunk
4258 that fits is selected.
4260 The bitmap avoids needing to check that most blocks are nonempty.
4261 The particular case of skipping all bins during warm-up phases
4262 when no chunks have been returned yet is faster than it might look.
4265 ++idx;
4266 bin = bin_at(av,idx);
4267 block = idx2block(idx);
4268 map = av->binmap[block];
4269 bit = idx2bit(idx);
4271 for (;;) {
4273 /* Skip rest of block if there are no more set bits in this block. */
4274 if (bit > map || bit == 0) {
4275 do {
4276 if (++block >= BINMAPSIZE) /* out of bins */
4277 goto use_top;
4278 } while ( (map = av->binmap[block]) == 0);
4280 bin = bin_at(av, (block << BINMAPSHIFT));
4281 bit = 1;
4284 /* Advance to bin with set bit. There must be one. */
4285 while ((bit & map) == 0) {
4286 bin = next_bin(bin);
4287 bit <<= 1;
4288 assert(bit != 0);
4291 /* Inspect the bin. It is likely to be non-empty */
4292 victim = last(bin);
4294 /* If a false alarm (empty bin), clear the bit. */
4295 if (victim == bin) {
4296 av->binmap[block] = map &= ~bit; /* Write through */
4297 bin = next_bin(bin);
4298 bit <<= 1;
4301 else {
4302 size = chunksize(victim);
4304 /* We know the first chunk in this bin is big enough to use. */
4305 assert((unsigned long)(size) >= (unsigned long)(nb));
4307 remainder_size = size - nb;
4309 /* unlink */
4310 bck = victim->bk;
4311 bin->bk = bck;
4312 bck->fd = bin;
4314 /* Exhaust */
4315 if (remainder_size < MINSIZE) {
4316 set_inuse_bit_at_offset(victim, size);
4317 if (av != &main_arena)
4318 victim->size |= NON_MAIN_ARENA;
4321 /* Split */
4322 else {
4323 remainder = chunk_at_offset(victim, nb);
4325 /* We cannot assume the unsorted list is empty and therefore
4326 have to perform a complete insert here. */
4327 bck = unsorted_chunks(av);
4328 fwd = bck->fd;
4329 remainder->bk = bck;
4330 remainder->fd = fwd;
4331 bck->fd = remainder;
4332 fwd->bk = remainder;
4334 /* advertise as last remainder */
4335 if (in_smallbin_range(nb))
4336 av->last_remainder = remainder;
4338 set_head(victim, nb | PREV_INUSE |
4339 (av != &main_arena ? NON_MAIN_ARENA : 0));
4340 set_head(remainder, remainder_size | PREV_INUSE);
4341 set_foot(remainder, remainder_size);
4343 check_malloced_chunk(av, victim, nb);
4344 void *p = chunk2mem(victim);
4345 if (__builtin_expect (perturb_byte, 0))
4346 alloc_perturb (p, bytes);
4347 return p;
4351 use_top:
4353 If large enough, split off the chunk bordering the end of memory
4354 (held in av->top). Note that this is in accord with the best-fit
4355 search rule. In effect, av->top is treated as larger (and thus
4356 less well fitting) than any other available chunk since it can
4357 be extended to be as large as necessary (up to system
4358 limitations).
4360 We require that av->top always exists (i.e., has size >=
4361 MINSIZE) after initialization, so if it would otherwise be
4362 exhuasted by current request, it is replenished. (The main
4363 reason for ensuring it exists is that we may need MINSIZE space
4364 to put in fenceposts in sysmalloc.)
4367 victim = av->top;
4368 size = chunksize(victim);
4370 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
4371 remainder_size = size - nb;
4372 remainder = chunk_at_offset(victim, nb);
4373 av->top = remainder;
4374 set_head(victim, nb | PREV_INUSE |
4375 (av != &main_arena ? NON_MAIN_ARENA : 0));
4376 set_head(remainder, remainder_size | PREV_INUSE);
4378 check_malloced_chunk(av, victim, nb);
4379 void *p = chunk2mem(victim);
4380 if (__builtin_expect (perturb_byte, 0))
4381 alloc_perturb (p, bytes);
4382 return p;
4386 If there is space available in fastbins, consolidate and retry,
4387 to possibly avoid expanding memory. This can occur only if nb is
4388 in smallbin range so we didn't consolidate upon entry.
4391 else if (have_fastchunks(av)) {
4392 assert(in_smallbin_range(nb));
4393 malloc_consolidate(av);
4394 idx = smallbin_index(nb); /* restore original bin index */
4398 Otherwise, relay to handle system-dependent cases
4400 else {
4401 void *p = sYSMALLOc(nb, av);
4402 if (__builtin_expect (perturb_byte, 0))
4403 alloc_perturb (p, bytes);
4404 return p;
4410 ------------------------------ free ------------------------------
4413 void
4414 _int_free(mstate av, Void_t* mem)
4416 mchunkptr p; /* chunk corresponding to mem */
4417 INTERNAL_SIZE_T size; /* its size */
4418 mfastbinptr* fb; /* associated fastbin */
4419 mchunkptr nextchunk; /* next contiguous chunk */
4420 INTERNAL_SIZE_T nextsize; /* its size */
4421 int nextinuse; /* true if nextchunk is used */
4422 INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
4423 mchunkptr bck; /* misc temp for linking */
4424 mchunkptr fwd; /* misc temp for linking */
4426 const char *errstr = NULL;
4428 p = mem2chunk(mem);
4429 size = chunksize(p);
4431 /* Little security check which won't hurt performance: the
4432 allocator never wrapps around at the end of the address space.
4433 Therefore we can exclude some size values which might appear
4434 here by accident or by "design" from some intruder. */
4435 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
4436 || __builtin_expect (misaligned_chunk (p), 0))
4438 errstr = "free(): invalid pointer";
4439 errout:
4440 malloc_printerr (check_action, errstr, mem);
4441 return;
4443 /* We know that each chunk is at least MINSIZE bytes in size. */
4444 if (__builtin_expect (size < MINSIZE, 0))
4446 errstr = "free(): invalid size";
4447 goto errout;
4450 check_inuse_chunk(av, p);
4453 If eligible, place chunk on a fastbin so it can be found
4454 and used quickly in malloc.
4457 if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
4459 #if TRIM_FASTBINS
4461 If TRIM_FASTBINS set, don't place chunks
4462 bordering top into fastbins
4464 && (chunk_at_offset(p, size) != av->top)
4465 #endif
4468 if (__builtin_expect (chunk_at_offset (p, size)->size <= 2 * SIZE_SZ, 0)
4469 || __builtin_expect (chunksize (chunk_at_offset (p, size))
4470 >= av->system_mem, 0))
4472 errstr = "free(): invalid next size (fast)";
4473 goto errout;
4476 set_fastchunks(av);
4477 fb = &(av->fastbins[fastbin_index(size)]);
4478 /* Another simple check: make sure the top of the bin is not the
4479 record we are going to add (i.e., double free). */
4480 if (__builtin_expect (*fb == p, 0))
4482 errstr = "double free or corruption (fasttop)";
4483 goto errout;
4486 if (__builtin_expect (perturb_byte, 0))
4487 free_perturb (mem, size - SIZE_SZ);
4489 p->fd = *fb;
4490 *fb = p;
4494 Consolidate other non-mmapped chunks as they arrive.
4497 else if (!chunk_is_mmapped(p)) {
4498 nextchunk = chunk_at_offset(p, size);
4500 /* Lightweight tests: check whether the block is already the
4501 top block. */
4502 if (__builtin_expect (p == av->top, 0))
4504 errstr = "double free or corruption (top)";
4505 goto errout;
4507 /* Or whether the next chunk is beyond the boundaries of the arena. */
4508 if (__builtin_expect (contiguous (av)
4509 && (char *) nextchunk
4510 >= ((char *) av->top + chunksize(av->top)), 0))
4512 errstr = "double free or corruption (out)";
4513 goto errout;
4515 /* Or whether the block is actually not marked used. */
4516 if (__builtin_expect (!prev_inuse(nextchunk), 0))
4518 errstr = "double free or corruption (!prev)";
4519 goto errout;
4522 nextsize = chunksize(nextchunk);
4523 if (__builtin_expect (nextchunk->size <= 2 * SIZE_SZ, 0)
4524 || __builtin_expect (nextsize >= av->system_mem, 0))
4526 errstr = "free(): invalid next size (normal)";
4527 goto errout;
4530 if (__builtin_expect (perturb_byte, 0))
4531 free_perturb (mem, size - SIZE_SZ);
4533 /* consolidate backward */
4534 if (!prev_inuse(p)) {
4535 prevsize = p->prev_size;
4536 size += prevsize;
4537 p = chunk_at_offset(p, -((long) prevsize));
4538 unlink(p, bck, fwd);
4541 if (nextchunk != av->top) {
4542 /* get and clear inuse bit */
4543 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4545 /* consolidate forward */
4546 if (!nextinuse) {
4547 unlink(nextchunk, bck, fwd);
4548 size += nextsize;
4549 } else
4550 clear_inuse_bit_at_offset(nextchunk, 0);
4553 Place the chunk in unsorted chunk list. Chunks are
4554 not placed into regular bins until after they have
4555 been given one chance to be used in malloc.
4558 bck = unsorted_chunks(av);
4559 fwd = bck->fd;
4560 p->bk = bck;
4561 p->fd = fwd;
4562 bck->fd = p;
4563 fwd->bk = p;
4565 set_head(p, size | PREV_INUSE);
4566 set_foot(p, size);
4568 check_free_chunk(av, p);
4572 If the chunk borders the current high end of memory,
4573 consolidate into top
4576 else {
4577 size += nextsize;
4578 set_head(p, size | PREV_INUSE);
4579 av->top = p;
4580 check_chunk(av, p);
4584 If freeing a large space, consolidate possibly-surrounding
4585 chunks. Then, if the total unused topmost memory exceeds trim
4586 threshold, ask malloc_trim to reduce top.
4588 Unless max_fast is 0, we don't know if there are fastbins
4589 bordering top, so we cannot tell for sure whether threshold
4590 has been reached unless fastbins are consolidated. But we
4591 don't want to consolidate on each free. As a compromise,
4592 consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
4593 is reached.
4596 if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
4597 if (have_fastchunks(av))
4598 malloc_consolidate(av);
4600 if (av == &main_arena) {
4601 #ifndef MORECORE_CANNOT_TRIM
4602 if ((unsigned long)(chunksize(av->top)) >=
4603 (unsigned long)(mp_.trim_threshold))
4604 sYSTRIm(mp_.top_pad, av);
4605 #endif
4606 } else {
4607 /* Always try heap_trim(), even if the top chunk is not
4608 large, because the corresponding heap might go away. */
4609 heap_info *heap = heap_for_ptr(top(av));
4611 assert(heap->ar_ptr == av);
4612 heap_trim(heap, mp_.top_pad);
4618 If the chunk was allocated via mmap, release via munmap(). Note
4619 that if HAVE_MMAP is false but chunk_is_mmapped is true, then
4620 user must have overwritten memory. There's nothing we can do to
4621 catch this error unless MALLOC_DEBUG is set, in which case
4622 check_inuse_chunk (above) will have triggered error.
4625 else {
4626 #if HAVE_MMAP
4627 munmap_chunk (p);
4628 #endif
4633 ------------------------- malloc_consolidate -------------------------
4635 malloc_consolidate is a specialized version of free() that tears
4636 down chunks held in fastbins. Free itself cannot be used for this
4637 purpose since, among other things, it might place chunks back onto
4638 fastbins. So, instead, we need to use a minor variant of the same
4639 code.
4641 Also, because this routine needs to be called the first time through
4642 malloc anyway, it turns out to be the perfect place to trigger
4643 initialization code.
4646 #if __STD_C
4647 static void malloc_consolidate(mstate av)
4648 #else
4649 static void malloc_consolidate(av) mstate av;
4650 #endif
4652 mfastbinptr* fb; /* current fastbin being consolidated */
4653 mfastbinptr* maxfb; /* last fastbin (for loop control) */
4654 mchunkptr p; /* current chunk being consolidated */
4655 mchunkptr nextp; /* next chunk to consolidate */
4656 mchunkptr unsorted_bin; /* bin header */
4657 mchunkptr first_unsorted; /* chunk to link to */
4659 /* These have same use as in free() */
4660 mchunkptr nextchunk;
4661 INTERNAL_SIZE_T size;
4662 INTERNAL_SIZE_T nextsize;
4663 INTERNAL_SIZE_T prevsize;
4664 int nextinuse;
4665 mchunkptr bck;
4666 mchunkptr fwd;
4669 If max_fast is 0, we know that av hasn't
4670 yet been initialized, in which case do so below
4673 if (get_max_fast () != 0) {
4674 clear_fastchunks(av);
4676 unsorted_bin = unsorted_chunks(av);
4679 Remove each chunk from fast bin and consolidate it, placing it
4680 then in unsorted bin. Among other reasons for doing this,
4681 placing in unsorted bin avoids needing to calculate actual bins
4682 until malloc is sure that chunks aren't immediately going to be
4683 reused anyway.
4686 maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
4687 fb = &(av->fastbins[0]);
4688 do {
4689 if ( (p = *fb) != 0) {
4690 *fb = 0;
4692 do {
4693 check_inuse_chunk(av, p);
4694 nextp = p->fd;
4696 /* Slightly streamlined version of consolidation code in free() */
4697 size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
4698 nextchunk = chunk_at_offset(p, size);
4699 nextsize = chunksize(nextchunk);
4701 if (!prev_inuse(p)) {
4702 prevsize = p->prev_size;
4703 size += prevsize;
4704 p = chunk_at_offset(p, -((long) prevsize));
4705 unlink(p, bck, fwd);
4708 if (nextchunk != av->top) {
4709 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4711 if (!nextinuse) {
4712 size += nextsize;
4713 unlink(nextchunk, bck, fwd);
4714 } else
4715 clear_inuse_bit_at_offset(nextchunk, 0);
4717 first_unsorted = unsorted_bin->fd;
4718 unsorted_bin->fd = p;
4719 first_unsorted->bk = p;
4721 set_head(p, size | PREV_INUSE);
4722 p->bk = unsorted_bin;
4723 p->fd = first_unsorted;
4724 set_foot(p, size);
4727 else {
4728 size += nextsize;
4729 set_head(p, size | PREV_INUSE);
4730 av->top = p;
4733 } while ( (p = nextp) != 0);
4736 } while (fb++ != maxfb);
4738 else {
4739 malloc_init_state(av);
4740 check_malloc_state(av);
4745 ------------------------------ realloc ------------------------------
4748 Void_t*
4749 _int_realloc(mstate av, Void_t* oldmem, size_t bytes)
4751 INTERNAL_SIZE_T nb; /* padded request size */
4753 mchunkptr oldp; /* chunk corresponding to oldmem */
4754 INTERNAL_SIZE_T oldsize; /* its size */
4756 mchunkptr newp; /* chunk to return */
4757 INTERNAL_SIZE_T newsize; /* its size */
4758 Void_t* newmem; /* corresponding user mem */
4760 mchunkptr next; /* next contiguous chunk after oldp */
4762 mchunkptr remainder; /* extra space at end of newp */
4763 unsigned long remainder_size; /* its size */
4765 mchunkptr bck; /* misc temp for linking */
4766 mchunkptr fwd; /* misc temp for linking */
4768 unsigned long copysize; /* bytes to copy */
4769 unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
4770 INTERNAL_SIZE_T* s; /* copy source */
4771 INTERNAL_SIZE_T* d; /* copy destination */
4773 const char *errstr = NULL;
4776 checked_request2size(bytes, nb);
4778 oldp = mem2chunk(oldmem);
4779 oldsize = chunksize(oldp);
4781 /* Simple tests for old block integrity. */
4782 if (__builtin_expect (misaligned_chunk (oldp), 0))
4784 errstr = "realloc(): invalid pointer";
4785 errout:
4786 malloc_printerr (check_action, errstr, oldmem);
4787 return NULL;
4789 if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0)
4790 || __builtin_expect (oldsize >= av->system_mem, 0))
4792 errstr = "realloc(): invalid old size";
4793 goto errout;
4796 check_inuse_chunk(av, oldp);
4798 if (!chunk_is_mmapped(oldp)) {
4800 next = chunk_at_offset(oldp, oldsize);
4801 INTERNAL_SIZE_T nextsize = chunksize(next);
4802 if (__builtin_expect (next->size <= 2 * SIZE_SZ, 0)
4803 || __builtin_expect (nextsize >= av->system_mem, 0))
4805 errstr = "realloc(): invalid next size";
4806 goto errout;
4809 if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
4810 /* already big enough; split below */
4811 newp = oldp;
4812 newsize = oldsize;
4815 else {
4816 /* Try to expand forward into top */
4817 if (next == av->top &&
4818 (unsigned long)(newsize = oldsize + nextsize) >=
4819 (unsigned long)(nb + MINSIZE)) {
4820 set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4821 av->top = chunk_at_offset(oldp, nb);
4822 set_head(av->top, (newsize - nb) | PREV_INUSE);
4823 check_inuse_chunk(av, oldp);
4824 return chunk2mem(oldp);
4827 /* Try to expand forward into next chunk; split off remainder below */
4828 else if (next != av->top &&
4829 !inuse(next) &&
4830 (unsigned long)(newsize = oldsize + nextsize) >=
4831 (unsigned long)(nb)) {
4832 newp = oldp;
4833 unlink(next, bck, fwd);
4836 /* allocate, copy, free */
4837 else {
4838 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4839 if (newmem == 0)
4840 return 0; /* propagate failure */
4842 newp = mem2chunk(newmem);
4843 newsize = chunksize(newp);
4846 Avoid copy if newp is next chunk after oldp.
4848 if (newp == next) {
4849 newsize += oldsize;
4850 newp = oldp;
4852 else {
4854 Unroll copy of <= 36 bytes (72 if 8byte sizes)
4855 We know that contents have an odd number of
4856 INTERNAL_SIZE_T-sized words; minimally 3.
4859 copysize = oldsize - SIZE_SZ;
4860 s = (INTERNAL_SIZE_T*)(oldmem);
4861 d = (INTERNAL_SIZE_T*)(newmem);
4862 ncopies = copysize / sizeof(INTERNAL_SIZE_T);
4863 assert(ncopies >= 3);
4865 if (ncopies > 9)
4866 MALLOC_COPY(d, s, copysize);
4868 else {
4869 *(d+0) = *(s+0);
4870 *(d+1) = *(s+1);
4871 *(d+2) = *(s+2);
4872 if (ncopies > 4) {
4873 *(d+3) = *(s+3);
4874 *(d+4) = *(s+4);
4875 if (ncopies > 6) {
4876 *(d+5) = *(s+5);
4877 *(d+6) = *(s+6);
4878 if (ncopies > 8) {
4879 *(d+7) = *(s+7);
4880 *(d+8) = *(s+8);
4886 _int_free(av, oldmem);
4887 check_inuse_chunk(av, newp);
4888 return chunk2mem(newp);
4893 /* If possible, free extra space in old or extended chunk */
4895 assert((unsigned long)(newsize) >= (unsigned long)(nb));
4897 remainder_size = newsize - nb;
4899 if (remainder_size < MINSIZE) { /* not enough extra to split off */
4900 set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
4901 set_inuse_bit_at_offset(newp, newsize);
4903 else { /* split remainder */
4904 remainder = chunk_at_offset(newp, nb);
4905 set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4906 set_head(remainder, remainder_size | PREV_INUSE |
4907 (av != &main_arena ? NON_MAIN_ARENA : 0));
4908 /* Mark remainder as inuse so free() won't complain */
4909 set_inuse_bit_at_offset(remainder, remainder_size);
4910 _int_free(av, chunk2mem(remainder));
4913 check_inuse_chunk(av, newp);
4914 return chunk2mem(newp);
4918 Handle mmap cases
4921 else {
4922 #if HAVE_MMAP
4924 #if HAVE_MREMAP
4925 INTERNAL_SIZE_T offset = oldp->prev_size;
4926 size_t pagemask = mp_.pagesize - 1;
4927 char *cp;
4928 unsigned long sum;
4930 /* Note the extra SIZE_SZ overhead */
4931 newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
4933 /* don't need to remap if still within same page */
4934 if (oldsize == newsize - offset)
4935 return oldmem;
4937 cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
4939 if (cp != MAP_FAILED) {
4941 newp = (mchunkptr)(cp + offset);
4942 set_head(newp, (newsize - offset)|IS_MMAPPED);
4944 assert(aligned_OK(chunk2mem(newp)));
4945 assert((newp->prev_size == offset));
4947 /* update statistics */
4948 sum = mp_.mmapped_mem += newsize - oldsize;
4949 if (sum > (unsigned long)(mp_.max_mmapped_mem))
4950 mp_.max_mmapped_mem = sum;
4951 #ifdef NO_THREADS
4952 sum += main_arena.system_mem;
4953 if (sum > (unsigned long)(mp_.max_total_mem))
4954 mp_.max_total_mem = sum;
4955 #endif
4957 return chunk2mem(newp);
4959 #endif
4961 /* Note the extra SIZE_SZ overhead. */
4962 if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
4963 newmem = oldmem; /* do nothing */
4964 else {
4965 /* Must alloc, copy, free. */
4966 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4967 if (newmem != 0) {
4968 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
4969 _int_free(av, oldmem);
4972 return newmem;
4974 #else
4975 /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
4976 check_malloc_state(av);
4977 MALLOC_FAILURE_ACTION;
4978 return 0;
4979 #endif
4984 ------------------------------ memalign ------------------------------
4987 Void_t*
4988 _int_memalign(mstate av, size_t alignment, size_t bytes)
4990 INTERNAL_SIZE_T nb; /* padded request size */
4991 char* m; /* memory returned by malloc call */
4992 mchunkptr p; /* corresponding chunk */
4993 char* brk; /* alignment point within p */
4994 mchunkptr newp; /* chunk to return */
4995 INTERNAL_SIZE_T newsize; /* its size */
4996 INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
4997 mchunkptr remainder; /* spare room at end to split off */
4998 unsigned long remainder_size; /* its size */
4999 INTERNAL_SIZE_T size;
5001 /* If need less alignment than we give anyway, just relay to malloc */
5003 if (alignment <= MALLOC_ALIGNMENT) return _int_malloc(av, bytes);
5005 /* Otherwise, ensure that it is at least a minimum chunk size */
5007 if (alignment < MINSIZE) alignment = MINSIZE;
5009 /* Make sure alignment is power of 2 (in case MINSIZE is not). */
5010 if ((alignment & (alignment - 1)) != 0) {
5011 size_t a = MALLOC_ALIGNMENT * 2;
5012 while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
5013 alignment = a;
5016 checked_request2size(bytes, nb);
5019 Strategy: find a spot within that chunk that meets the alignment
5020 request, and then possibly free the leading and trailing space.
5024 /* Call malloc with worst case padding to hit alignment. */
5026 m = (char*)(_int_malloc(av, nb + alignment + MINSIZE));
5028 if (m == 0) return 0; /* propagate failure */
5030 p = mem2chunk(m);
5032 if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
5035 Find an aligned spot inside chunk. Since we need to give back
5036 leading space in a chunk of at least MINSIZE, if the first
5037 calculation places us at a spot with less than MINSIZE leader,
5038 we can move to the next aligned spot -- we've allocated enough
5039 total room so that this is always possible.
5042 brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
5043 -((signed long) alignment));
5044 if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
5045 brk += alignment;
5047 newp = (mchunkptr)brk;
5048 leadsize = brk - (char*)(p);
5049 newsize = chunksize(p) - leadsize;
5051 /* For mmapped chunks, just adjust offset */
5052 if (chunk_is_mmapped(p)) {
5053 newp->prev_size = p->prev_size + leadsize;
5054 set_head(newp, newsize|IS_MMAPPED);
5055 return chunk2mem(newp);
5058 /* Otherwise, give back leader, use the rest */
5059 set_head(newp, newsize | PREV_INUSE |
5060 (av != &main_arena ? NON_MAIN_ARENA : 0));
5061 set_inuse_bit_at_offset(newp, newsize);
5062 set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5063 _int_free(av, chunk2mem(p));
5064 p = newp;
5066 assert (newsize >= nb &&
5067 (((unsigned long)(chunk2mem(p))) % alignment) == 0);
5070 /* Also give back spare room at the end */
5071 if (!chunk_is_mmapped(p)) {
5072 size = chunksize(p);
5073 if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
5074 remainder_size = size - nb;
5075 remainder = chunk_at_offset(p, nb);
5076 set_head(remainder, remainder_size | PREV_INUSE |
5077 (av != &main_arena ? NON_MAIN_ARENA : 0));
5078 set_head_size(p, nb);
5079 _int_free(av, chunk2mem(remainder));
5083 check_inuse_chunk(av, p);
5084 return chunk2mem(p);
5087 #if 0
5089 ------------------------------ calloc ------------------------------
5092 #if __STD_C
5093 Void_t* cALLOc(size_t n_elements, size_t elem_size)
5094 #else
5095 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
5096 #endif
5098 mchunkptr p;
5099 unsigned long clearsize;
5100 unsigned long nclears;
5101 INTERNAL_SIZE_T* d;
5103 Void_t* mem = mALLOc(n_elements * elem_size);
5105 if (mem != 0) {
5106 p = mem2chunk(mem);
5108 #if MMAP_CLEARS
5109 if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
5110 #endif
5113 Unroll clear of <= 36 bytes (72 if 8byte sizes)
5114 We know that contents have an odd number of
5115 INTERNAL_SIZE_T-sized words; minimally 3.
5118 d = (INTERNAL_SIZE_T*)mem;
5119 clearsize = chunksize(p) - SIZE_SZ;
5120 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
5121 assert(nclears >= 3);
5123 if (nclears > 9)
5124 MALLOC_ZERO(d, clearsize);
5126 else {
5127 *(d+0) = 0;
5128 *(d+1) = 0;
5129 *(d+2) = 0;
5130 if (nclears > 4) {
5131 *(d+3) = 0;
5132 *(d+4) = 0;
5133 if (nclears > 6) {
5134 *(d+5) = 0;
5135 *(d+6) = 0;
5136 if (nclears > 8) {
5137 *(d+7) = 0;
5138 *(d+8) = 0;
5145 return mem;
5147 #endif /* 0 */
5149 #ifndef _LIBC
5151 ------------------------- independent_calloc -------------------------
5154 Void_t**
5155 #if __STD_C
5156 _int_icalloc(mstate av, size_t n_elements, size_t elem_size, Void_t* chunks[])
5157 #else
5158 _int_icalloc(av, n_elements, elem_size, chunks)
5159 mstate av; size_t n_elements; size_t elem_size; Void_t* chunks[];
5160 #endif
5162 size_t sz = elem_size; /* serves as 1-element array */
5163 /* opts arg of 3 means all elements are same size, and should be cleared */
5164 return iALLOc(av, n_elements, &sz, 3, chunks);
5168 ------------------------- independent_comalloc -------------------------
5171 Void_t**
5172 #if __STD_C
5173 _int_icomalloc(mstate av, size_t n_elements, size_t sizes[], Void_t* chunks[])
5174 #else
5175 _int_icomalloc(av, n_elements, sizes, chunks)
5176 mstate av; size_t n_elements; size_t sizes[]; Void_t* chunks[];
5177 #endif
5179 return iALLOc(av, n_elements, sizes, 0, chunks);
5184 ------------------------------ ialloc ------------------------------
5185 ialloc provides common support for independent_X routines, handling all of
5186 the combinations that can result.
5188 The opts arg has:
5189 bit 0 set if all elements are same size (using sizes[0])
5190 bit 1 set if elements should be zeroed
5194 static Void_t**
5195 #if __STD_C
5196 iALLOc(mstate av, size_t n_elements, size_t* sizes, int opts, Void_t* chunks[])
5197 #else
5198 iALLOc(av, n_elements, sizes, opts, chunks)
5199 mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
5200 #endif
5202 INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
5203 INTERNAL_SIZE_T contents_size; /* total size of elements */
5204 INTERNAL_SIZE_T array_size; /* request size of pointer array */
5205 Void_t* mem; /* malloced aggregate space */
5206 mchunkptr p; /* corresponding chunk */
5207 INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
5208 Void_t** marray; /* either "chunks" or malloced ptr array */
5209 mchunkptr array_chunk; /* chunk for malloced ptr array */
5210 int mmx; /* to disable mmap */
5211 INTERNAL_SIZE_T size;
5212 INTERNAL_SIZE_T size_flags;
5213 size_t i;
5215 /* Ensure initialization/consolidation */
5216 if (have_fastchunks(av)) malloc_consolidate(av);
5218 /* compute array length, if needed */
5219 if (chunks != 0) {
5220 if (n_elements == 0)
5221 return chunks; /* nothing to do */
5222 marray = chunks;
5223 array_size = 0;
5225 else {
5226 /* if empty req, must still return chunk representing empty array */
5227 if (n_elements == 0)
5228 return (Void_t**) _int_malloc(av, 0);
5229 marray = 0;
5230 array_size = request2size(n_elements * (sizeof(Void_t*)));
5233 /* compute total element size */
5234 if (opts & 0x1) { /* all-same-size */
5235 element_size = request2size(*sizes);
5236 contents_size = n_elements * element_size;
5238 else { /* add up all the sizes */
5239 element_size = 0;
5240 contents_size = 0;
5241 for (i = 0; i != n_elements; ++i)
5242 contents_size += request2size(sizes[i]);
5245 /* subtract out alignment bytes from total to minimize overallocation */
5246 size = contents_size + array_size - MALLOC_ALIGN_MASK;
5249 Allocate the aggregate chunk.
5250 But first disable mmap so malloc won't use it, since
5251 we would not be able to later free/realloc space internal
5252 to a segregated mmap region.
5254 mmx = mp_.n_mmaps_max; /* disable mmap */
5255 mp_.n_mmaps_max = 0;
5256 mem = _int_malloc(av, size);
5257 mp_.n_mmaps_max = mmx; /* reset mmap */
5258 if (mem == 0)
5259 return 0;
5261 p = mem2chunk(mem);
5262 assert(!chunk_is_mmapped(p));
5263 remainder_size = chunksize(p);
5265 if (opts & 0x2) { /* optionally clear the elements */
5266 MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
5269 size_flags = PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0);
5271 /* If not provided, allocate the pointer array as final part of chunk */
5272 if (marray == 0) {
5273 array_chunk = chunk_at_offset(p, contents_size);
5274 marray = (Void_t**) (chunk2mem(array_chunk));
5275 set_head(array_chunk, (remainder_size - contents_size) | size_flags);
5276 remainder_size = contents_size;
5279 /* split out elements */
5280 for (i = 0; ; ++i) {
5281 marray[i] = chunk2mem(p);
5282 if (i != n_elements-1) {
5283 if (element_size != 0)
5284 size = element_size;
5285 else
5286 size = request2size(sizes[i]);
5287 remainder_size -= size;
5288 set_head(p, size | size_flags);
5289 p = chunk_at_offset(p, size);
5291 else { /* the final element absorbs any overallocation slop */
5292 set_head(p, remainder_size | size_flags);
5293 break;
5297 #if MALLOC_DEBUG
5298 if (marray != chunks) {
5299 /* final element must have exactly exhausted chunk */
5300 if (element_size != 0)
5301 assert(remainder_size == element_size);
5302 else
5303 assert(remainder_size == request2size(sizes[i]));
5304 check_inuse_chunk(av, mem2chunk(marray));
5307 for (i = 0; i != n_elements; ++i)
5308 check_inuse_chunk(av, mem2chunk(marray[i]));
5309 #endif
5311 return marray;
5313 #endif /* _LIBC */
5317 ------------------------------ valloc ------------------------------
5320 Void_t*
5321 #if __STD_C
5322 _int_valloc(mstate av, size_t bytes)
5323 #else
5324 _int_valloc(av, bytes) mstate av; size_t bytes;
5325 #endif
5327 /* Ensure initialization/consolidation */
5328 if (have_fastchunks(av)) malloc_consolidate(av);
5329 return _int_memalign(av, mp_.pagesize, bytes);
5333 ------------------------------ pvalloc ------------------------------
5337 Void_t*
5338 #if __STD_C
5339 _int_pvalloc(mstate av, size_t bytes)
5340 #else
5341 _int_pvalloc(av, bytes) mstate av, size_t bytes;
5342 #endif
5344 size_t pagesz;
5346 /* Ensure initialization/consolidation */
5347 if (have_fastchunks(av)) malloc_consolidate(av);
5348 pagesz = mp_.pagesize;
5349 return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
5354 ------------------------------ malloc_trim ------------------------------
5357 #if __STD_C
5358 int mTRIm(size_t pad)
5359 #else
5360 int mTRIm(pad) size_t pad;
5361 #endif
5363 mstate av = &main_arena; /* already locked */
5365 /* Ensure initialization/consolidation */
5366 malloc_consolidate(av);
5368 #ifndef MORECORE_CANNOT_TRIM
5369 return sYSTRIm(pad, av);
5370 #else
5371 return 0;
5372 #endif
5377 ------------------------- malloc_usable_size -------------------------
5380 #if __STD_C
5381 size_t mUSABLe(Void_t* mem)
5382 #else
5383 size_t mUSABLe(mem) Void_t* mem;
5384 #endif
5386 mchunkptr p;
5387 if (mem != 0) {
5388 p = mem2chunk(mem);
5389 if (chunk_is_mmapped(p))
5390 return chunksize(p) - 2*SIZE_SZ;
5391 else if (inuse(p))
5392 return chunksize(p) - SIZE_SZ;
5394 return 0;
5398 ------------------------------ mallinfo ------------------------------
5401 struct mallinfo mALLINFo(mstate av)
5403 struct mallinfo mi;
5404 size_t i;
5405 mbinptr b;
5406 mchunkptr p;
5407 INTERNAL_SIZE_T avail;
5408 INTERNAL_SIZE_T fastavail;
5409 int nblocks;
5410 int nfastblocks;
5412 /* Ensure initialization */
5413 if (av->top == 0) malloc_consolidate(av);
5415 check_malloc_state(av);
5417 /* Account for top */
5418 avail = chunksize(av->top);
5419 nblocks = 1; /* top always exists */
5421 /* traverse fastbins */
5422 nfastblocks = 0;
5423 fastavail = 0;
5425 for (i = 0; i < NFASTBINS; ++i) {
5426 for (p = av->fastbins[i]; p != 0; p = p->fd) {
5427 ++nfastblocks;
5428 fastavail += chunksize(p);
5432 avail += fastavail;
5434 /* traverse regular bins */
5435 for (i = 1; i < NBINS; ++i) {
5436 b = bin_at(av, i);
5437 for (p = last(b); p != b; p = p->bk) {
5438 ++nblocks;
5439 avail += chunksize(p);
5443 mi.smblks = nfastblocks;
5444 mi.ordblks = nblocks;
5445 mi.fordblks = avail;
5446 mi.uordblks = av->system_mem - avail;
5447 mi.arena = av->system_mem;
5448 mi.hblks = mp_.n_mmaps;
5449 mi.hblkhd = mp_.mmapped_mem;
5450 mi.fsmblks = fastavail;
5451 mi.keepcost = chunksize(av->top);
5452 mi.usmblks = mp_.max_total_mem;
5453 return mi;
5457 ------------------------------ malloc_stats ------------------------------
5460 void mSTATs()
5462 int i;
5463 mstate ar_ptr;
5464 struct mallinfo mi;
5465 unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
5466 #if THREAD_STATS
5467 long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
5468 #endif
5470 if(__malloc_initialized < 0)
5471 ptmalloc_init ();
5472 #ifdef _LIBC
5473 _IO_flockfile (stderr);
5474 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
5475 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
5476 #endif
5477 for (i=0, ar_ptr = &main_arena;; i++) {
5478 (void)mutex_lock(&ar_ptr->mutex);
5479 mi = mALLINFo(ar_ptr);
5480 fprintf(stderr, "Arena %d:\n", i);
5481 fprintf(stderr, "system bytes = %10u\n", (unsigned int)mi.arena);
5482 fprintf(stderr, "in use bytes = %10u\n", (unsigned int)mi.uordblks);
5483 #if MALLOC_DEBUG > 1
5484 if (i > 0)
5485 dump_heap(heap_for_ptr(top(ar_ptr)));
5486 #endif
5487 system_b += mi.arena;
5488 in_use_b += mi.uordblks;
5489 #if THREAD_STATS
5490 stat_lock_direct += ar_ptr->stat_lock_direct;
5491 stat_lock_loop += ar_ptr->stat_lock_loop;
5492 stat_lock_wait += ar_ptr->stat_lock_wait;
5493 #endif
5494 (void)mutex_unlock(&ar_ptr->mutex);
5495 ar_ptr = ar_ptr->next;
5496 if(ar_ptr == &main_arena) break;
5498 #if HAVE_MMAP
5499 fprintf(stderr, "Total (incl. mmap):\n");
5500 #else
5501 fprintf(stderr, "Total:\n");
5502 #endif
5503 fprintf(stderr, "system bytes = %10u\n", system_b);
5504 fprintf(stderr, "in use bytes = %10u\n", in_use_b);
5505 #ifdef NO_THREADS
5506 fprintf(stderr, "max system bytes = %10u\n", (unsigned int)mp_.max_total_mem);
5507 #endif
5508 #if HAVE_MMAP
5509 fprintf(stderr, "max mmap regions = %10u\n", (unsigned int)mp_.max_n_mmaps);
5510 fprintf(stderr, "max mmap bytes = %10lu\n",
5511 (unsigned long)mp_.max_mmapped_mem);
5512 #endif
5513 #if THREAD_STATS
5514 fprintf(stderr, "heaps created = %10d\n", stat_n_heaps);
5515 fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
5516 fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
5517 fprintf(stderr, "locked waiting = %10ld\n", stat_lock_wait);
5518 fprintf(stderr, "locked total = %10ld\n",
5519 stat_lock_direct + stat_lock_loop + stat_lock_wait);
5520 #endif
5521 #ifdef _LIBC
5522 ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
5523 _IO_funlockfile (stderr);
5524 #endif
5529 ------------------------------ mallopt ------------------------------
5532 #if __STD_C
5533 int mALLOPt(int param_number, int value)
5534 #else
5535 int mALLOPt(param_number, value) int param_number; int value;
5536 #endif
5538 mstate av = &main_arena;
5539 int res = 1;
5541 if(__malloc_initialized < 0)
5542 ptmalloc_init ();
5543 (void)mutex_lock(&av->mutex);
5544 /* Ensure initialization/consolidation */
5545 malloc_consolidate(av);
5547 switch(param_number) {
5548 case M_MXFAST:
5549 if (value >= 0 && value <= MAX_FAST_SIZE) {
5550 set_max_fast(value);
5552 else
5553 res = 0;
5554 break;
5556 case M_TRIM_THRESHOLD:
5557 mp_.trim_threshold = value;
5558 mp_.no_dyn_threshold = 1;
5559 break;
5561 case M_TOP_PAD:
5562 mp_.top_pad = value;
5563 mp_.no_dyn_threshold = 1;
5564 break;
5566 case M_MMAP_THRESHOLD:
5567 #if USE_ARENAS
5568 /* Forbid setting the threshold too high. */
5569 if((unsigned long)value > HEAP_MAX_SIZE/2)
5570 res = 0;
5571 else
5572 #endif
5573 mp_.mmap_threshold = value;
5574 mp_.no_dyn_threshold = 1;
5575 break;
5577 case M_MMAP_MAX:
5578 #if !HAVE_MMAP
5579 if (value != 0)
5580 res = 0;
5581 else
5582 #endif
5583 mp_.n_mmaps_max = value;
5584 mp_.no_dyn_threshold = 1;
5585 break;
5587 case M_CHECK_ACTION:
5588 check_action = value;
5589 break;
5591 case M_PERTURB:
5592 perturb_byte = value;
5593 break;
5595 (void)mutex_unlock(&av->mutex);
5596 return res;
5601 -------------------- Alternative MORECORE functions --------------------
5606 General Requirements for MORECORE.
5608 The MORECORE function must have the following properties:
5610 If MORECORE_CONTIGUOUS is false:
5612 * MORECORE must allocate in multiples of pagesize. It will
5613 only be called with arguments that are multiples of pagesize.
5615 * MORECORE(0) must return an address that is at least
5616 MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
5618 else (i.e. If MORECORE_CONTIGUOUS is true):
5620 * Consecutive calls to MORECORE with positive arguments
5621 return increasing addresses, indicating that space has been
5622 contiguously extended.
5624 * MORECORE need not allocate in multiples of pagesize.
5625 Calls to MORECORE need not have args of multiples of pagesize.
5627 * MORECORE need not page-align.
5629 In either case:
5631 * MORECORE may allocate more memory than requested. (Or even less,
5632 but this will generally result in a malloc failure.)
5634 * MORECORE must not allocate memory when given argument zero, but
5635 instead return one past the end address of memory from previous
5636 nonzero call. This malloc does NOT call MORECORE(0)
5637 until at least one call with positive arguments is made, so
5638 the initial value returned is not important.
5640 * Even though consecutive calls to MORECORE need not return contiguous
5641 addresses, it must be OK for malloc'ed chunks to span multiple
5642 regions in those cases where they do happen to be contiguous.
5644 * MORECORE need not handle negative arguments -- it may instead
5645 just return MORECORE_FAILURE when given negative arguments.
5646 Negative arguments are always multiples of pagesize. MORECORE
5647 must not misinterpret negative args as large positive unsigned
5648 args. You can suppress all such calls from even occurring by defining
5649 MORECORE_CANNOT_TRIM,
5651 There is some variation across systems about the type of the
5652 argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
5653 actually be size_t, because sbrk supports negative args, so it is
5654 normally the signed type of the same width as size_t (sometimes
5655 declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
5656 matter though. Internally, we use "long" as arguments, which should
5657 work across all reasonable possibilities.
5659 Additionally, if MORECORE ever returns failure for a positive
5660 request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
5661 system allocator. This is a useful backup strategy for systems with
5662 holes in address spaces -- in this case sbrk cannot contiguously
5663 expand the heap, but mmap may be able to map noncontiguous space.
5665 If you'd like mmap to ALWAYS be used, you can define MORECORE to be
5666 a function that always returns MORECORE_FAILURE.
5668 If you are using this malloc with something other than sbrk (or its
5669 emulation) to supply memory regions, you probably want to set
5670 MORECORE_CONTIGUOUS as false. As an example, here is a custom
5671 allocator kindly contributed for pre-OSX macOS. It uses virtually
5672 but not necessarily physically contiguous non-paged memory (locked
5673 in, present and won't get swapped out). You can use it by
5674 uncommenting this section, adding some #includes, and setting up the
5675 appropriate defines above:
5677 #define MORECORE osMoreCore
5678 #define MORECORE_CONTIGUOUS 0
5680 There is also a shutdown routine that should somehow be called for
5681 cleanup upon program exit.
5683 #define MAX_POOL_ENTRIES 100
5684 #define MINIMUM_MORECORE_SIZE (64 * 1024)
5685 static int next_os_pool;
5686 void *our_os_pools[MAX_POOL_ENTRIES];
5688 void *osMoreCore(int size)
5690 void *ptr = 0;
5691 static void *sbrk_top = 0;
5693 if (size > 0)
5695 if (size < MINIMUM_MORECORE_SIZE)
5696 size = MINIMUM_MORECORE_SIZE;
5697 if (CurrentExecutionLevel() == kTaskLevel)
5698 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
5699 if (ptr == 0)
5701 return (void *) MORECORE_FAILURE;
5703 // save ptrs so they can be freed during cleanup
5704 our_os_pools[next_os_pool] = ptr;
5705 next_os_pool++;
5706 ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
5707 sbrk_top = (char *) ptr + size;
5708 return ptr;
5710 else if (size < 0)
5712 // we don't currently support shrink behavior
5713 return (void *) MORECORE_FAILURE;
5715 else
5717 return sbrk_top;
5721 // cleanup any allocated memory pools
5722 // called as last thing before shutting down driver
5724 void osCleanupMem(void)
5726 void **ptr;
5728 for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
5729 if (*ptr)
5731 PoolDeallocate(*ptr);
5732 *ptr = 0;
5739 /* Helper code. */
5741 extern char **__libc_argv attribute_hidden;
5743 static void
5744 malloc_printerr(int action, const char *str, void *ptr)
5746 if ((action & 5) == 5)
5747 __libc_message (action & 2, "%s\n", str);
5748 else if (action & 1)
5750 char buf[2 * sizeof (uintptr_t) + 1];
5752 buf[sizeof (buf) - 1] = '\0';
5753 char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
5754 while (cp > buf)
5755 *--cp = '0';
5757 __libc_message (action & 2,
5758 "*** glibc detected *** %s: %s: 0x%s ***\n",
5759 __libc_argv[0] ?: "<unknown>", str, cp);
5761 else if (action & 2)
5762 abort ();
5765 #ifdef _LIBC
5766 # include <sys/param.h>
5768 /* We need a wrapper function for one of the additions of POSIX. */
5770 __posix_memalign (void **memptr, size_t alignment, size_t size)
5772 void *mem;
5773 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
5774 __const __malloc_ptr_t)) =
5775 __memalign_hook;
5777 /* Test whether the SIZE argument is valid. It must be a power of
5778 two multiple of sizeof (void *). */
5779 if (alignment % sizeof (void *) != 0
5780 || !powerof2 (alignment / sizeof (void *)) != 0
5781 || alignment == 0)
5782 return EINVAL;
5784 /* Call the hook here, so that caller is posix_memalign's caller
5785 and not posix_memalign itself. */
5786 if (hook != NULL)
5787 mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
5788 else
5789 mem = public_mEMALIGn (alignment, size);
5791 if (mem != NULL) {
5792 *memptr = mem;
5793 return 0;
5796 return ENOMEM;
5798 weak_alias (__posix_memalign, posix_memalign)
5800 strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
5801 strong_alias (__libc_free, __cfree) weak_alias (__libc_free, cfree)
5802 strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
5803 strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
5804 strong_alias (__libc_memalign, __memalign)
5805 weak_alias (__libc_memalign, memalign)
5806 strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
5807 strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
5808 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
5809 strong_alias (__libc_mallinfo, __mallinfo)
5810 weak_alias (__libc_mallinfo, mallinfo)
5811 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
5813 weak_alias (__malloc_stats, malloc_stats)
5814 weak_alias (__malloc_usable_size, malloc_usable_size)
5815 weak_alias (__malloc_trim, malloc_trim)
5816 weak_alias (__malloc_get_state, malloc_get_state)
5817 weak_alias (__malloc_set_state, malloc_set_state)
5819 #endif /* _LIBC */
5821 /* ------------------------------------------------------------
5822 History:
5824 [see ftp://g.oswego.edu/pub/misc/malloc.c for the history of dlmalloc]
5828 * Local variables:
5829 * c-basic-offset: 2
5830 * End: