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