[BZ #2510, BZ #2830, BZ #3137, BZ #3313, BZ #3426, BZ #3465, BZ #3480, BZ #3483,...
[glibc.git] / malloc / malloc.c
blob6427608a79f10f8f74cf17b9befc6e5641644831
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 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 /* The following test can only be performed for the main arena.
2745 While mallopt calls malloc_consolidate to get rid of all fast
2746 bins (especially those larger than the new maximum) this does
2747 only happen for the main arena. Trying to do this for any
2748 other arena would mean those arenas have to be locked and
2749 malloc_consolidate be called for them. This is excessive. And
2750 even if this is acceptable to somebody it still cannot solve
2751 the problem completely since if the arena is locked a
2752 concurrent malloc call might create a new arena which then
2753 could use the newly invalid fast bins. */
2755 /* all bins past max_fast are empty */
2756 if (av == &main_arena && i > max_fast_bin)
2757 assert(p == 0);
2759 while (p != 0) {
2760 /* each chunk claims to be inuse */
2761 do_check_inuse_chunk(av, p);
2762 total += chunksize(p);
2763 /* chunk belongs in this bin */
2764 assert(fastbin_index(chunksize(p)) == i);
2765 p = p->fd;
2769 if (total != 0)
2770 assert(have_fastchunks(av));
2771 else if (!have_fastchunks(av))
2772 assert(total == 0);
2774 /* check normal bins */
2775 for (i = 1; i < NBINS; ++i) {
2776 b = bin_at(av,i);
2778 /* binmap is accurate (except for bin 1 == unsorted_chunks) */
2779 if (i >= 2) {
2780 binbit = get_binmap(av,i);
2781 empty = last(b) == b;
2782 if (!binbit)
2783 assert(empty);
2784 else if (!empty)
2785 assert(binbit);
2788 for (p = last(b); p != b; p = p->bk) {
2789 /* each chunk claims to be free */
2790 do_check_free_chunk(av, p);
2791 size = chunksize(p);
2792 total += size;
2793 if (i >= 2) {
2794 /* chunk belongs in bin */
2795 idx = bin_index(size);
2796 assert(idx == i);
2797 /* lists are sorted */
2798 assert(p->bk == b ||
2799 (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
2801 /* chunk is followed by a legal chain of inuse chunks */
2802 for (q = next_chunk(p);
2803 (q != av->top && inuse(q) &&
2804 (unsigned long)(chunksize(q)) >= MINSIZE);
2805 q = next_chunk(q))
2806 do_check_inuse_chunk(av, q);
2810 /* top chunk is OK */
2811 check_chunk(av, av->top);
2813 /* sanity checks for statistics */
2815 #ifdef NO_THREADS
2816 assert(total <= (unsigned long)(mp_.max_total_mem));
2817 assert(mp_.n_mmaps >= 0);
2818 #endif
2819 assert(mp_.n_mmaps <= mp_.n_mmaps_max);
2820 assert(mp_.n_mmaps <= mp_.max_n_mmaps);
2822 assert((unsigned long)(av->system_mem) <=
2823 (unsigned long)(av->max_system_mem));
2825 assert((unsigned long)(mp_.mmapped_mem) <=
2826 (unsigned long)(mp_.max_mmapped_mem));
2828 #ifdef NO_THREADS
2829 assert((unsigned long)(mp_.max_total_mem) >=
2830 (unsigned long)(mp_.mmapped_mem) + (unsigned long)(av->system_mem));
2831 #endif
2833 #endif
2836 /* ----------------- Support for debugging hooks -------------------- */
2837 #include "hooks.c"
2840 /* ----------- Routines dealing with system allocation -------------- */
2843 sysmalloc handles malloc cases requiring more memory from the system.
2844 On entry, it is assumed that av->top does not have enough
2845 space to service request for nb bytes, thus requiring that av->top
2846 be extended or replaced.
2849 #if __STD_C
2850 static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
2851 #else
2852 static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
2853 #endif
2855 mchunkptr old_top; /* incoming value of av->top */
2856 INTERNAL_SIZE_T old_size; /* its size */
2857 char* old_end; /* its end address */
2859 long size; /* arg to first MORECORE or mmap call */
2860 char* brk; /* return value from MORECORE */
2862 long correction; /* arg to 2nd MORECORE call */
2863 char* snd_brk; /* 2nd return val */
2865 INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
2866 INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
2867 char* aligned_brk; /* aligned offset into brk */
2869 mchunkptr p; /* the allocated/returned chunk */
2870 mchunkptr remainder; /* remainder from allocation */
2871 unsigned long remainder_size; /* its size */
2873 unsigned long sum; /* for updating stats */
2875 size_t pagemask = mp_.pagesize - 1;
2876 bool tried_mmap = false;
2879 #if HAVE_MMAP
2882 If have mmap, and the request size meets the mmap threshold, and
2883 the system supports mmap, and there are few enough currently
2884 allocated mmapped regions, try to directly map this request
2885 rather than expanding top.
2888 if ((unsigned long)(nb) >= (unsigned long)(mp_.mmap_threshold) &&
2889 (mp_.n_mmaps < mp_.n_mmaps_max)) {
2891 char* mm; /* return value from mmap call*/
2893 try_mmap:
2895 Round up size to nearest page. For mmapped chunks, the overhead
2896 is one SIZE_SZ unit larger than for normal chunks, because there
2897 is no following chunk whose prev_size field could be used.
2899 #if 1
2900 /* See the front_misalign handling below, for glibc there is no
2901 need for further alignments. */
2902 size = (nb + SIZE_SZ + pagemask) & ~pagemask;
2903 #else
2904 size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
2905 #endif
2906 tried_mmap = true;
2908 /* Don't try if size wraps around 0 */
2909 if ((unsigned long)(size) > (unsigned long)(nb)) {
2911 mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
2913 if (mm != MAP_FAILED) {
2916 The offset to the start of the mmapped region is stored
2917 in the prev_size field of the chunk. This allows us to adjust
2918 returned start address to meet alignment requirements here
2919 and in memalign(), and still be able to compute proper
2920 address argument for later munmap in free() and realloc().
2923 #if 1
2924 /* For glibc, chunk2mem increases the address by 2*SIZE_SZ and
2925 MALLOC_ALIGN_MASK is 2*SIZE_SZ-1. Each mmap'ed area is page
2926 aligned and therefore definitely MALLOC_ALIGN_MASK-aligned. */
2927 assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0);
2928 #else
2929 front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
2930 if (front_misalign > 0) {
2931 correction = MALLOC_ALIGNMENT - front_misalign;
2932 p = (mchunkptr)(mm + correction);
2933 p->prev_size = correction;
2934 set_head(p, (size - correction) |IS_MMAPPED);
2936 else
2937 #endif
2939 p = (mchunkptr)mm;
2940 set_head(p, size|IS_MMAPPED);
2943 /* update statistics */
2945 if (++mp_.n_mmaps > mp_.max_n_mmaps)
2946 mp_.max_n_mmaps = mp_.n_mmaps;
2948 sum = mp_.mmapped_mem += size;
2949 if (sum > (unsigned long)(mp_.max_mmapped_mem))
2950 mp_.max_mmapped_mem = sum;
2951 #ifdef NO_THREADS
2952 sum += av->system_mem;
2953 if (sum > (unsigned long)(mp_.max_total_mem))
2954 mp_.max_total_mem = sum;
2955 #endif
2957 check_chunk(av, p);
2959 return chunk2mem(p);
2963 #endif
2965 /* Record incoming configuration of top */
2967 old_top = av->top;
2968 old_size = chunksize(old_top);
2969 old_end = (char*)(chunk_at_offset(old_top, old_size));
2971 brk = snd_brk = (char*)(MORECORE_FAILURE);
2974 If not the first time through, we require old_size to be
2975 at least MINSIZE and to have prev_inuse set.
2978 assert((old_top == initial_top(av) && old_size == 0) ||
2979 ((unsigned long) (old_size) >= MINSIZE &&
2980 prev_inuse(old_top) &&
2981 ((unsigned long)old_end & pagemask) == 0));
2983 /* Precondition: not enough current space to satisfy nb request */
2984 assert((unsigned long)(old_size) < (unsigned long)(nb + MINSIZE));
2986 /* Precondition: all fastbins are consolidated */
2987 assert(!have_fastchunks(av));
2990 if (av != &main_arena) {
2992 heap_info *old_heap, *heap;
2993 size_t old_heap_size;
2995 /* First try to extend the current heap. */
2996 old_heap = heap_for_ptr(old_top);
2997 old_heap_size = old_heap->size;
2998 if ((long) (MINSIZE + nb - old_size) > 0
2999 && grow_heap(old_heap, MINSIZE + nb - old_size) == 0) {
3000 av->system_mem += old_heap->size - old_heap_size;
3001 arena_mem += old_heap->size - old_heap_size;
3002 #if 0
3003 if(mmapped_mem + arena_mem + sbrked_mem > max_total_mem)
3004 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
3005 #endif
3006 set_head(old_top, (((char *)old_heap + old_heap->size) - (char *)old_top)
3007 | PREV_INUSE);
3009 else if ((heap = new_heap(nb + (MINSIZE + sizeof(*heap)), mp_.top_pad))) {
3010 /* Use a newly allocated heap. */
3011 heap->ar_ptr = av;
3012 heap->prev = old_heap;
3013 av->system_mem += heap->size;
3014 arena_mem += heap->size;
3015 #if 0
3016 if((unsigned long)(mmapped_mem + arena_mem + sbrked_mem) > max_total_mem)
3017 max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
3018 #endif
3019 /* Set up the new top. */
3020 top(av) = chunk_at_offset(heap, sizeof(*heap));
3021 set_head(top(av), (heap->size - sizeof(*heap)) | PREV_INUSE);
3023 /* Setup fencepost and free the old top chunk. */
3024 /* The fencepost takes at least MINSIZE bytes, because it might
3025 become the top chunk again later. Note that a footer is set
3026 up, too, although the chunk is marked in use. */
3027 old_size -= MINSIZE;
3028 set_head(chunk_at_offset(old_top, old_size + 2*SIZE_SZ), 0|PREV_INUSE);
3029 if (old_size >= MINSIZE) {
3030 set_head(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)|PREV_INUSE);
3031 set_foot(chunk_at_offset(old_top, old_size), (2*SIZE_SZ));
3032 set_head(old_top, old_size|PREV_INUSE|NON_MAIN_ARENA);
3033 _int_free(av, chunk2mem(old_top));
3034 } else {
3035 set_head(old_top, (old_size + 2*SIZE_SZ)|PREV_INUSE);
3036 set_foot(old_top, (old_size + 2*SIZE_SZ));
3039 else if (!tried_mmap)
3040 /* We can at least try to use to mmap memory. */
3041 goto try_mmap;
3043 } else { /* av == main_arena */
3046 /* Request enough space for nb + pad + overhead */
3048 size = nb + mp_.top_pad + MINSIZE;
3051 If contiguous, we can subtract out existing space that we hope to
3052 combine with new space. We add it back later only if
3053 we don't actually get contiguous space.
3056 if (contiguous(av))
3057 size -= old_size;
3060 Round to a multiple of page size.
3061 If MORECORE is not contiguous, this ensures that we only call it
3062 with whole-page arguments. And if MORECORE is contiguous and
3063 this is not first time through, this preserves page-alignment of
3064 previous calls. Otherwise, we correct to page-align below.
3067 size = (size + pagemask) & ~pagemask;
3070 Don't try to call MORECORE if argument is so big as to appear
3071 negative. Note that since mmap takes size_t arg, it may succeed
3072 below even if we cannot call MORECORE.
3075 if (size > 0)
3076 brk = (char*)(MORECORE(size));
3078 if (brk != (char*)(MORECORE_FAILURE)) {
3079 /* Call the `morecore' hook if necessary. */
3080 if (__after_morecore_hook)
3081 (*__after_morecore_hook) ();
3082 } else {
3084 If have mmap, try using it as a backup when MORECORE fails or
3085 cannot be used. This is worth doing on systems that have "holes" in
3086 address space, so sbrk cannot extend to give contiguous space, but
3087 space is available elsewhere. Note that we ignore mmap max count
3088 and threshold limits, since the space will not be used as a
3089 segregated mmap region.
3092 #if HAVE_MMAP
3093 /* Cannot merge with old top, so add its size back in */
3094 if (contiguous(av))
3095 size = (size + old_size + pagemask) & ~pagemask;
3097 /* If we are relying on mmap as backup, then use larger units */
3098 if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
3099 size = MMAP_AS_MORECORE_SIZE;
3101 /* Don't try if size wraps around 0 */
3102 if ((unsigned long)(size) > (unsigned long)(nb)) {
3104 char *mbrk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
3106 if (mbrk != MAP_FAILED) {
3108 /* We do not need, and cannot use, another sbrk call to find end */
3109 brk = mbrk;
3110 snd_brk = brk + size;
3113 Record that we no longer have a contiguous sbrk region.
3114 After the first time mmap is used as backup, we do not
3115 ever rely on contiguous space since this could incorrectly
3116 bridge regions.
3118 set_noncontiguous(av);
3121 #endif
3124 if (brk != (char*)(MORECORE_FAILURE)) {
3125 if (mp_.sbrk_base == 0)
3126 mp_.sbrk_base = brk;
3127 av->system_mem += size;
3130 If MORECORE extends previous space, we can likewise extend top size.
3133 if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE))
3134 set_head(old_top, (size + old_size) | PREV_INUSE);
3136 else if (contiguous(av) && old_size && brk < old_end) {
3137 /* Oops! Someone else killed our space.. Can't touch anything. */
3138 assert(0);
3142 Otherwise, make adjustments:
3144 * If the first time through or noncontiguous, we need to call sbrk
3145 just to find out where the end of memory lies.
3147 * We need to ensure that all returned chunks from malloc will meet
3148 MALLOC_ALIGNMENT
3150 * If there was an intervening foreign sbrk, we need to adjust sbrk
3151 request size to account for fact that we will not be able to
3152 combine new space with existing space in old_top.
3154 * Almost all systems internally allocate whole pages at a time, in
3155 which case we might as well use the whole last page of request.
3156 So we allocate enough more memory to hit a page boundary now,
3157 which in turn causes future contiguous calls to page-align.
3160 else {
3161 front_misalign = 0;
3162 end_misalign = 0;
3163 correction = 0;
3164 aligned_brk = brk;
3166 /* handle contiguous cases */
3167 if (contiguous(av)) {
3169 /* Count foreign sbrk as system_mem. */
3170 if (old_size)
3171 av->system_mem += brk - old_end;
3173 /* Guarantee alignment of first new chunk made from this space */
3175 front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3176 if (front_misalign > 0) {
3179 Skip over some bytes to arrive at an aligned position.
3180 We don't need to specially mark these wasted front bytes.
3181 They will never be accessed anyway because
3182 prev_inuse of av->top (and any chunk created from its start)
3183 is always true after initialization.
3186 correction = MALLOC_ALIGNMENT - front_misalign;
3187 aligned_brk += correction;
3191 If this isn't adjacent to existing space, then we will not
3192 be able to merge with old_top space, so must add to 2nd request.
3195 correction += old_size;
3197 /* Extend the end address to hit a page boundary */
3198 end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3199 correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3201 assert(correction >= 0);
3202 snd_brk = (char*)(MORECORE(correction));
3205 If can't allocate correction, try to at least find out current
3206 brk. It might be enough to proceed without failing.
3208 Note that if second sbrk did NOT fail, we assume that space
3209 is contiguous with first sbrk. This is a safe assumption unless
3210 program is multithreaded but doesn't use locks and a foreign sbrk
3211 occurred between our first and second calls.
3214 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3215 correction = 0;
3216 snd_brk = (char*)(MORECORE(0));
3217 } else
3218 /* Call the `morecore' hook if necessary. */
3219 if (__after_morecore_hook)
3220 (*__after_morecore_hook) ();
3223 /* handle non-contiguous cases */
3224 else {
3225 /* MORECORE/mmap must correctly align */
3226 assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3228 /* Find out current end of memory */
3229 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3230 snd_brk = (char*)(MORECORE(0));
3234 /* Adjust top based on results of second sbrk */
3235 if (snd_brk != (char*)(MORECORE_FAILURE)) {
3236 av->top = (mchunkptr)aligned_brk;
3237 set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3238 av->system_mem += correction;
3241 If not the first time through, we either have a
3242 gap due to foreign sbrk or a non-contiguous region. Insert a
3243 double fencepost at old_top to prevent consolidation with space
3244 we don't own. These fenceposts are artificial chunks that are
3245 marked as inuse and are in any case too small to use. We need
3246 two to make sizes and alignments work out.
3249 if (old_size != 0) {
3251 Shrink old_top to insert fenceposts, keeping size a
3252 multiple of MALLOC_ALIGNMENT. We know there is at least
3253 enough space in old_top to do this.
3255 old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3256 set_head(old_top, old_size | PREV_INUSE);
3259 Note that the following assignments completely overwrite
3260 old_top when old_size was previously MINSIZE. This is
3261 intentional. We need the fencepost, even if old_top otherwise gets
3262 lost.
3264 chunk_at_offset(old_top, old_size )->size =
3265 (2*SIZE_SZ)|PREV_INUSE;
3267 chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
3268 (2*SIZE_SZ)|PREV_INUSE;
3270 /* If possible, release the rest. */
3271 if (old_size >= MINSIZE) {
3272 _int_free(av, chunk2mem(old_top));
3279 /* Update statistics */
3280 #ifdef NO_THREADS
3281 sum = av->system_mem + mp_.mmapped_mem;
3282 if (sum > (unsigned long)(mp_.max_total_mem))
3283 mp_.max_total_mem = sum;
3284 #endif
3288 } /* if (av != &main_arena) */
3290 if ((unsigned long)av->system_mem > (unsigned long)(av->max_system_mem))
3291 av->max_system_mem = av->system_mem;
3292 check_malloc_state(av);
3294 /* finally, do the allocation */
3295 p = av->top;
3296 size = chunksize(p);
3298 /* check that one of the above allocation paths succeeded */
3299 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3300 remainder_size = size - nb;
3301 remainder = chunk_at_offset(p, nb);
3302 av->top = remainder;
3303 set_head(p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0));
3304 set_head(remainder, remainder_size | PREV_INUSE);
3305 check_malloced_chunk(av, p, nb);
3306 return chunk2mem(p);
3309 /* catch all failure paths */
3310 MALLOC_FAILURE_ACTION;
3311 return 0;
3316 sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
3317 to the system (via negative arguments to sbrk) if there is unused
3318 memory at the `high' end of the malloc pool. It is called
3319 automatically by free() when top space exceeds the trim
3320 threshold. It is also called by the public malloc_trim routine. It
3321 returns 1 if it actually released any memory, else 0.
3324 #if __STD_C
3325 static int sYSTRIm(size_t pad, mstate av)
3326 #else
3327 static int sYSTRIm(pad, av) size_t pad; mstate av;
3328 #endif
3330 long top_size; /* Amount of top-most memory */
3331 long extra; /* Amount to release */
3332 long released; /* Amount actually released */
3333 char* current_brk; /* address returned by pre-check sbrk call */
3334 char* new_brk; /* address returned by post-check sbrk call */
3335 size_t pagesz;
3337 pagesz = mp_.pagesize;
3338 top_size = chunksize(av->top);
3340 /* Release in pagesize units, keeping at least one page */
3341 extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3343 if (extra > 0) {
3346 Only proceed if end of memory is where we last set it.
3347 This avoids problems if there were foreign sbrk calls.
3349 current_brk = (char*)(MORECORE(0));
3350 if (current_brk == (char*)(av->top) + top_size) {
3353 Attempt to release memory. We ignore MORECORE return value,
3354 and instead call again to find out where new end of memory is.
3355 This avoids problems if first call releases less than we asked,
3356 of if failure somehow altered brk value. (We could still
3357 encounter problems if it altered brk in some very bad way,
3358 but the only thing we can do is adjust anyway, which will cause
3359 some downstream failure.)
3362 MORECORE(-extra);
3363 /* Call the `morecore' hook if necessary. */
3364 if (__after_morecore_hook)
3365 (*__after_morecore_hook) ();
3366 new_brk = (char*)(MORECORE(0));
3368 if (new_brk != (char*)MORECORE_FAILURE) {
3369 released = (long)(current_brk - new_brk);
3371 if (released != 0) {
3372 /* Success. Adjust top. */
3373 av->system_mem -= released;
3374 set_head(av->top, (top_size - released) | PREV_INUSE);
3375 check_malloc_state(av);
3376 return 1;
3381 return 0;
3384 #ifdef HAVE_MMAP
3386 static void
3387 internal_function
3388 #if __STD_C
3389 munmap_chunk(mchunkptr p)
3390 #else
3391 munmap_chunk(p) mchunkptr p;
3392 #endif
3394 INTERNAL_SIZE_T size = chunksize(p);
3396 assert (chunk_is_mmapped(p));
3397 #if 0
3398 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3399 assert((mp_.n_mmaps > 0));
3400 #endif
3402 uintptr_t block = (uintptr_t) p - p->prev_size;
3403 size_t total_size = p->prev_size + size;
3404 /* Unfortunately we have to do the compilers job by hand here. Normally
3405 we would test BLOCK and TOTAL-SIZE separately for compliance with the
3406 page size. But gcc does not recognize the optimization possibility
3407 (in the moment at least) so we combine the two values into one before
3408 the bit test. */
3409 if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
3411 malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
3412 chunk2mem (p));
3413 return;
3416 mp_.n_mmaps--;
3417 mp_.mmapped_mem -= total_size;
3419 int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
3421 /* munmap returns non-zero on failure */
3422 assert(ret == 0);
3425 #if HAVE_MREMAP
3427 static mchunkptr
3428 internal_function
3429 #if __STD_C
3430 mremap_chunk(mchunkptr p, size_t new_size)
3431 #else
3432 mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
3433 #endif
3435 size_t page_mask = mp_.pagesize - 1;
3436 INTERNAL_SIZE_T offset = p->prev_size;
3437 INTERNAL_SIZE_T size = chunksize(p);
3438 char *cp;
3440 assert (chunk_is_mmapped(p));
3441 #if 0
3442 assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3443 assert((mp_.n_mmaps > 0));
3444 #endif
3445 assert(((size + offset) & (mp_.pagesize-1)) == 0);
3447 /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
3448 new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
3450 cp = (char *)mremap((char *)p - offset, size + offset, new_size,
3451 MREMAP_MAYMOVE);
3453 if (cp == MAP_FAILED) return 0;
3455 p = (mchunkptr)(cp + offset);
3457 assert(aligned_OK(chunk2mem(p)));
3459 assert((p->prev_size == offset));
3460 set_head(p, (new_size - offset)|IS_MMAPPED);
3462 mp_.mmapped_mem -= size + offset;
3463 mp_.mmapped_mem += new_size;
3464 if ((unsigned long)mp_.mmapped_mem > (unsigned long)mp_.max_mmapped_mem)
3465 mp_.max_mmapped_mem = mp_.mmapped_mem;
3466 #ifdef NO_THREADS
3467 if ((unsigned long)(mp_.mmapped_mem + arena_mem + main_arena.system_mem) >
3468 mp_.max_total_mem)
3469 mp_.max_total_mem = mp_.mmapped_mem + arena_mem + main_arena.system_mem;
3470 #endif
3471 return p;
3474 #endif /* HAVE_MREMAP */
3476 #endif /* HAVE_MMAP */
3478 /*------------------------ Public wrappers. --------------------------------*/
3480 Void_t*
3481 public_mALLOc(size_t bytes)
3483 mstate ar_ptr;
3484 Void_t *victim;
3486 __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t) = __malloc_hook;
3487 if (hook != NULL)
3488 return (*hook)(bytes, RETURN_ADDRESS (0));
3490 arena_get(ar_ptr, bytes);
3491 if(!ar_ptr)
3492 return 0;
3493 victim = _int_malloc(ar_ptr, bytes);
3494 if(!victim) {
3495 /* Maybe the failure is due to running out of mmapped areas. */
3496 if(ar_ptr != &main_arena) {
3497 (void)mutex_unlock(&ar_ptr->mutex);
3498 (void)mutex_lock(&main_arena.mutex);
3499 victim = _int_malloc(&main_arena, bytes);
3500 (void)mutex_unlock(&main_arena.mutex);
3501 } else {
3502 #if USE_ARENAS
3503 /* ... or sbrk() has failed and there is still a chance to mmap() */
3504 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3505 (void)mutex_unlock(&main_arena.mutex);
3506 if(ar_ptr) {
3507 victim = _int_malloc(ar_ptr, bytes);
3508 (void)mutex_unlock(&ar_ptr->mutex);
3510 #endif
3512 } else
3513 (void)mutex_unlock(&ar_ptr->mutex);
3514 assert(!victim || chunk_is_mmapped(mem2chunk(victim)) ||
3515 ar_ptr == arena_for_chunk(mem2chunk(victim)));
3516 return victim;
3518 #ifdef libc_hidden_def
3519 libc_hidden_def(public_mALLOc)
3520 #endif
3522 void
3523 public_fREe(Void_t* mem)
3525 mstate ar_ptr;
3526 mchunkptr p; /* chunk corresponding to mem */
3528 void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t) = __free_hook;
3529 if (hook != NULL) {
3530 (*hook)(mem, RETURN_ADDRESS (0));
3531 return;
3534 if (mem == 0) /* free(0) has no effect */
3535 return;
3537 p = mem2chunk(mem);
3539 #if HAVE_MMAP
3540 if (chunk_is_mmapped(p)) /* release mmapped memory. */
3542 /* see if the dynamic brk/mmap threshold needs adjusting */
3543 if (!mp_.no_dyn_threshold
3544 && p->size > mp_.mmap_threshold
3545 && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
3547 mp_.mmap_threshold = chunksize (p);
3548 mp_.trim_threshold = 2 * mp_.mmap_threshold;
3550 munmap_chunk(p);
3551 return;
3553 #endif
3555 ar_ptr = arena_for_chunk(p);
3556 #if THREAD_STATS
3557 if(!mutex_trylock(&ar_ptr->mutex))
3558 ++(ar_ptr->stat_lock_direct);
3559 else {
3560 (void)mutex_lock(&ar_ptr->mutex);
3561 ++(ar_ptr->stat_lock_wait);
3563 #else
3564 (void)mutex_lock(&ar_ptr->mutex);
3565 #endif
3566 _int_free(ar_ptr, mem);
3567 (void)mutex_unlock(&ar_ptr->mutex);
3569 #ifdef libc_hidden_def
3570 libc_hidden_def (public_fREe)
3571 #endif
3573 Void_t*
3574 public_rEALLOc(Void_t* oldmem, size_t bytes)
3576 mstate ar_ptr;
3577 INTERNAL_SIZE_T nb; /* padded request size */
3579 mchunkptr oldp; /* chunk corresponding to oldmem */
3580 INTERNAL_SIZE_T oldsize; /* its size */
3582 Void_t* newp; /* chunk to return */
3584 __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) =
3585 __realloc_hook;
3586 if (hook != NULL)
3587 return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
3589 #if REALLOC_ZERO_BYTES_FREES
3590 if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; }
3591 #endif
3593 /* realloc of null is supposed to be same as malloc */
3594 if (oldmem == 0) return public_mALLOc(bytes);
3596 oldp = mem2chunk(oldmem);
3597 oldsize = chunksize(oldp);
3599 /* Little security check which won't hurt performance: the
3600 allocator never wrapps around at the end of the address space.
3601 Therefore we can exclude some size values which might appear
3602 here by accident or by "design" from some intruder. */
3603 if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
3604 || __builtin_expect (misaligned_chunk (oldp), 0))
3606 malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
3607 return NULL;
3610 checked_request2size(bytes, nb);
3612 #if HAVE_MMAP
3613 if (chunk_is_mmapped(oldp))
3615 Void_t* newmem;
3617 #if HAVE_MREMAP
3618 newp = mremap_chunk(oldp, nb);
3619 if(newp) return chunk2mem(newp);
3620 #endif
3621 /* Note the extra SIZE_SZ overhead. */
3622 if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
3623 /* Must alloc, copy, free. */
3624 newmem = public_mALLOc(bytes);
3625 if (newmem == 0) return 0; /* propagate failure */
3626 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
3627 munmap_chunk(oldp);
3628 return newmem;
3630 #endif
3632 ar_ptr = arena_for_chunk(oldp);
3633 #if THREAD_STATS
3634 if(!mutex_trylock(&ar_ptr->mutex))
3635 ++(ar_ptr->stat_lock_direct);
3636 else {
3637 (void)mutex_lock(&ar_ptr->mutex);
3638 ++(ar_ptr->stat_lock_wait);
3640 #else
3641 (void)mutex_lock(&ar_ptr->mutex);
3642 #endif
3644 #ifndef NO_THREADS
3645 /* As in malloc(), remember this arena for the next allocation. */
3646 tsd_setspecific(arena_key, (Void_t *)ar_ptr);
3647 #endif
3649 newp = _int_realloc(ar_ptr, oldmem, bytes);
3651 (void)mutex_unlock(&ar_ptr->mutex);
3652 assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
3653 ar_ptr == arena_for_chunk(mem2chunk(newp)));
3655 if (newp == NULL)
3657 /* Try harder to allocate memory in other arenas. */
3658 newp = public_mALLOc(bytes);
3659 if (newp != NULL)
3661 MALLOC_COPY (newp, oldmem, oldsize - 2 * SIZE_SZ);
3662 #if THREAD_STATS
3663 if(!mutex_trylock(&ar_ptr->mutex))
3664 ++(ar_ptr->stat_lock_direct);
3665 else {
3666 (void)mutex_lock(&ar_ptr->mutex);
3667 ++(ar_ptr->stat_lock_wait);
3669 #else
3670 (void)mutex_lock(&ar_ptr->mutex);
3671 #endif
3672 _int_free(ar_ptr, oldmem);
3673 (void)mutex_unlock(&ar_ptr->mutex);
3677 return newp;
3679 #ifdef libc_hidden_def
3680 libc_hidden_def (public_rEALLOc)
3681 #endif
3683 Void_t*
3684 public_mEMALIGn(size_t alignment, size_t bytes)
3686 mstate ar_ptr;
3687 Void_t *p;
3689 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3690 __const __malloc_ptr_t)) =
3691 __memalign_hook;
3692 if (hook != NULL)
3693 return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
3695 /* If need less alignment than we give anyway, just relay to malloc */
3696 if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes);
3698 /* Otherwise, ensure that it is at least a minimum chunk size */
3699 if (alignment < MINSIZE) alignment = MINSIZE;
3701 arena_get(ar_ptr, bytes + alignment + MINSIZE);
3702 if(!ar_ptr)
3703 return 0;
3704 p = _int_memalign(ar_ptr, alignment, bytes);
3705 (void)mutex_unlock(&ar_ptr->mutex);
3706 if(!p) {
3707 /* Maybe the failure is due to running out of mmapped areas. */
3708 if(ar_ptr != &main_arena) {
3709 (void)mutex_lock(&main_arena.mutex);
3710 p = _int_memalign(&main_arena, alignment, bytes);
3711 (void)mutex_unlock(&main_arena.mutex);
3712 } else {
3713 #if USE_ARENAS
3714 /* ... or sbrk() has failed and there is still a chance to mmap() */
3715 ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3716 if(ar_ptr) {
3717 p = _int_memalign(ar_ptr, alignment, bytes);
3718 (void)mutex_unlock(&ar_ptr->mutex);
3720 #endif
3723 assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3724 ar_ptr == arena_for_chunk(mem2chunk(p)));
3725 return p;
3727 #ifdef libc_hidden_def
3728 libc_hidden_def (public_mEMALIGn)
3729 #endif
3731 Void_t*
3732 public_vALLOc(size_t bytes)
3734 mstate ar_ptr;
3735 Void_t *p;
3737 if(__malloc_initialized < 0)
3738 ptmalloc_init ();
3740 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3741 __const __malloc_ptr_t)) =
3742 __memalign_hook;
3743 if (hook != NULL)
3744 return (*hook)(mp_.pagesize, bytes, RETURN_ADDRESS (0));
3746 arena_get(ar_ptr, bytes + mp_.pagesize + MINSIZE);
3747 if(!ar_ptr)
3748 return 0;
3749 p = _int_valloc(ar_ptr, bytes);
3750 (void)mutex_unlock(&ar_ptr->mutex);
3751 return p;
3754 Void_t*
3755 public_pVALLOc(size_t bytes)
3757 mstate ar_ptr;
3758 Void_t *p;
3760 if(__malloc_initialized < 0)
3761 ptmalloc_init ();
3763 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3764 __const __malloc_ptr_t)) =
3765 __memalign_hook;
3766 if (hook != NULL)
3767 return (*hook)(mp_.pagesize,
3768 (bytes + mp_.pagesize - 1) & ~(mp_.pagesize - 1),
3769 RETURN_ADDRESS (0));
3771 arena_get(ar_ptr, bytes + 2*mp_.pagesize + MINSIZE);
3772 p = _int_pvalloc(ar_ptr, bytes);
3773 (void)mutex_unlock(&ar_ptr->mutex);
3774 return p;
3777 Void_t*
3778 public_cALLOc(size_t n, size_t elem_size)
3780 mstate av;
3781 mchunkptr oldtop, p;
3782 INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
3783 Void_t* mem;
3784 unsigned long clearsize;
3785 unsigned long nclears;
3786 INTERNAL_SIZE_T* d;
3787 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, __const __malloc_ptr_t)) =
3788 __malloc_hook;
3790 /* size_t is unsigned so the behavior on overflow is defined. */
3791 bytes = n * elem_size;
3792 #define HALF_INTERNAL_SIZE_T \
3793 (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2))
3794 if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) {
3795 if (elem_size != 0 && bytes / elem_size != n) {
3796 MALLOC_FAILURE_ACTION;
3797 return 0;
3801 if (hook != NULL) {
3802 sz = bytes;
3803 mem = (*hook)(sz, RETURN_ADDRESS (0));
3804 if(mem == 0)
3805 return 0;
3806 #ifdef HAVE_MEMCPY
3807 return memset(mem, 0, sz);
3808 #else
3809 while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
3810 return mem;
3811 #endif
3814 sz = bytes;
3816 arena_get(av, sz);
3817 if(!av)
3818 return 0;
3820 /* Check if we hand out the top chunk, in which case there may be no
3821 need to clear. */
3822 #if MORECORE_CLEARS
3823 oldtop = top(av);
3824 oldtopsize = chunksize(top(av));
3825 #if MORECORE_CLEARS < 2
3826 /* Only newly allocated memory is guaranteed to be cleared. */
3827 if (av == &main_arena &&
3828 oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
3829 oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
3830 #endif
3831 #endif
3832 mem = _int_malloc(av, sz);
3834 /* Only clearing follows, so we can unlock early. */
3835 (void)mutex_unlock(&av->mutex);
3837 assert(!mem || chunk_is_mmapped(mem2chunk(mem)) ||
3838 av == arena_for_chunk(mem2chunk(mem)));
3840 if (mem == 0) {
3841 /* Maybe the failure is due to running out of mmapped areas. */
3842 if(av != &main_arena) {
3843 (void)mutex_lock(&main_arena.mutex);
3844 mem = _int_malloc(&main_arena, sz);
3845 (void)mutex_unlock(&main_arena.mutex);
3846 } else {
3847 #if USE_ARENAS
3848 /* ... or sbrk() has failed and there is still a chance to mmap() */
3849 (void)mutex_lock(&main_arena.mutex);
3850 av = arena_get2(av->next ? av : 0, sz);
3851 (void)mutex_unlock(&main_arena.mutex);
3852 if(av) {
3853 mem = _int_malloc(av, sz);
3854 (void)mutex_unlock(&av->mutex);
3856 #endif
3858 if (mem == 0) return 0;
3860 p = mem2chunk(mem);
3862 /* Two optional cases in which clearing not necessary */
3863 #if HAVE_MMAP
3864 if (chunk_is_mmapped (p))
3866 if (__builtin_expect (perturb_byte, 0))
3867 MALLOC_ZERO (mem, sz);
3868 return mem;
3870 #endif
3872 csz = chunksize(p);
3874 #if MORECORE_CLEARS
3875 if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) {
3876 /* clear only the bytes from non-freshly-sbrked memory */
3877 csz = oldtopsize;
3879 #endif
3881 /* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that
3882 contents have an odd number of INTERNAL_SIZE_T-sized words;
3883 minimally 3. */
3884 d = (INTERNAL_SIZE_T*)mem;
3885 clearsize = csz - SIZE_SZ;
3886 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
3887 assert(nclears >= 3);
3889 if (nclears > 9)
3890 MALLOC_ZERO(d, clearsize);
3892 else {
3893 *(d+0) = 0;
3894 *(d+1) = 0;
3895 *(d+2) = 0;
3896 if (nclears > 4) {
3897 *(d+3) = 0;
3898 *(d+4) = 0;
3899 if (nclears > 6) {
3900 *(d+5) = 0;
3901 *(d+6) = 0;
3902 if (nclears > 8) {
3903 *(d+7) = 0;
3904 *(d+8) = 0;
3910 return mem;
3913 #ifndef _LIBC
3915 Void_t**
3916 public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
3918 mstate ar_ptr;
3919 Void_t** m;
3921 arena_get(ar_ptr, n*elem_size);
3922 if(!ar_ptr)
3923 return 0;
3925 m = _int_icalloc(ar_ptr, n, elem_size, chunks);
3926 (void)mutex_unlock(&ar_ptr->mutex);
3927 return m;
3930 Void_t**
3931 public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
3933 mstate ar_ptr;
3934 Void_t** m;
3936 arena_get(ar_ptr, 0);
3937 if(!ar_ptr)
3938 return 0;
3940 m = _int_icomalloc(ar_ptr, n, sizes, chunks);
3941 (void)mutex_unlock(&ar_ptr->mutex);
3942 return m;
3945 void
3946 public_cFREe(Void_t* m)
3948 public_fREe(m);
3951 #endif /* _LIBC */
3954 public_mTRIm(size_t s)
3956 int result;
3958 if(__malloc_initialized < 0)
3959 ptmalloc_init ();
3960 (void)mutex_lock(&main_arena.mutex);
3961 result = mTRIm(s);
3962 (void)mutex_unlock(&main_arena.mutex);
3963 return result;
3966 size_t
3967 public_mUSABLe(Void_t* m)
3969 size_t result;
3971 result = mUSABLe(m);
3972 return result;
3975 void
3976 public_mSTATs()
3978 mSTATs();
3981 struct mallinfo public_mALLINFo()
3983 struct mallinfo m;
3985 if(__malloc_initialized < 0)
3986 ptmalloc_init ();
3987 (void)mutex_lock(&main_arena.mutex);
3988 m = mALLINFo(&main_arena);
3989 (void)mutex_unlock(&main_arena.mutex);
3990 return m;
3994 public_mALLOPt(int p, int v)
3996 int result;
3997 result = mALLOPt(p, v);
3998 return result;
4002 ------------------------------ malloc ------------------------------
4005 Void_t*
4006 _int_malloc(mstate av, size_t bytes)
4008 INTERNAL_SIZE_T nb; /* normalized request size */
4009 unsigned int idx; /* associated bin index */
4010 mbinptr bin; /* associated bin */
4011 mfastbinptr* fb; /* associated fastbin */
4013 mchunkptr victim; /* inspected/selected chunk */
4014 INTERNAL_SIZE_T size; /* its size */
4015 int victim_index; /* its bin index */
4017 mchunkptr remainder; /* remainder from a split */
4018 unsigned long remainder_size; /* its size */
4020 unsigned int block; /* bit map traverser */
4021 unsigned int bit; /* bit map traverser */
4022 unsigned int map; /* current word of binmap */
4024 mchunkptr fwd; /* misc temp for linking */
4025 mchunkptr bck; /* misc temp for linking */
4028 Convert request size to internal form by adding SIZE_SZ bytes
4029 overhead plus possibly more to obtain necessary alignment and/or
4030 to obtain a size of at least MINSIZE, the smallest allocatable
4031 size. Also, checked_request2size traps (returning 0) request sizes
4032 that are so large that they wrap around zero when padded and
4033 aligned.
4036 checked_request2size(bytes, nb);
4039 If the size qualifies as a fastbin, first check corresponding bin.
4040 This code is safe to execute even if av is not yet initialized, so we
4041 can try it without checking, which saves some time on this fast path.
4044 if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
4045 long int idx = fastbin_index(nb);
4046 fb = &(av->fastbins[idx]);
4047 if ( (victim = *fb) != 0) {
4048 if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
4049 malloc_printerr (check_action, "malloc(): memory corruption (fast)",
4050 chunk2mem (victim));
4051 *fb = victim->fd;
4052 check_remalloced_chunk(av, victim, nb);
4053 void *p = chunk2mem(victim);
4054 if (__builtin_expect (perturb_byte, 0))
4055 alloc_perturb (p, bytes);
4056 return p;
4061 If a small request, check regular bin. Since these "smallbins"
4062 hold one size each, no searching within bins is necessary.
4063 (For a large request, we need to wait until unsorted chunks are
4064 processed to find best fit. But for small ones, fits are exact
4065 anyway, so we can check now, which is faster.)
4068 if (in_smallbin_range(nb)) {
4069 idx = smallbin_index(nb);
4070 bin = bin_at(av,idx);
4072 if ( (victim = last(bin)) != bin) {
4073 if (victim == 0) /* initialization check */
4074 malloc_consolidate(av);
4075 else {
4076 bck = victim->bk;
4077 set_inuse_bit_at_offset(victim, nb);
4078 bin->bk = bck;
4079 bck->fd = bin;
4081 if (av != &main_arena)
4082 victim->size |= NON_MAIN_ARENA;
4083 check_malloced_chunk(av, victim, nb);
4084 void *p = chunk2mem(victim);
4085 if (__builtin_expect (perturb_byte, 0))
4086 alloc_perturb (p, bytes);
4087 return p;
4093 If this is a large request, consolidate fastbins before continuing.
4094 While it might look excessive to kill all fastbins before
4095 even seeing if there is space available, this avoids
4096 fragmentation problems normally associated with fastbins.
4097 Also, in practice, programs tend to have runs of either small or
4098 large requests, but less often mixtures, so consolidation is not
4099 invoked all that often in most programs. And the programs that
4100 it is called frequently in otherwise tend to fragment.
4103 else {
4104 idx = largebin_index(nb);
4105 if (have_fastchunks(av))
4106 malloc_consolidate(av);
4110 Process recently freed or remaindered chunks, taking one only if
4111 it is exact fit, or, if this a small request, the chunk is remainder from
4112 the most recent non-exact fit. Place other traversed chunks in
4113 bins. Note that this step is the only place in any routine where
4114 chunks are placed in bins.
4116 The outer loop here is needed because we might not realize until
4117 near the end of malloc that we should have consolidated, so must
4118 do so and retry. This happens at most once, and only when we would
4119 otherwise need to expand memory to service a "small" request.
4122 for(;;) {
4124 int iters = 0;
4125 while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
4126 bck = victim->bk;
4127 if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
4128 || __builtin_expect (victim->size > av->system_mem, 0))
4129 malloc_printerr (check_action, "malloc(): memory corruption",
4130 chunk2mem (victim));
4131 size = chunksize(victim);
4134 If a small request, try to use last remainder if it is the
4135 only chunk in unsorted bin. This helps promote locality for
4136 runs of consecutive small requests. This is the only
4137 exception to best-fit, and applies only when there is
4138 no exact fit for a small chunk.
4141 if (in_smallbin_range(nb) &&
4142 bck == unsorted_chunks(av) &&
4143 victim == av->last_remainder &&
4144 (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4146 /* split and reattach remainder */
4147 remainder_size = size - nb;
4148 remainder = chunk_at_offset(victim, nb);
4149 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
4150 av->last_remainder = remainder;
4151 remainder->bk = remainder->fd = unsorted_chunks(av);
4153 set_head(victim, nb | PREV_INUSE |
4154 (av != &main_arena ? NON_MAIN_ARENA : 0));
4155 set_head(remainder, remainder_size | PREV_INUSE);
4156 set_foot(remainder, remainder_size);
4158 check_malloced_chunk(av, victim, nb);
4159 void *p = chunk2mem(victim);
4160 if (__builtin_expect (perturb_byte, 0))
4161 alloc_perturb (p, bytes);
4162 return p;
4165 /* remove from unsorted list */
4166 unsorted_chunks(av)->bk = bck;
4167 bck->fd = unsorted_chunks(av);
4169 /* Take now instead of binning if exact fit */
4171 if (size == nb) {
4172 set_inuse_bit_at_offset(victim, size);
4173 if (av != &main_arena)
4174 victim->size |= NON_MAIN_ARENA;
4175 check_malloced_chunk(av, victim, nb);
4176 void *p = chunk2mem(victim);
4177 if (__builtin_expect (perturb_byte, 0))
4178 alloc_perturb (p, bytes);
4179 return p;
4182 /* place chunk in bin */
4184 if (in_smallbin_range(size)) {
4185 victim_index = smallbin_index(size);
4186 bck = bin_at(av, victim_index);
4187 fwd = bck->fd;
4189 else {
4190 victim_index = largebin_index(size);
4191 bck = bin_at(av, victim_index);
4192 fwd = bck->fd;
4194 /* maintain large bins in sorted order */
4195 if (fwd != bck) {
4196 /* Or with inuse bit to speed comparisons */
4197 size |= PREV_INUSE;
4198 /* if smaller than smallest, bypass loop below */
4199 assert((bck->bk->size & NON_MAIN_ARENA) == 0);
4200 if ((unsigned long)(size) <= (unsigned long)(bck->bk->size)) {
4201 fwd = bck;
4202 bck = bck->bk;
4204 else {
4205 assert((fwd->size & NON_MAIN_ARENA) == 0);
4206 while ((unsigned long)(size) < (unsigned long)(fwd->size)) {
4207 fwd = fwd->fd;
4208 assert((fwd->size & NON_MAIN_ARENA) == 0);
4210 bck = fwd->bk;
4215 mark_bin(av, victim_index);
4216 victim->bk = bck;
4217 victim->fd = fwd;
4218 fwd->bk = victim;
4219 bck->fd = victim;
4221 #define MAX_ITERS 10000
4222 if (++iters >= MAX_ITERS)
4223 break;
4227 If a large request, scan through the chunks of current bin in
4228 sorted order to find smallest that fits. This is the only step
4229 where an unbounded number of chunks might be scanned without doing
4230 anything useful with them. However the lists tend to be short.
4233 if (!in_smallbin_range(nb)) {
4234 bin = bin_at(av, idx);
4236 /* skip scan if empty or largest chunk is too small */
4237 if ((victim = last(bin)) != bin &&
4238 (unsigned long)(first(bin)->size) >= (unsigned long)(nb)) {
4240 while (((unsigned long)(size = chunksize(victim)) <
4241 (unsigned long)(nb)))
4242 victim = victim->bk;
4244 remainder_size = size - nb;
4245 unlink(victim, bck, fwd);
4247 /* Exhaust */
4248 if (remainder_size < MINSIZE) {
4249 set_inuse_bit_at_offset(victim, size);
4250 if (av != &main_arena)
4251 victim->size |= NON_MAIN_ARENA;
4253 /* Split */
4254 else {
4255 remainder = chunk_at_offset(victim, nb);
4256 /* We cannot assume the unsorted list is empty and therefore
4257 have to perform a complete insert here. */
4258 bck = unsorted_chunks(av);
4259 fwd = bck->fd;
4260 remainder->bk = bck;
4261 remainder->fd = fwd;
4262 bck->fd = remainder;
4263 fwd->bk = remainder;
4264 set_head(victim, nb | PREV_INUSE |
4265 (av != &main_arena ? NON_MAIN_ARENA : 0));
4266 set_head(remainder, remainder_size | PREV_INUSE);
4267 set_foot(remainder, remainder_size);
4269 check_malloced_chunk(av, victim, nb);
4270 void *p = chunk2mem(victim);
4271 if (__builtin_expect (perturb_byte, 0))
4272 alloc_perturb (p, bytes);
4273 return p;
4278 Search for a chunk by scanning bins, starting with next largest
4279 bin. This search is strictly by best-fit; i.e., the smallest
4280 (with ties going to approximately the least recently used) chunk
4281 that fits is selected.
4283 The bitmap avoids needing to check that most blocks are nonempty.
4284 The particular case of skipping all bins during warm-up phases
4285 when no chunks have been returned yet is faster than it might look.
4288 ++idx;
4289 bin = bin_at(av,idx);
4290 block = idx2block(idx);
4291 map = av->binmap[block];
4292 bit = idx2bit(idx);
4294 for (;;) {
4296 /* Skip rest of block if there are no more set bits in this block. */
4297 if (bit > map || bit == 0) {
4298 do {
4299 if (++block >= BINMAPSIZE) /* out of bins */
4300 goto use_top;
4301 } while ( (map = av->binmap[block]) == 0);
4303 bin = bin_at(av, (block << BINMAPSHIFT));
4304 bit = 1;
4307 /* Advance to bin with set bit. There must be one. */
4308 while ((bit & map) == 0) {
4309 bin = next_bin(bin);
4310 bit <<= 1;
4311 assert(bit != 0);
4314 /* Inspect the bin. It is likely to be non-empty */
4315 victim = last(bin);
4317 /* If a false alarm (empty bin), clear the bit. */
4318 if (victim == bin) {
4319 av->binmap[block] = map &= ~bit; /* Write through */
4320 bin = next_bin(bin);
4321 bit <<= 1;
4324 else {
4325 size = chunksize(victim);
4327 /* We know the first chunk in this bin is big enough to use. */
4328 assert((unsigned long)(size) >= (unsigned long)(nb));
4330 remainder_size = size - nb;
4332 /* unlink */
4333 bck = victim->bk;
4334 bin->bk = bck;
4335 bck->fd = bin;
4337 /* Exhaust */
4338 if (remainder_size < MINSIZE) {
4339 set_inuse_bit_at_offset(victim, size);
4340 if (av != &main_arena)
4341 victim->size |= NON_MAIN_ARENA;
4344 /* Split */
4345 else {
4346 remainder = chunk_at_offset(victim, nb);
4348 /* We cannot assume the unsorted list is empty and therefore
4349 have to perform a complete insert here. */
4350 bck = unsorted_chunks(av);
4351 fwd = bck->fd;
4352 remainder->bk = bck;
4353 remainder->fd = fwd;
4354 bck->fd = remainder;
4355 fwd->bk = remainder;
4357 /* advertise as last remainder */
4358 if (in_smallbin_range(nb))
4359 av->last_remainder = remainder;
4361 set_head(victim, nb | PREV_INUSE |
4362 (av != &main_arena ? NON_MAIN_ARENA : 0));
4363 set_head(remainder, remainder_size | PREV_INUSE);
4364 set_foot(remainder, remainder_size);
4366 check_malloced_chunk(av, victim, nb);
4367 void *p = chunk2mem(victim);
4368 if (__builtin_expect (perturb_byte, 0))
4369 alloc_perturb (p, bytes);
4370 return p;
4374 use_top:
4376 If large enough, split off the chunk bordering the end of memory
4377 (held in av->top). Note that this is in accord with the best-fit
4378 search rule. In effect, av->top is treated as larger (and thus
4379 less well fitting) than any other available chunk since it can
4380 be extended to be as large as necessary (up to system
4381 limitations).
4383 We require that av->top always exists (i.e., has size >=
4384 MINSIZE) after initialization, so if it would otherwise be
4385 exhuasted by current request, it is replenished. (The main
4386 reason for ensuring it exists is that we may need MINSIZE space
4387 to put in fenceposts in sysmalloc.)
4390 victim = av->top;
4391 size = chunksize(victim);
4393 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
4394 remainder_size = size - nb;
4395 remainder = chunk_at_offset(victim, nb);
4396 av->top = remainder;
4397 set_head(victim, nb | PREV_INUSE |
4398 (av != &main_arena ? NON_MAIN_ARENA : 0));
4399 set_head(remainder, remainder_size | PREV_INUSE);
4401 check_malloced_chunk(av, victim, nb);
4402 void *p = chunk2mem(victim);
4403 if (__builtin_expect (perturb_byte, 0))
4404 alloc_perturb (p, bytes);
4405 return p;
4409 If there is space available in fastbins, consolidate and retry,
4410 to possibly avoid expanding memory. This can occur only if nb is
4411 in smallbin range so we didn't consolidate upon entry.
4414 else if (have_fastchunks(av)) {
4415 assert(in_smallbin_range(nb));
4416 malloc_consolidate(av);
4417 idx = smallbin_index(nb); /* restore original bin index */
4421 Otherwise, relay to handle system-dependent cases
4423 else {
4424 void *p = sYSMALLOc(nb, av);
4425 if (__builtin_expect (perturb_byte, 0))
4426 alloc_perturb (p, bytes);
4427 return p;
4433 ------------------------------ free ------------------------------
4436 void
4437 _int_free(mstate av, Void_t* mem)
4439 mchunkptr p; /* chunk corresponding to mem */
4440 INTERNAL_SIZE_T size; /* its size */
4441 mfastbinptr* fb; /* associated fastbin */
4442 mchunkptr nextchunk; /* next contiguous chunk */
4443 INTERNAL_SIZE_T nextsize; /* its size */
4444 int nextinuse; /* true if nextchunk is used */
4445 INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
4446 mchunkptr bck; /* misc temp for linking */
4447 mchunkptr fwd; /* misc temp for linking */
4449 const char *errstr = NULL;
4451 p = mem2chunk(mem);
4452 size = chunksize(p);
4454 /* Little security check which won't hurt performance: the
4455 allocator never wrapps around at the end of the address space.
4456 Therefore we can exclude some size values which might appear
4457 here by accident or by "design" from some intruder. */
4458 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
4459 || __builtin_expect (misaligned_chunk (p), 0))
4461 errstr = "free(): invalid pointer";
4462 errout:
4463 malloc_printerr (check_action, errstr, mem);
4464 return;
4466 /* We know that each chunk is at least MINSIZE bytes in size. */
4467 if (__builtin_expect (size < MINSIZE, 0))
4469 errstr = "free(): invalid size";
4470 goto errout;
4473 check_inuse_chunk(av, p);
4476 If eligible, place chunk on a fastbin so it can be found
4477 and used quickly in malloc.
4480 if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
4482 #if TRIM_FASTBINS
4484 If TRIM_FASTBINS set, don't place chunks
4485 bordering top into fastbins
4487 && (chunk_at_offset(p, size) != av->top)
4488 #endif
4491 if (__builtin_expect (chunk_at_offset (p, size)->size <= 2 * SIZE_SZ, 0)
4492 || __builtin_expect (chunksize (chunk_at_offset (p, size))
4493 >= av->system_mem, 0))
4495 errstr = "free(): invalid next size (fast)";
4496 goto errout;
4499 set_fastchunks(av);
4500 fb = &(av->fastbins[fastbin_index(size)]);
4501 /* Another simple check: make sure the top of the bin is not the
4502 record we are going to add (i.e., double free). */
4503 if (__builtin_expect (*fb == p, 0))
4505 errstr = "double free or corruption (fasttop)";
4506 goto errout;
4509 if (__builtin_expect (perturb_byte, 0))
4510 free_perturb (mem, size - SIZE_SZ);
4512 p->fd = *fb;
4513 *fb = p;
4517 Consolidate other non-mmapped chunks as they arrive.
4520 else if (!chunk_is_mmapped(p)) {
4521 nextchunk = chunk_at_offset(p, size);
4523 /* Lightweight tests: check whether the block is already the
4524 top block. */
4525 if (__builtin_expect (p == av->top, 0))
4527 errstr = "double free or corruption (top)";
4528 goto errout;
4530 /* Or whether the next chunk is beyond the boundaries of the arena. */
4531 if (__builtin_expect (contiguous (av)
4532 && (char *) nextchunk
4533 >= ((char *) av->top + chunksize(av->top)), 0))
4535 errstr = "double free or corruption (out)";
4536 goto errout;
4538 /* Or whether the block is actually not marked used. */
4539 if (__builtin_expect (!prev_inuse(nextchunk), 0))
4541 errstr = "double free or corruption (!prev)";
4542 goto errout;
4545 nextsize = chunksize(nextchunk);
4546 if (__builtin_expect (nextchunk->size <= 2 * SIZE_SZ, 0)
4547 || __builtin_expect (nextsize >= av->system_mem, 0))
4549 errstr = "free(): invalid next size (normal)";
4550 goto errout;
4553 if (__builtin_expect (perturb_byte, 0))
4554 free_perturb (mem, size - SIZE_SZ);
4556 /* consolidate backward */
4557 if (!prev_inuse(p)) {
4558 prevsize = p->prev_size;
4559 size += prevsize;
4560 p = chunk_at_offset(p, -((long) prevsize));
4561 unlink(p, bck, fwd);
4564 if (nextchunk != av->top) {
4565 /* get and clear inuse bit */
4566 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4568 /* consolidate forward */
4569 if (!nextinuse) {
4570 unlink(nextchunk, bck, fwd);
4571 size += nextsize;
4572 } else
4573 clear_inuse_bit_at_offset(nextchunk, 0);
4576 Place the chunk in unsorted chunk list. Chunks are
4577 not placed into regular bins until after they have
4578 been given one chance to be used in malloc.
4581 bck = unsorted_chunks(av);
4582 fwd = bck->fd;
4583 p->bk = bck;
4584 p->fd = fwd;
4585 bck->fd = p;
4586 fwd->bk = p;
4588 set_head(p, size | PREV_INUSE);
4589 set_foot(p, size);
4591 check_free_chunk(av, p);
4595 If the chunk borders the current high end of memory,
4596 consolidate into top
4599 else {
4600 size += nextsize;
4601 set_head(p, size | PREV_INUSE);
4602 av->top = p;
4603 check_chunk(av, p);
4607 If freeing a large space, consolidate possibly-surrounding
4608 chunks. Then, if the total unused topmost memory exceeds trim
4609 threshold, ask malloc_trim to reduce top.
4611 Unless max_fast is 0, we don't know if there are fastbins
4612 bordering top, so we cannot tell for sure whether threshold
4613 has been reached unless fastbins are consolidated. But we
4614 don't want to consolidate on each free. As a compromise,
4615 consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
4616 is reached.
4619 if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
4620 if (have_fastchunks(av))
4621 malloc_consolidate(av);
4623 if (av == &main_arena) {
4624 #ifndef MORECORE_CANNOT_TRIM
4625 if ((unsigned long)(chunksize(av->top)) >=
4626 (unsigned long)(mp_.trim_threshold))
4627 sYSTRIm(mp_.top_pad, av);
4628 #endif
4629 } else {
4630 /* Always try heap_trim(), even if the top chunk is not
4631 large, because the corresponding heap might go away. */
4632 heap_info *heap = heap_for_ptr(top(av));
4634 assert(heap->ar_ptr == av);
4635 heap_trim(heap, mp_.top_pad);
4641 If the chunk was allocated via mmap, release via munmap(). Note
4642 that if HAVE_MMAP is false but chunk_is_mmapped is true, then
4643 user must have overwritten memory. There's nothing we can do to
4644 catch this error unless MALLOC_DEBUG is set, in which case
4645 check_inuse_chunk (above) will have triggered error.
4648 else {
4649 #if HAVE_MMAP
4650 munmap_chunk (p);
4651 #endif
4656 ------------------------- malloc_consolidate -------------------------
4658 malloc_consolidate is a specialized version of free() that tears
4659 down chunks held in fastbins. Free itself cannot be used for this
4660 purpose since, among other things, it might place chunks back onto
4661 fastbins. So, instead, we need to use a minor variant of the same
4662 code.
4664 Also, because this routine needs to be called the first time through
4665 malloc anyway, it turns out to be the perfect place to trigger
4666 initialization code.
4669 #if __STD_C
4670 static void malloc_consolidate(mstate av)
4671 #else
4672 static void malloc_consolidate(av) mstate av;
4673 #endif
4675 mfastbinptr* fb; /* current fastbin being consolidated */
4676 mfastbinptr* maxfb; /* last fastbin (for loop control) */
4677 mchunkptr p; /* current chunk being consolidated */
4678 mchunkptr nextp; /* next chunk to consolidate */
4679 mchunkptr unsorted_bin; /* bin header */
4680 mchunkptr first_unsorted; /* chunk to link to */
4682 /* These have same use as in free() */
4683 mchunkptr nextchunk;
4684 INTERNAL_SIZE_T size;
4685 INTERNAL_SIZE_T nextsize;
4686 INTERNAL_SIZE_T prevsize;
4687 int nextinuse;
4688 mchunkptr bck;
4689 mchunkptr fwd;
4692 If max_fast is 0, we know that av hasn't
4693 yet been initialized, in which case do so below
4696 if (get_max_fast () != 0) {
4697 clear_fastchunks(av);
4699 unsorted_bin = unsorted_chunks(av);
4702 Remove each chunk from fast bin and consolidate it, placing it
4703 then in unsorted bin. Among other reasons for doing this,
4704 placing in unsorted bin avoids needing to calculate actual bins
4705 until malloc is sure that chunks aren't immediately going to be
4706 reused anyway.
4709 #if 0
4710 /* It is wrong to limit the fast bins to search using get_max_fast
4711 because, except for the main arena, all the others might have
4712 blocks in the high fast bins. It's not worth it anyway, just
4713 search all bins all the time. */
4714 maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
4715 #else
4716 maxfb = &(av->fastbins[NFASTBINS - 1]);
4717 #endif
4718 fb = &(av->fastbins[0]);
4719 do {
4720 if ( (p = *fb) != 0) {
4721 *fb = 0;
4723 do {
4724 check_inuse_chunk(av, p);
4725 nextp = p->fd;
4727 /* Slightly streamlined version of consolidation code in free() */
4728 size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
4729 nextchunk = chunk_at_offset(p, size);
4730 nextsize = chunksize(nextchunk);
4732 if (!prev_inuse(p)) {
4733 prevsize = p->prev_size;
4734 size += prevsize;
4735 p = chunk_at_offset(p, -((long) prevsize));
4736 unlink(p, bck, fwd);
4739 if (nextchunk != av->top) {
4740 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4742 if (!nextinuse) {
4743 size += nextsize;
4744 unlink(nextchunk, bck, fwd);
4745 } else
4746 clear_inuse_bit_at_offset(nextchunk, 0);
4748 first_unsorted = unsorted_bin->fd;
4749 unsorted_bin->fd = p;
4750 first_unsorted->bk = p;
4752 set_head(p, size | PREV_INUSE);
4753 p->bk = unsorted_bin;
4754 p->fd = first_unsorted;
4755 set_foot(p, size);
4758 else {
4759 size += nextsize;
4760 set_head(p, size | PREV_INUSE);
4761 av->top = p;
4764 } while ( (p = nextp) != 0);
4767 } while (fb++ != maxfb);
4769 else {
4770 malloc_init_state(av);
4771 check_malloc_state(av);
4776 ------------------------------ realloc ------------------------------
4779 Void_t*
4780 _int_realloc(mstate av, Void_t* oldmem, size_t bytes)
4782 INTERNAL_SIZE_T nb; /* padded request size */
4784 mchunkptr oldp; /* chunk corresponding to oldmem */
4785 INTERNAL_SIZE_T oldsize; /* its size */
4787 mchunkptr newp; /* chunk to return */
4788 INTERNAL_SIZE_T newsize; /* its size */
4789 Void_t* newmem; /* corresponding user mem */
4791 mchunkptr next; /* next contiguous chunk after oldp */
4793 mchunkptr remainder; /* extra space at end of newp */
4794 unsigned long remainder_size; /* its size */
4796 mchunkptr bck; /* misc temp for linking */
4797 mchunkptr fwd; /* misc temp for linking */
4799 unsigned long copysize; /* bytes to copy */
4800 unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
4801 INTERNAL_SIZE_T* s; /* copy source */
4802 INTERNAL_SIZE_T* d; /* copy destination */
4804 const char *errstr = NULL;
4807 checked_request2size(bytes, nb);
4809 oldp = mem2chunk(oldmem);
4810 oldsize = chunksize(oldp);
4812 /* Simple tests for old block integrity. */
4813 if (__builtin_expect (misaligned_chunk (oldp), 0))
4815 errstr = "realloc(): invalid pointer";
4816 errout:
4817 malloc_printerr (check_action, errstr, oldmem);
4818 return NULL;
4820 if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0)
4821 || __builtin_expect (oldsize >= av->system_mem, 0))
4823 errstr = "realloc(): invalid old size";
4824 goto errout;
4827 check_inuse_chunk(av, oldp);
4829 if (!chunk_is_mmapped(oldp)) {
4831 next = chunk_at_offset(oldp, oldsize);
4832 INTERNAL_SIZE_T nextsize = chunksize(next);
4833 if (__builtin_expect (next->size <= 2 * SIZE_SZ, 0)
4834 || __builtin_expect (nextsize >= av->system_mem, 0))
4836 errstr = "realloc(): invalid next size";
4837 goto errout;
4840 if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
4841 /* already big enough; split below */
4842 newp = oldp;
4843 newsize = oldsize;
4846 else {
4847 /* Try to expand forward into top */
4848 if (next == av->top &&
4849 (unsigned long)(newsize = oldsize + nextsize) >=
4850 (unsigned long)(nb + MINSIZE)) {
4851 set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4852 av->top = chunk_at_offset(oldp, nb);
4853 set_head(av->top, (newsize - nb) | PREV_INUSE);
4854 check_inuse_chunk(av, oldp);
4855 return chunk2mem(oldp);
4858 /* Try to expand forward into next chunk; split off remainder below */
4859 else if (next != av->top &&
4860 !inuse(next) &&
4861 (unsigned long)(newsize = oldsize + nextsize) >=
4862 (unsigned long)(nb)) {
4863 newp = oldp;
4864 unlink(next, bck, fwd);
4867 /* allocate, copy, free */
4868 else {
4869 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4870 if (newmem == 0)
4871 return 0; /* propagate failure */
4873 newp = mem2chunk(newmem);
4874 newsize = chunksize(newp);
4877 Avoid copy if newp is next chunk after oldp.
4879 if (newp == next) {
4880 newsize += oldsize;
4881 newp = oldp;
4883 else {
4885 Unroll copy of <= 36 bytes (72 if 8byte sizes)
4886 We know that contents have an odd number of
4887 INTERNAL_SIZE_T-sized words; minimally 3.
4890 copysize = oldsize - SIZE_SZ;
4891 s = (INTERNAL_SIZE_T*)(oldmem);
4892 d = (INTERNAL_SIZE_T*)(newmem);
4893 ncopies = copysize / sizeof(INTERNAL_SIZE_T);
4894 assert(ncopies >= 3);
4896 if (ncopies > 9)
4897 MALLOC_COPY(d, s, copysize);
4899 else {
4900 *(d+0) = *(s+0);
4901 *(d+1) = *(s+1);
4902 *(d+2) = *(s+2);
4903 if (ncopies > 4) {
4904 *(d+3) = *(s+3);
4905 *(d+4) = *(s+4);
4906 if (ncopies > 6) {
4907 *(d+5) = *(s+5);
4908 *(d+6) = *(s+6);
4909 if (ncopies > 8) {
4910 *(d+7) = *(s+7);
4911 *(d+8) = *(s+8);
4917 _int_free(av, oldmem);
4918 check_inuse_chunk(av, newp);
4919 return chunk2mem(newp);
4924 /* If possible, free extra space in old or extended chunk */
4926 assert((unsigned long)(newsize) >= (unsigned long)(nb));
4928 remainder_size = newsize - nb;
4930 if (remainder_size < MINSIZE) { /* not enough extra to split off */
4931 set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
4932 set_inuse_bit_at_offset(newp, newsize);
4934 else { /* split remainder */
4935 remainder = chunk_at_offset(newp, nb);
4936 set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
4937 set_head(remainder, remainder_size | PREV_INUSE |
4938 (av != &main_arena ? NON_MAIN_ARENA : 0));
4939 /* Mark remainder as inuse so free() won't complain */
4940 set_inuse_bit_at_offset(remainder, remainder_size);
4941 _int_free(av, chunk2mem(remainder));
4944 check_inuse_chunk(av, newp);
4945 return chunk2mem(newp);
4949 Handle mmap cases
4952 else {
4953 #if HAVE_MMAP
4955 #if HAVE_MREMAP
4956 INTERNAL_SIZE_T offset = oldp->prev_size;
4957 size_t pagemask = mp_.pagesize - 1;
4958 char *cp;
4959 unsigned long sum;
4961 /* Note the extra SIZE_SZ overhead */
4962 newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
4964 /* don't need to remap if still within same page */
4965 if (oldsize == newsize - offset)
4966 return oldmem;
4968 cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
4970 if (cp != MAP_FAILED) {
4972 newp = (mchunkptr)(cp + offset);
4973 set_head(newp, (newsize - offset)|IS_MMAPPED);
4975 assert(aligned_OK(chunk2mem(newp)));
4976 assert((newp->prev_size == offset));
4978 /* update statistics */
4979 sum = mp_.mmapped_mem += newsize - oldsize;
4980 if (sum > (unsigned long)(mp_.max_mmapped_mem))
4981 mp_.max_mmapped_mem = sum;
4982 #ifdef NO_THREADS
4983 sum += main_arena.system_mem;
4984 if (sum > (unsigned long)(mp_.max_total_mem))
4985 mp_.max_total_mem = sum;
4986 #endif
4988 return chunk2mem(newp);
4990 #endif
4992 /* Note the extra SIZE_SZ overhead. */
4993 if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
4994 newmem = oldmem; /* do nothing */
4995 else {
4996 /* Must alloc, copy, free. */
4997 newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
4998 if (newmem != 0) {
4999 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
5000 _int_free(av, oldmem);
5003 return newmem;
5005 #else
5006 /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
5007 check_malloc_state(av);
5008 MALLOC_FAILURE_ACTION;
5009 return 0;
5010 #endif
5015 ------------------------------ memalign ------------------------------
5018 Void_t*
5019 _int_memalign(mstate av, size_t alignment, size_t bytes)
5021 INTERNAL_SIZE_T nb; /* padded request size */
5022 char* m; /* memory returned by malloc call */
5023 mchunkptr p; /* corresponding chunk */
5024 char* brk; /* alignment point within p */
5025 mchunkptr newp; /* chunk to return */
5026 INTERNAL_SIZE_T newsize; /* its size */
5027 INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
5028 mchunkptr remainder; /* spare room at end to split off */
5029 unsigned long remainder_size; /* its size */
5030 INTERNAL_SIZE_T size;
5032 /* If need less alignment than we give anyway, just relay to malloc */
5034 if (alignment <= MALLOC_ALIGNMENT) return _int_malloc(av, bytes);
5036 /* Otherwise, ensure that it is at least a minimum chunk size */
5038 if (alignment < MINSIZE) alignment = MINSIZE;
5040 /* Make sure alignment is power of 2 (in case MINSIZE is not). */
5041 if ((alignment & (alignment - 1)) != 0) {
5042 size_t a = MALLOC_ALIGNMENT * 2;
5043 while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
5044 alignment = a;
5047 checked_request2size(bytes, nb);
5050 Strategy: find a spot within that chunk that meets the alignment
5051 request, and then possibly free the leading and trailing space.
5055 /* Call malloc with worst case padding to hit alignment. */
5057 m = (char*)(_int_malloc(av, nb + alignment + MINSIZE));
5059 if (m == 0) return 0; /* propagate failure */
5061 p = mem2chunk(m);
5063 if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
5066 Find an aligned spot inside chunk. Since we need to give back
5067 leading space in a chunk of at least MINSIZE, if the first
5068 calculation places us at a spot with less than MINSIZE leader,
5069 we can move to the next aligned spot -- we've allocated enough
5070 total room so that this is always possible.
5073 brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
5074 -((signed long) alignment));
5075 if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
5076 brk += alignment;
5078 newp = (mchunkptr)brk;
5079 leadsize = brk - (char*)(p);
5080 newsize = chunksize(p) - leadsize;
5082 /* For mmapped chunks, just adjust offset */
5083 if (chunk_is_mmapped(p)) {
5084 newp->prev_size = p->prev_size + leadsize;
5085 set_head(newp, newsize|IS_MMAPPED);
5086 return chunk2mem(newp);
5089 /* Otherwise, give back leader, use the rest */
5090 set_head(newp, newsize | PREV_INUSE |
5091 (av != &main_arena ? NON_MAIN_ARENA : 0));
5092 set_inuse_bit_at_offset(newp, newsize);
5093 set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5094 _int_free(av, chunk2mem(p));
5095 p = newp;
5097 assert (newsize >= nb &&
5098 (((unsigned long)(chunk2mem(p))) % alignment) == 0);
5101 /* Also give back spare room at the end */
5102 if (!chunk_is_mmapped(p)) {
5103 size = chunksize(p);
5104 if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
5105 remainder_size = size - nb;
5106 remainder = chunk_at_offset(p, nb);
5107 set_head(remainder, remainder_size | PREV_INUSE |
5108 (av != &main_arena ? NON_MAIN_ARENA : 0));
5109 set_head_size(p, nb);
5110 _int_free(av, chunk2mem(remainder));
5114 check_inuse_chunk(av, p);
5115 return chunk2mem(p);
5118 #if 0
5120 ------------------------------ calloc ------------------------------
5123 #if __STD_C
5124 Void_t* cALLOc(size_t n_elements, size_t elem_size)
5125 #else
5126 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
5127 #endif
5129 mchunkptr p;
5130 unsigned long clearsize;
5131 unsigned long nclears;
5132 INTERNAL_SIZE_T* d;
5134 Void_t* mem = mALLOc(n_elements * elem_size);
5136 if (mem != 0) {
5137 p = mem2chunk(mem);
5139 #if MMAP_CLEARS
5140 if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
5141 #endif
5144 Unroll clear of <= 36 bytes (72 if 8byte sizes)
5145 We know that contents have an odd number of
5146 INTERNAL_SIZE_T-sized words; minimally 3.
5149 d = (INTERNAL_SIZE_T*)mem;
5150 clearsize = chunksize(p) - SIZE_SZ;
5151 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
5152 assert(nclears >= 3);
5154 if (nclears > 9)
5155 MALLOC_ZERO(d, clearsize);
5157 else {
5158 *(d+0) = 0;
5159 *(d+1) = 0;
5160 *(d+2) = 0;
5161 if (nclears > 4) {
5162 *(d+3) = 0;
5163 *(d+4) = 0;
5164 if (nclears > 6) {
5165 *(d+5) = 0;
5166 *(d+6) = 0;
5167 if (nclears > 8) {
5168 *(d+7) = 0;
5169 *(d+8) = 0;
5176 return mem;
5178 #endif /* 0 */
5180 #ifndef _LIBC
5182 ------------------------- independent_calloc -------------------------
5185 Void_t**
5186 #if __STD_C
5187 _int_icalloc(mstate av, size_t n_elements, size_t elem_size, Void_t* chunks[])
5188 #else
5189 _int_icalloc(av, n_elements, elem_size, chunks)
5190 mstate av; size_t n_elements; size_t elem_size; Void_t* chunks[];
5191 #endif
5193 size_t sz = elem_size; /* serves as 1-element array */
5194 /* opts arg of 3 means all elements are same size, and should be cleared */
5195 return iALLOc(av, n_elements, &sz, 3, chunks);
5199 ------------------------- independent_comalloc -------------------------
5202 Void_t**
5203 #if __STD_C
5204 _int_icomalloc(mstate av, size_t n_elements, size_t sizes[], Void_t* chunks[])
5205 #else
5206 _int_icomalloc(av, n_elements, sizes, chunks)
5207 mstate av; size_t n_elements; size_t sizes[]; Void_t* chunks[];
5208 #endif
5210 return iALLOc(av, n_elements, sizes, 0, chunks);
5215 ------------------------------ ialloc ------------------------------
5216 ialloc provides common support for independent_X routines, handling all of
5217 the combinations that can result.
5219 The opts arg has:
5220 bit 0 set if all elements are same size (using sizes[0])
5221 bit 1 set if elements should be zeroed
5225 static Void_t**
5226 #if __STD_C
5227 iALLOc(mstate av, size_t n_elements, size_t* sizes, int opts, Void_t* chunks[])
5228 #else
5229 iALLOc(av, n_elements, sizes, opts, chunks)
5230 mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
5231 #endif
5233 INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
5234 INTERNAL_SIZE_T contents_size; /* total size of elements */
5235 INTERNAL_SIZE_T array_size; /* request size of pointer array */
5236 Void_t* mem; /* malloced aggregate space */
5237 mchunkptr p; /* corresponding chunk */
5238 INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
5239 Void_t** marray; /* either "chunks" or malloced ptr array */
5240 mchunkptr array_chunk; /* chunk for malloced ptr array */
5241 int mmx; /* to disable mmap */
5242 INTERNAL_SIZE_T size;
5243 INTERNAL_SIZE_T size_flags;
5244 size_t i;
5246 /* Ensure initialization/consolidation */
5247 if (have_fastchunks(av)) malloc_consolidate(av);
5249 /* compute array length, if needed */
5250 if (chunks != 0) {
5251 if (n_elements == 0)
5252 return chunks; /* nothing to do */
5253 marray = chunks;
5254 array_size = 0;
5256 else {
5257 /* if empty req, must still return chunk representing empty array */
5258 if (n_elements == 0)
5259 return (Void_t**) _int_malloc(av, 0);
5260 marray = 0;
5261 array_size = request2size(n_elements * (sizeof(Void_t*)));
5264 /* compute total element size */
5265 if (opts & 0x1) { /* all-same-size */
5266 element_size = request2size(*sizes);
5267 contents_size = n_elements * element_size;
5269 else { /* add up all the sizes */
5270 element_size = 0;
5271 contents_size = 0;
5272 for (i = 0; i != n_elements; ++i)
5273 contents_size += request2size(sizes[i]);
5276 /* subtract out alignment bytes from total to minimize overallocation */
5277 size = contents_size + array_size - MALLOC_ALIGN_MASK;
5280 Allocate the aggregate chunk.
5281 But first disable mmap so malloc won't use it, since
5282 we would not be able to later free/realloc space internal
5283 to a segregated mmap region.
5285 mmx = mp_.n_mmaps_max; /* disable mmap */
5286 mp_.n_mmaps_max = 0;
5287 mem = _int_malloc(av, size);
5288 mp_.n_mmaps_max = mmx; /* reset mmap */
5289 if (mem == 0)
5290 return 0;
5292 p = mem2chunk(mem);
5293 assert(!chunk_is_mmapped(p));
5294 remainder_size = chunksize(p);
5296 if (opts & 0x2) { /* optionally clear the elements */
5297 MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
5300 size_flags = PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0);
5302 /* If not provided, allocate the pointer array as final part of chunk */
5303 if (marray == 0) {
5304 array_chunk = chunk_at_offset(p, contents_size);
5305 marray = (Void_t**) (chunk2mem(array_chunk));
5306 set_head(array_chunk, (remainder_size - contents_size) | size_flags);
5307 remainder_size = contents_size;
5310 /* split out elements */
5311 for (i = 0; ; ++i) {
5312 marray[i] = chunk2mem(p);
5313 if (i != n_elements-1) {
5314 if (element_size != 0)
5315 size = element_size;
5316 else
5317 size = request2size(sizes[i]);
5318 remainder_size -= size;
5319 set_head(p, size | size_flags);
5320 p = chunk_at_offset(p, size);
5322 else { /* the final element absorbs any overallocation slop */
5323 set_head(p, remainder_size | size_flags);
5324 break;
5328 #if MALLOC_DEBUG
5329 if (marray != chunks) {
5330 /* final element must have exactly exhausted chunk */
5331 if (element_size != 0)
5332 assert(remainder_size == element_size);
5333 else
5334 assert(remainder_size == request2size(sizes[i]));
5335 check_inuse_chunk(av, mem2chunk(marray));
5338 for (i = 0; i != n_elements; ++i)
5339 check_inuse_chunk(av, mem2chunk(marray[i]));
5340 #endif
5342 return marray;
5344 #endif /* _LIBC */
5348 ------------------------------ valloc ------------------------------
5351 Void_t*
5352 #if __STD_C
5353 _int_valloc(mstate av, size_t bytes)
5354 #else
5355 _int_valloc(av, bytes) mstate av; size_t bytes;
5356 #endif
5358 /* Ensure initialization/consolidation */
5359 if (have_fastchunks(av)) malloc_consolidate(av);
5360 return _int_memalign(av, mp_.pagesize, bytes);
5364 ------------------------------ pvalloc ------------------------------
5368 Void_t*
5369 #if __STD_C
5370 _int_pvalloc(mstate av, size_t bytes)
5371 #else
5372 _int_pvalloc(av, bytes) mstate av, size_t bytes;
5373 #endif
5375 size_t pagesz;
5377 /* Ensure initialization/consolidation */
5378 if (have_fastchunks(av)) malloc_consolidate(av);
5379 pagesz = mp_.pagesize;
5380 return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
5385 ------------------------------ malloc_trim ------------------------------
5388 #if __STD_C
5389 int mTRIm(size_t pad)
5390 #else
5391 int mTRIm(pad) size_t pad;
5392 #endif
5394 mstate av = &main_arena; /* already locked */
5396 /* Ensure initialization/consolidation */
5397 malloc_consolidate(av);
5399 #ifndef MORECORE_CANNOT_TRIM
5400 return sYSTRIm(pad, av);
5401 #else
5402 return 0;
5403 #endif
5408 ------------------------- malloc_usable_size -------------------------
5411 #if __STD_C
5412 size_t mUSABLe(Void_t* mem)
5413 #else
5414 size_t mUSABLe(mem) Void_t* mem;
5415 #endif
5417 mchunkptr p;
5418 if (mem != 0) {
5419 p = mem2chunk(mem);
5420 if (chunk_is_mmapped(p))
5421 return chunksize(p) - 2*SIZE_SZ;
5422 else if (inuse(p))
5423 return chunksize(p) - SIZE_SZ;
5425 return 0;
5429 ------------------------------ mallinfo ------------------------------
5432 struct mallinfo mALLINFo(mstate av)
5434 struct mallinfo mi;
5435 size_t i;
5436 mbinptr b;
5437 mchunkptr p;
5438 INTERNAL_SIZE_T avail;
5439 INTERNAL_SIZE_T fastavail;
5440 int nblocks;
5441 int nfastblocks;
5443 /* Ensure initialization */
5444 if (av->top == 0) malloc_consolidate(av);
5446 check_malloc_state(av);
5448 /* Account for top */
5449 avail = chunksize(av->top);
5450 nblocks = 1; /* top always exists */
5452 /* traverse fastbins */
5453 nfastblocks = 0;
5454 fastavail = 0;
5456 for (i = 0; i < NFASTBINS; ++i) {
5457 for (p = av->fastbins[i]; p != 0; p = p->fd) {
5458 ++nfastblocks;
5459 fastavail += chunksize(p);
5463 avail += fastavail;
5465 /* traverse regular bins */
5466 for (i = 1; i < NBINS; ++i) {
5467 b = bin_at(av, i);
5468 for (p = last(b); p != b; p = p->bk) {
5469 ++nblocks;
5470 avail += chunksize(p);
5474 mi.smblks = nfastblocks;
5475 mi.ordblks = nblocks;
5476 mi.fordblks = avail;
5477 mi.uordblks = av->system_mem - avail;
5478 mi.arena = av->system_mem;
5479 mi.hblks = mp_.n_mmaps;
5480 mi.hblkhd = mp_.mmapped_mem;
5481 mi.fsmblks = fastavail;
5482 mi.keepcost = chunksize(av->top);
5483 mi.usmblks = mp_.max_total_mem;
5484 return mi;
5488 ------------------------------ malloc_stats ------------------------------
5491 void mSTATs()
5493 int i;
5494 mstate ar_ptr;
5495 struct mallinfo mi;
5496 unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
5497 #if THREAD_STATS
5498 long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
5499 #endif
5501 if(__malloc_initialized < 0)
5502 ptmalloc_init ();
5503 #ifdef _LIBC
5504 _IO_flockfile (stderr);
5505 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
5506 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
5507 #endif
5508 for (i=0, ar_ptr = &main_arena;; i++) {
5509 (void)mutex_lock(&ar_ptr->mutex);
5510 mi = mALLINFo(ar_ptr);
5511 fprintf(stderr, "Arena %d:\n", i);
5512 fprintf(stderr, "system bytes = %10u\n", (unsigned int)mi.arena);
5513 fprintf(stderr, "in use bytes = %10u\n", (unsigned int)mi.uordblks);
5514 #if MALLOC_DEBUG > 1
5515 if (i > 0)
5516 dump_heap(heap_for_ptr(top(ar_ptr)));
5517 #endif
5518 system_b += mi.arena;
5519 in_use_b += mi.uordblks;
5520 #if THREAD_STATS
5521 stat_lock_direct += ar_ptr->stat_lock_direct;
5522 stat_lock_loop += ar_ptr->stat_lock_loop;
5523 stat_lock_wait += ar_ptr->stat_lock_wait;
5524 #endif
5525 (void)mutex_unlock(&ar_ptr->mutex);
5526 ar_ptr = ar_ptr->next;
5527 if(ar_ptr == &main_arena) break;
5529 #if HAVE_MMAP
5530 fprintf(stderr, "Total (incl. mmap):\n");
5531 #else
5532 fprintf(stderr, "Total:\n");
5533 #endif
5534 fprintf(stderr, "system bytes = %10u\n", system_b);
5535 fprintf(stderr, "in use bytes = %10u\n", in_use_b);
5536 #ifdef NO_THREADS
5537 fprintf(stderr, "max system bytes = %10u\n", (unsigned int)mp_.max_total_mem);
5538 #endif
5539 #if HAVE_MMAP
5540 fprintf(stderr, "max mmap regions = %10u\n", (unsigned int)mp_.max_n_mmaps);
5541 fprintf(stderr, "max mmap bytes = %10lu\n",
5542 (unsigned long)mp_.max_mmapped_mem);
5543 #endif
5544 #if THREAD_STATS
5545 fprintf(stderr, "heaps created = %10d\n", stat_n_heaps);
5546 fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
5547 fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
5548 fprintf(stderr, "locked waiting = %10ld\n", stat_lock_wait);
5549 fprintf(stderr, "locked total = %10ld\n",
5550 stat_lock_direct + stat_lock_loop + stat_lock_wait);
5551 #endif
5552 #ifdef _LIBC
5553 ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
5554 _IO_funlockfile (stderr);
5555 #endif
5560 ------------------------------ mallopt ------------------------------
5563 #if __STD_C
5564 int mALLOPt(int param_number, int value)
5565 #else
5566 int mALLOPt(param_number, value) int param_number; int value;
5567 #endif
5569 mstate av = &main_arena;
5570 int res = 1;
5572 if(__malloc_initialized < 0)
5573 ptmalloc_init ();
5574 (void)mutex_lock(&av->mutex);
5575 /* Ensure initialization/consolidation */
5576 malloc_consolidate(av);
5578 switch(param_number) {
5579 case M_MXFAST:
5580 if (value >= 0 && value <= MAX_FAST_SIZE) {
5581 set_max_fast(value);
5583 else
5584 res = 0;
5585 break;
5587 case M_TRIM_THRESHOLD:
5588 mp_.trim_threshold = value;
5589 mp_.no_dyn_threshold = 1;
5590 break;
5592 case M_TOP_PAD:
5593 mp_.top_pad = value;
5594 mp_.no_dyn_threshold = 1;
5595 break;
5597 case M_MMAP_THRESHOLD:
5598 #if USE_ARENAS
5599 /* Forbid setting the threshold too high. */
5600 if((unsigned long)value > HEAP_MAX_SIZE/2)
5601 res = 0;
5602 else
5603 #endif
5604 mp_.mmap_threshold = value;
5605 mp_.no_dyn_threshold = 1;
5606 break;
5608 case M_MMAP_MAX:
5609 #if !HAVE_MMAP
5610 if (value != 0)
5611 res = 0;
5612 else
5613 #endif
5614 mp_.n_mmaps_max = value;
5615 mp_.no_dyn_threshold = 1;
5616 break;
5618 case M_CHECK_ACTION:
5619 check_action = value;
5620 break;
5622 case M_PERTURB:
5623 perturb_byte = value;
5624 break;
5626 (void)mutex_unlock(&av->mutex);
5627 return res;
5632 -------------------- Alternative MORECORE functions --------------------
5637 General Requirements for MORECORE.
5639 The MORECORE function must have the following properties:
5641 If MORECORE_CONTIGUOUS is false:
5643 * MORECORE must allocate in multiples of pagesize. It will
5644 only be called with arguments that are multiples of pagesize.
5646 * MORECORE(0) must return an address that is at least
5647 MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
5649 else (i.e. If MORECORE_CONTIGUOUS is true):
5651 * Consecutive calls to MORECORE with positive arguments
5652 return increasing addresses, indicating that space has been
5653 contiguously extended.
5655 * MORECORE need not allocate in multiples of pagesize.
5656 Calls to MORECORE need not have args of multiples of pagesize.
5658 * MORECORE need not page-align.
5660 In either case:
5662 * MORECORE may allocate more memory than requested. (Or even less,
5663 but this will generally result in a malloc failure.)
5665 * MORECORE must not allocate memory when given argument zero, but
5666 instead return one past the end address of memory from previous
5667 nonzero call. This malloc does NOT call MORECORE(0)
5668 until at least one call with positive arguments is made, so
5669 the initial value returned is not important.
5671 * Even though consecutive calls to MORECORE need not return contiguous
5672 addresses, it must be OK for malloc'ed chunks to span multiple
5673 regions in those cases where they do happen to be contiguous.
5675 * MORECORE need not handle negative arguments -- it may instead
5676 just return MORECORE_FAILURE when given negative arguments.
5677 Negative arguments are always multiples of pagesize. MORECORE
5678 must not misinterpret negative args as large positive unsigned
5679 args. You can suppress all such calls from even occurring by defining
5680 MORECORE_CANNOT_TRIM,
5682 There is some variation across systems about the type of the
5683 argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
5684 actually be size_t, because sbrk supports negative args, so it is
5685 normally the signed type of the same width as size_t (sometimes
5686 declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
5687 matter though. Internally, we use "long" as arguments, which should
5688 work across all reasonable possibilities.
5690 Additionally, if MORECORE ever returns failure for a positive
5691 request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
5692 system allocator. This is a useful backup strategy for systems with
5693 holes in address spaces -- in this case sbrk cannot contiguously
5694 expand the heap, but mmap may be able to map noncontiguous space.
5696 If you'd like mmap to ALWAYS be used, you can define MORECORE to be
5697 a function that always returns MORECORE_FAILURE.
5699 If you are using this malloc with something other than sbrk (or its
5700 emulation) to supply memory regions, you probably want to set
5701 MORECORE_CONTIGUOUS as false. As an example, here is a custom
5702 allocator kindly contributed for pre-OSX macOS. It uses virtually
5703 but not necessarily physically contiguous non-paged memory (locked
5704 in, present and won't get swapped out). You can use it by
5705 uncommenting this section, adding some #includes, and setting up the
5706 appropriate defines above:
5708 #define MORECORE osMoreCore
5709 #define MORECORE_CONTIGUOUS 0
5711 There is also a shutdown routine that should somehow be called for
5712 cleanup upon program exit.
5714 #define MAX_POOL_ENTRIES 100
5715 #define MINIMUM_MORECORE_SIZE (64 * 1024)
5716 static int next_os_pool;
5717 void *our_os_pools[MAX_POOL_ENTRIES];
5719 void *osMoreCore(int size)
5721 void *ptr = 0;
5722 static void *sbrk_top = 0;
5724 if (size > 0)
5726 if (size < MINIMUM_MORECORE_SIZE)
5727 size = MINIMUM_MORECORE_SIZE;
5728 if (CurrentExecutionLevel() == kTaskLevel)
5729 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
5730 if (ptr == 0)
5732 return (void *) MORECORE_FAILURE;
5734 // save ptrs so they can be freed during cleanup
5735 our_os_pools[next_os_pool] = ptr;
5736 next_os_pool++;
5737 ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
5738 sbrk_top = (char *) ptr + size;
5739 return ptr;
5741 else if (size < 0)
5743 // we don't currently support shrink behavior
5744 return (void *) MORECORE_FAILURE;
5746 else
5748 return sbrk_top;
5752 // cleanup any allocated memory pools
5753 // called as last thing before shutting down driver
5755 void osCleanupMem(void)
5757 void **ptr;
5759 for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
5760 if (*ptr)
5762 PoolDeallocate(*ptr);
5763 *ptr = 0;
5770 /* Helper code. */
5772 extern char **__libc_argv attribute_hidden;
5774 static void
5775 malloc_printerr(int action, const char *str, void *ptr)
5777 if ((action & 5) == 5)
5778 __libc_message (action & 2, "%s\n", str);
5779 else if (action & 1)
5781 char buf[2 * sizeof (uintptr_t) + 1];
5783 buf[sizeof (buf) - 1] = '\0';
5784 char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
5785 while (cp > buf)
5786 *--cp = '0';
5788 __libc_message (action & 2,
5789 "*** glibc detected *** %s: %s: 0x%s ***\n",
5790 __libc_argv[0] ?: "<unknown>", str, cp);
5792 else if (action & 2)
5793 abort ();
5796 #ifdef _LIBC
5797 # include <sys/param.h>
5799 /* We need a wrapper function for one of the additions of POSIX. */
5801 __posix_memalign (void **memptr, size_t alignment, size_t size)
5803 void *mem;
5804 __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
5805 __const __malloc_ptr_t)) =
5806 __memalign_hook;
5808 /* Test whether the SIZE argument is valid. It must be a power of
5809 two multiple of sizeof (void *). */
5810 if (alignment % sizeof (void *) != 0
5811 || !powerof2 (alignment / sizeof (void *)) != 0
5812 || alignment == 0)
5813 return EINVAL;
5815 /* Call the hook here, so that caller is posix_memalign's caller
5816 and not posix_memalign itself. */
5817 if (hook != NULL)
5818 mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
5819 else
5820 mem = public_mEMALIGn (alignment, size);
5822 if (mem != NULL) {
5823 *memptr = mem;
5824 return 0;
5827 return ENOMEM;
5829 weak_alias (__posix_memalign, posix_memalign)
5831 strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
5832 strong_alias (__libc_free, __cfree) weak_alias (__libc_free, cfree)
5833 strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
5834 strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
5835 strong_alias (__libc_memalign, __memalign)
5836 weak_alias (__libc_memalign, memalign)
5837 strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
5838 strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
5839 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
5840 strong_alias (__libc_mallinfo, __mallinfo)
5841 weak_alias (__libc_mallinfo, mallinfo)
5842 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
5844 weak_alias (__malloc_stats, malloc_stats)
5845 weak_alias (__malloc_usable_size, malloc_usable_size)
5846 weak_alias (__malloc_trim, malloc_trim)
5847 weak_alias (__malloc_get_state, malloc_get_state)
5848 weak_alias (__malloc_set_state, malloc_set_state)
5850 #endif /* _LIBC */
5852 /* ------------------------------------------------------------
5853 History:
5855 [see ftp://g.oswego.edu/pub/misc/malloc.c for the history of dlmalloc]
5859 * Local variables:
5860 * c-basic-offset: 2
5861 * End: