Optimie x86-64 SSE4 memcmp for unaligned data.
[platform/upstream/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 #define TWOM (2*1024*1024)
3172   char *cur = (char*)MORECORE(0);
3173   size = (char*)((size_t)(cur + size + TWOM - 1)&~(TWOM-1))-cur;
3174
3175   /*
3176     If contiguous, we can subtract out existing space that we hope to
3177     combine with new space. We add it back later only if
3178     we don't actually get contiguous space.
3179   */
3180
3181   if (contiguous(av))
3182     size -= old_size;
3183
3184   /*
3185     Round to a multiple of page size.
3186     If MORECORE is not contiguous, this ensures that we only call it
3187     with whole-page arguments.  And if MORECORE is contiguous and
3188     this is not first time through, this preserves page-alignment of
3189     previous calls. Otherwise, we correct to page-align below.
3190   */
3191
3192   size = (size + pagemask) & ~pagemask;
3193
3194   /*
3195     Don't try to call MORECORE if argument is so big as to appear
3196     negative. Note that since mmap takes size_t arg, it may succeed
3197     below even if we cannot call MORECORE.
3198   */
3199
3200   if (size > 0)
3201     brk = (char*)(MORECORE(size));
3202
3203   if (brk != (char*)(MORECORE_FAILURE)) {
3204     /* Call the `morecore' hook if necessary.  */
3205     void (*hook) (void) = force_reg (__after_morecore_hook);
3206     if (__builtin_expect (hook != NULL, 0))
3207       (*hook) ();
3208   } else {
3209   /*
3210     If have mmap, try using it as a backup when MORECORE fails or
3211     cannot be used. This is worth doing on systems that have "holes" in
3212     address space, so sbrk cannot extend to give contiguous space, but
3213     space is available elsewhere.  Note that we ignore mmap max count
3214     and threshold limits, since the space will not be used as a
3215     segregated mmap region.
3216   */
3217
3218 #if HAVE_MMAP
3219     /* Cannot merge with old top, so add its size back in */
3220     if (contiguous(av))
3221       size = (size + old_size + pagemask) & ~pagemask;
3222
3223     /* If we are relying on mmap as backup, then use larger units */
3224     if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
3225       size = MMAP_AS_MORECORE_SIZE;
3226
3227     /* Don't try if size wraps around 0 */
3228     if ((unsigned long)(size) > (unsigned long)(nb)) {
3229
3230       char *mbrk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
3231
3232       if (mbrk != MAP_FAILED) {
3233
3234         /* We do not need, and cannot use, another sbrk call to find end */
3235         brk = mbrk;
3236         snd_brk = brk + size;
3237
3238         /*
3239            Record that we no longer have a contiguous sbrk region.
3240            After the first time mmap is used as backup, we do not
3241            ever rely on contiguous space since this could incorrectly
3242            bridge regions.
3243         */
3244         set_noncontiguous(av);
3245       }
3246     }
3247 #endif
3248   }
3249
3250   if (brk != (char*)(MORECORE_FAILURE)) {
3251     if (mp_.sbrk_base == 0)
3252       mp_.sbrk_base = brk;
3253     av->system_mem += size;
3254
3255     /*
3256       If MORECORE extends previous space, we can likewise extend top size.
3257     */
3258
3259     if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE))
3260       set_head(old_top, (size + old_size) | PREV_INUSE);
3261
3262     else if (contiguous(av) && old_size && brk < old_end) {
3263       /* Oops!  Someone else killed our space..  Can't touch anything.  */
3264       malloc_printerr (3, "break adjusted to free malloc space", brk);
3265     }
3266
3267     /*
3268       Otherwise, make adjustments:
3269
3270       * If the first time through or noncontiguous, we need to call sbrk
3271         just to find out where the end of memory lies.
3272
3273       * We need to ensure that all returned chunks from malloc will meet
3274         MALLOC_ALIGNMENT
3275
3276       * If there was an intervening foreign sbrk, we need to adjust sbrk
3277         request size to account for fact that we will not be able to
3278         combine new space with existing space in old_top.
3279
3280       * Almost all systems internally allocate whole pages at a time, in
3281         which case we might as well use the whole last page of request.
3282         So we allocate enough more memory to hit a page boundary now,
3283         which in turn causes future contiguous calls to page-align.
3284     */
3285
3286     else {
3287       front_misalign = 0;
3288       end_misalign = 0;
3289       correction = 0;
3290       aligned_brk = brk;
3291
3292       /* handle contiguous cases */
3293       if (contiguous(av)) {
3294
3295         /* Count foreign sbrk as system_mem.  */
3296         if (old_size)
3297           av->system_mem += brk - old_end;
3298
3299         /* Guarantee alignment of first new chunk made from this space */
3300
3301         front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3302         if (front_misalign > 0) {
3303
3304           /*
3305             Skip over some bytes to arrive at an aligned position.
3306             We don't need to specially mark these wasted front bytes.
3307             They will never be accessed anyway because
3308             prev_inuse of av->top (and any chunk created from its start)
3309             is always true after initialization.
3310           */
3311
3312           correction = MALLOC_ALIGNMENT - front_misalign;
3313           aligned_brk += correction;
3314         }
3315
3316         /*
3317           If this isn't adjacent to existing space, then we will not
3318           be able to merge with old_top space, so must add to 2nd request.
3319         */
3320
3321         correction += old_size;
3322
3323         /* Extend the end address to hit a page boundary */
3324         end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3325         correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3326
3327         assert(correction >= 0);
3328         snd_brk = (char*)(MORECORE(correction));
3329
3330         /*
3331           If can't allocate correction, try to at least find out current
3332           brk.  It might be enough to proceed without failing.
3333
3334           Note that if second sbrk did NOT fail, we assume that space
3335           is contiguous with first sbrk. This is a safe assumption unless
3336           program is multithreaded but doesn't use locks and a foreign sbrk
3337           occurred between our first and second calls.
3338         */
3339
3340         if (snd_brk == (char*)(MORECORE_FAILURE)) {
3341           correction = 0;
3342           snd_brk = (char*)(MORECORE(0));
3343         } else {
3344           /* Call the `morecore' hook if necessary.  */
3345           void (*hook) (void) = force_reg (__after_morecore_hook);
3346           if (__builtin_expect (hook != NULL, 0))
3347             (*hook) ();
3348         }
3349       }
3350
3351       /* handle non-contiguous cases */
3352       else {
3353         /* MORECORE/mmap must correctly align */
3354         assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3355
3356         /* Find out current end of memory */
3357         if (snd_brk == (char*)(MORECORE_FAILURE)) {
3358           snd_brk = (char*)(MORECORE(0));
3359         }
3360       }
3361
3362       /* Adjust top based on results of second sbrk */
3363       if (snd_brk != (char*)(MORECORE_FAILURE)) {
3364         av->top = (mchunkptr)aligned_brk;
3365         set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3366         av->system_mem += correction;
3367
3368         /*
3369           If not the first time through, we either have a
3370           gap due to foreign sbrk or a non-contiguous region.  Insert a
3371           double fencepost at old_top to prevent consolidation with space
3372           we don't own. These fenceposts are artificial chunks that are
3373           marked as inuse and are in any case too small to use.  We need
3374           two to make sizes and alignments work out.
3375         */
3376
3377         if (old_size != 0) {
3378           /*
3379              Shrink old_top to insert fenceposts, keeping size a
3380              multiple of MALLOC_ALIGNMENT. We know there is at least
3381              enough space in old_top to do this.
3382           */
3383           old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3384           set_head(old_top, old_size | PREV_INUSE);
3385
3386           /*
3387             Note that the following assignments completely overwrite
3388             old_top when old_size was previously MINSIZE.  This is
3389             intentional. We need the fencepost, even if old_top otherwise gets
3390             lost.
3391           */
3392           chunk_at_offset(old_top, old_size            )->size =
3393             (2*SIZE_SZ)|PREV_INUSE;
3394
3395           chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
3396             (2*SIZE_SZ)|PREV_INUSE;
3397
3398           /* If possible, release the rest. */
3399           if (old_size >= MINSIZE) {
3400 #ifdef ATOMIC_FASTBINS
3401             _int_free(av, old_top, 1);
3402 #else
3403             _int_free(av, old_top);
3404 #endif
3405           }
3406
3407         }
3408       }
3409     }
3410
3411     /* Update statistics */
3412 #ifdef NO_THREADS
3413     sum = av->system_mem + mp_.mmapped_mem;
3414     if (sum > (unsigned long)(mp_.max_total_mem))
3415       mp_.max_total_mem = sum;
3416 #endif
3417
3418   }
3419
3420   } /* if (av !=  &main_arena) */
3421
3422   if ((unsigned long)av->system_mem > (unsigned long)(av->max_system_mem))
3423     av->max_system_mem = av->system_mem;
3424   check_malloc_state(av);
3425
3426   /* finally, do the allocation */
3427   p = av->top;
3428   size = chunksize(p);
3429
3430   /* check that one of the above allocation paths succeeded */
3431   if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3432     remainder_size = size - nb;
3433     remainder = chunk_at_offset(p, nb);
3434     av->top = remainder;
3435     set_head(p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0));
3436     set_head(remainder, remainder_size | PREV_INUSE);
3437     check_malloced_chunk(av, p, nb);
3438     return chunk2mem(p);
3439   }
3440
3441   /* catch all failure paths */
3442   MALLOC_FAILURE_ACTION;
3443   return 0;
3444 }
3445
3446
3447 /*
3448   sYSTRIm is an inverse of sorts to sYSMALLOc.  It gives memory back
3449   to the system (via negative arguments to sbrk) if there is unused
3450   memory at the `high' end of the malloc pool. It is called
3451   automatically by free() when top space exceeds the trim
3452   threshold. It is also called by the public malloc_trim routine.  It
3453   returns 1 if it actually released any memory, else 0.
3454 */
3455
3456 #if __STD_C
3457 static int sYSTRIm(size_t pad, mstate av)
3458 #else
3459 static int sYSTRIm(pad, av) size_t pad; mstate av;
3460 #endif
3461 {
3462   long  top_size;        /* Amount of top-most memory */
3463   long  extra;           /* Amount to release */
3464   long  released;        /* Amount actually released */
3465   char* current_brk;     /* address returned by pre-check sbrk call */
3466   char* new_brk;         /* address returned by post-check sbrk call */
3467   size_t pagesz;
3468
3469   pagesz = mp_.pagesize;
3470   top_size = chunksize(av->top);
3471
3472   /* Release in pagesize units, keeping at least one page */
3473   extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3474
3475   if (extra > 0) {
3476
3477     /*
3478       Only proceed if end of memory is where we last set it.
3479       This avoids problems if there were foreign sbrk calls.
3480     */
3481     current_brk = (char*)(MORECORE(0));
3482     if (current_brk == (char*)(av->top) + top_size) {
3483
3484       /*
3485         Attempt to release memory. We ignore MORECORE return value,
3486         and instead call again to find out where new end of memory is.
3487         This avoids problems if first call releases less than we asked,
3488         of if failure somehow altered brk value. (We could still
3489         encounter problems if it altered brk in some very bad way,
3490         but the only thing we can do is adjust anyway, which will cause
3491         some downstream failure.)
3492       */
3493
3494       MORECORE(-extra);
3495       /* Call the `morecore' hook if necessary.  */
3496       void (*hook) (void) = force_reg (__after_morecore_hook);
3497       if (__builtin_expect (hook != NULL, 0))
3498         (*hook) ();
3499       new_brk = (char*)(MORECORE(0));
3500
3501       if (new_brk != (char*)MORECORE_FAILURE) {
3502         released = (long)(current_brk - new_brk);
3503
3504         if (released != 0) {
3505           /* Success. Adjust top. */
3506           av->system_mem -= released;
3507           set_head(av->top, (top_size - released) | PREV_INUSE);
3508           check_malloc_state(av);
3509           return 1;
3510         }
3511       }
3512     }
3513   }
3514   return 0;
3515 }
3516
3517 #ifdef HAVE_MMAP
3518
3519 static void
3520 internal_function
3521 #if __STD_C
3522 munmap_chunk(mchunkptr p)
3523 #else
3524 munmap_chunk(p) mchunkptr p;
3525 #endif
3526 {
3527   INTERNAL_SIZE_T size = chunksize(p);
3528
3529   assert (chunk_is_mmapped(p));
3530 #if 0
3531   assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3532   assert((mp_.n_mmaps > 0));
3533 #endif
3534
3535   uintptr_t block = (uintptr_t) p - p->prev_size;
3536   size_t total_size = p->prev_size + size;
3537   /* Unfortunately we have to do the compilers job by hand here.  Normally
3538      we would test BLOCK and TOTAL-SIZE separately for compliance with the
3539      page size.  But gcc does not recognize the optimization possibility
3540      (in the moment at least) so we combine the two values into one before
3541      the bit test.  */
3542   if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
3543     {
3544       malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
3545                        chunk2mem (p));
3546       return;
3547     }
3548
3549   mp_.n_mmaps--;
3550   mp_.mmapped_mem -= total_size;
3551
3552   int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
3553
3554   /* munmap returns non-zero on failure */
3555   assert(ret == 0);
3556 }
3557
3558 #if HAVE_MREMAP
3559
3560 static mchunkptr
3561 internal_function
3562 #if __STD_C
3563 mremap_chunk(mchunkptr p, size_t new_size)
3564 #else
3565 mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
3566 #endif
3567 {
3568   size_t page_mask = mp_.pagesize - 1;
3569   INTERNAL_SIZE_T offset = p->prev_size;
3570   INTERNAL_SIZE_T size = chunksize(p);
3571   char *cp;
3572
3573   assert (chunk_is_mmapped(p));
3574 #if 0
3575   assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
3576   assert((mp_.n_mmaps > 0));
3577 #endif
3578   assert(((size + offset) & (mp_.pagesize-1)) == 0);
3579
3580   /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
3581   new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
3582
3583   /* No need to remap if the number of pages does not change.  */
3584   if (size + offset == new_size)
3585     return p;
3586
3587   cp = (char *)mremap((char *)p - offset, size + offset, new_size,
3588                       MREMAP_MAYMOVE);
3589
3590   if (cp == MAP_FAILED) return 0;
3591
3592   p = (mchunkptr)(cp + offset);
3593
3594   assert(aligned_OK(chunk2mem(p)));
3595
3596   assert((p->prev_size == offset));
3597   set_head(p, (new_size - offset)|IS_MMAPPED);
3598
3599   mp_.mmapped_mem -= size + offset;
3600   mp_.mmapped_mem += new_size;
3601   if ((unsigned long)mp_.mmapped_mem > (unsigned long)mp_.max_mmapped_mem)
3602     mp_.max_mmapped_mem = mp_.mmapped_mem;
3603 #ifdef NO_THREADS
3604   if ((unsigned long)(mp_.mmapped_mem + arena_mem + main_arena.system_mem) >
3605       mp_.max_total_mem)
3606     mp_.max_total_mem = mp_.mmapped_mem + arena_mem + main_arena.system_mem;
3607 #endif
3608   return p;
3609 }
3610
3611 #endif /* HAVE_MREMAP */
3612
3613 #endif /* HAVE_MMAP */
3614
3615 /*------------------------ Public wrappers. --------------------------------*/
3616
3617 Void_t*
3618 public_mALLOc(size_t bytes)
3619 {
3620   mstate ar_ptr;
3621   Void_t *victim;
3622
3623   __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t)
3624     = force_reg (__malloc_hook);
3625   if (__builtin_expect (hook != NULL, 0))
3626     return (*hook)(bytes, RETURN_ADDRESS (0));
3627
3628   arena_lookup(ar_ptr);
3629 #if 0
3630   // XXX We need double-word CAS and fastbins must be extended to also
3631   // XXX hold a generation counter for each entry.
3632   if (ar_ptr) {
3633     INTERNAL_SIZE_T nb;               /* normalized request size */
3634     checked_request2size(bytes, nb);
3635     if (nb <= get_max_fast ()) {
3636       long int idx = fastbin_index(nb);
3637       mfastbinptr* fb = &fastbin (ar_ptr, idx);
3638       mchunkptr pp = *fb;
3639       mchunkptr v;
3640       do
3641         {
3642           v = pp;
3643           if (v == NULL)
3644             break;
3645         }
3646       while ((pp = catomic_compare_and_exchange_val_acq (fb, v->fd, v)) != v);
3647       if (v != 0) {
3648         if (__builtin_expect (fastbin_index (chunksize (v)) != idx, 0))
3649           malloc_printerr (check_action, "malloc(): memory corruption (fast)",
3650                            chunk2mem (v));
3651         check_remalloced_chunk(ar_ptr, v, nb);
3652         void *p = chunk2mem(v);
3653         if (__builtin_expect (perturb_byte, 0))
3654           alloc_perturb (p, bytes);
3655         return p;
3656       }
3657     }
3658   }
3659 #endif
3660
3661   arena_lock(ar_ptr, bytes);
3662   if(!ar_ptr)
3663     return 0;
3664   victim = _int_malloc(ar_ptr, bytes);
3665   if(!victim) {
3666     /* Maybe the failure is due to running out of mmapped areas. */
3667     if(ar_ptr != &main_arena) {
3668       (void)mutex_unlock(&ar_ptr->mutex);
3669       ar_ptr = &main_arena;
3670       (void)mutex_lock(&ar_ptr->mutex);
3671       victim = _int_malloc(ar_ptr, bytes);
3672       (void)mutex_unlock(&ar_ptr->mutex);
3673     } else {
3674 #if USE_ARENAS
3675       /* ... or sbrk() has failed and there is still a chance to mmap() */
3676       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3677       (void)mutex_unlock(&main_arena.mutex);
3678       if(ar_ptr) {
3679         victim = _int_malloc(ar_ptr, bytes);
3680         (void)mutex_unlock(&ar_ptr->mutex);
3681       }
3682 #endif
3683     }
3684   } else
3685     (void)mutex_unlock(&ar_ptr->mutex);
3686   assert(!victim || chunk_is_mmapped(mem2chunk(victim)) ||
3687          ar_ptr == arena_for_chunk(mem2chunk(victim)));
3688   return victim;
3689 }
3690 #ifdef libc_hidden_def
3691 libc_hidden_def(public_mALLOc)
3692 #endif
3693
3694 void
3695 public_fREe(Void_t* mem)
3696 {
3697   mstate ar_ptr;
3698   mchunkptr p;                          /* chunk corresponding to mem */
3699
3700   void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t)
3701     = force_reg (__free_hook);
3702   if (__builtin_expect (hook != NULL, 0)) {
3703     (*hook)(mem, RETURN_ADDRESS (0));
3704     return;
3705   }
3706
3707   if (mem == 0)                              /* free(0) has no effect */
3708     return;
3709
3710   p = mem2chunk(mem);
3711
3712 #if HAVE_MMAP
3713   if (chunk_is_mmapped(p))                       /* release mmapped memory. */
3714   {
3715     /* see if the dynamic brk/mmap threshold needs adjusting */
3716     if (!mp_.no_dyn_threshold
3717         && p->size > mp_.mmap_threshold
3718         && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
3719       {
3720         mp_.mmap_threshold = chunksize (p);
3721         mp_.trim_threshold = 2 * mp_.mmap_threshold;
3722       }
3723     munmap_chunk(p);
3724     return;
3725   }
3726 #endif
3727
3728   ar_ptr = arena_for_chunk(p);
3729 #ifdef ATOMIC_FASTBINS
3730   _int_free(ar_ptr, p, 0);
3731 #else
3732 # if THREAD_STATS
3733   if(!mutex_trylock(&ar_ptr->mutex))
3734     ++(ar_ptr->stat_lock_direct);
3735   else {
3736     (void)mutex_lock(&ar_ptr->mutex);
3737     ++(ar_ptr->stat_lock_wait);
3738   }
3739 # else
3740   (void)mutex_lock(&ar_ptr->mutex);
3741 # endif
3742   _int_free(ar_ptr, p);
3743   (void)mutex_unlock(&ar_ptr->mutex);
3744 #endif
3745 }
3746 #ifdef libc_hidden_def
3747 libc_hidden_def (public_fREe)
3748 #endif
3749
3750 Void_t*
3751 public_rEALLOc(Void_t* oldmem, size_t bytes)
3752 {
3753   mstate ar_ptr;
3754   INTERNAL_SIZE_T    nb;      /* padded request size */
3755
3756   Void_t* newp;             /* chunk to return */
3757
3758   __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) =
3759     force_reg (__realloc_hook);
3760   if (__builtin_expect (hook != NULL, 0))
3761     return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
3762
3763 #if REALLOC_ZERO_BYTES_FREES
3764   if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; }
3765 #endif
3766
3767   /* realloc of null is supposed to be same as malloc */
3768   if (oldmem == 0) return public_mALLOc(bytes);
3769
3770   /* chunk corresponding to oldmem */
3771   const mchunkptr oldp    = mem2chunk(oldmem);
3772   /* its size */
3773   const INTERNAL_SIZE_T oldsize = chunksize(oldp);
3774
3775   /* Little security check which won't hurt performance: the
3776      allocator never wrapps around at the end of the address space.
3777      Therefore we can exclude some size values which might appear
3778      here by accident or by "design" from some intruder.  */
3779   if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
3780       || __builtin_expect (misaligned_chunk (oldp), 0))
3781     {
3782       malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
3783       return NULL;
3784     }
3785
3786   checked_request2size(bytes, nb);
3787
3788 #if HAVE_MMAP
3789   if (chunk_is_mmapped(oldp))
3790   {
3791     Void_t* newmem;
3792
3793 #if HAVE_MREMAP
3794     newp = mremap_chunk(oldp, nb);
3795     if(newp) return chunk2mem(newp);
3796 #endif
3797     /* Note the extra SIZE_SZ overhead. */
3798     if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
3799     /* Must alloc, copy, free. */
3800     newmem = public_mALLOc(bytes);
3801     if (newmem == 0) return 0; /* propagate failure */
3802     MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
3803     munmap_chunk(oldp);
3804     return newmem;
3805   }
3806 #endif
3807
3808   ar_ptr = arena_for_chunk(oldp);
3809 #if THREAD_STATS
3810   if(!mutex_trylock(&ar_ptr->mutex))
3811     ++(ar_ptr->stat_lock_direct);
3812   else {
3813     (void)mutex_lock(&ar_ptr->mutex);
3814     ++(ar_ptr->stat_lock_wait);
3815   }
3816 #else
3817   (void)mutex_lock(&ar_ptr->mutex);
3818 #endif
3819
3820 #if !defined NO_THREADS && !defined PER_THREAD
3821   /* As in malloc(), remember this arena for the next allocation. */
3822   tsd_setspecific(arena_key, (Void_t *)ar_ptr);
3823 #endif
3824
3825   newp = _int_realloc(ar_ptr, oldp, oldsize, nb);
3826
3827   (void)mutex_unlock(&ar_ptr->mutex);
3828   assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
3829          ar_ptr == arena_for_chunk(mem2chunk(newp)));
3830
3831   if (newp == NULL)
3832     {
3833       /* Try harder to allocate memory in other arenas.  */
3834       newp = public_mALLOc(bytes);
3835       if (newp != NULL)
3836         {
3837           MALLOC_COPY (newp, oldmem, oldsize - SIZE_SZ);
3838 #ifdef ATOMIC_FASTBINS
3839           _int_free(ar_ptr, oldp, 0);
3840 #else
3841 # if THREAD_STATS
3842           if(!mutex_trylock(&ar_ptr->mutex))
3843             ++(ar_ptr->stat_lock_direct);
3844           else {
3845             (void)mutex_lock(&ar_ptr->mutex);
3846             ++(ar_ptr->stat_lock_wait);
3847           }
3848 # else
3849           (void)mutex_lock(&ar_ptr->mutex);
3850 # endif
3851           _int_free(ar_ptr, oldp);
3852           (void)mutex_unlock(&ar_ptr->mutex);
3853 #endif
3854         }
3855     }
3856
3857   return newp;
3858 }
3859 #ifdef libc_hidden_def
3860 libc_hidden_def (public_rEALLOc)
3861 #endif
3862
3863 Void_t*
3864 public_mEMALIGn(size_t alignment, size_t bytes)
3865 {
3866   mstate ar_ptr;
3867   Void_t *p;
3868
3869   __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3870                                         __const __malloc_ptr_t)) =
3871     force_reg (__memalign_hook);
3872   if (__builtin_expect (hook != NULL, 0))
3873     return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
3874
3875   /* If need less alignment than we give anyway, just relay to malloc */
3876   if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes);
3877
3878   /* Otherwise, ensure that it is at least a minimum chunk size */
3879   if (alignment <  MINSIZE) alignment = MINSIZE;
3880
3881   arena_get(ar_ptr, bytes + alignment + MINSIZE);
3882   if(!ar_ptr)
3883     return 0;
3884   p = _int_memalign(ar_ptr, alignment, bytes);
3885   if(!p) {
3886     /* Maybe the failure is due to running out of mmapped areas. */
3887     if(ar_ptr != &main_arena) {
3888       (void)mutex_unlock(&ar_ptr->mutex);
3889       ar_ptr = &main_arena;
3890       (void)mutex_lock(&ar_ptr->mutex);
3891       p = _int_memalign(ar_ptr, alignment, bytes);
3892       (void)mutex_unlock(&ar_ptr->mutex);
3893     } else {
3894 #if USE_ARENAS
3895       /* ... or sbrk() has failed and there is still a chance to mmap() */
3896       mstate prev = ar_ptr->next ? ar_ptr : 0;
3897       (void)mutex_unlock(&ar_ptr->mutex);
3898       ar_ptr = arena_get2(prev, bytes);
3899       if(ar_ptr) {
3900         p = _int_memalign(ar_ptr, alignment, bytes);
3901         (void)mutex_unlock(&ar_ptr->mutex);
3902       }
3903 #endif
3904     }
3905   } else
3906     (void)mutex_unlock(&ar_ptr->mutex);
3907   assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3908          ar_ptr == arena_for_chunk(mem2chunk(p)));
3909   return p;
3910 }
3911 #ifdef libc_hidden_def
3912 libc_hidden_def (public_mEMALIGn)
3913 #endif
3914
3915 Void_t*
3916 public_vALLOc(size_t bytes)
3917 {
3918   mstate ar_ptr;
3919   Void_t *p;
3920
3921   if(__malloc_initialized < 0)
3922     ptmalloc_init ();
3923
3924   size_t pagesz = mp_.pagesize;
3925
3926   __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3927                                         __const __malloc_ptr_t)) =
3928     force_reg (__memalign_hook);
3929   if (__builtin_expect (hook != NULL, 0))
3930     return (*hook)(pagesz, bytes, RETURN_ADDRESS (0));
3931
3932   arena_get(ar_ptr, bytes + pagesz + MINSIZE);
3933   if(!ar_ptr)
3934     return 0;
3935   p = _int_valloc(ar_ptr, bytes);
3936   (void)mutex_unlock(&ar_ptr->mutex);
3937   if(!p) {
3938     /* Maybe the failure is due to running out of mmapped areas. */
3939     if(ar_ptr != &main_arena) {
3940       ar_ptr = &main_arena;
3941       (void)mutex_lock(&ar_ptr->mutex);
3942       p = _int_memalign(ar_ptr, pagesz, bytes);
3943       (void)mutex_unlock(&ar_ptr->mutex);
3944     } else {
3945 #if USE_ARENAS
3946       /* ... or sbrk() has failed and there is still a chance to mmap() */
3947       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
3948       if(ar_ptr) {
3949         p = _int_memalign(ar_ptr, pagesz, bytes);
3950         (void)mutex_unlock(&ar_ptr->mutex);
3951       }
3952 #endif
3953     }
3954   }
3955   assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
3956          ar_ptr == arena_for_chunk(mem2chunk(p)));
3957
3958   return p;
3959 }
3960
3961 Void_t*
3962 public_pVALLOc(size_t bytes)
3963 {
3964   mstate ar_ptr;
3965   Void_t *p;
3966
3967   if(__malloc_initialized < 0)
3968     ptmalloc_init ();
3969
3970   size_t pagesz = mp_.pagesize;
3971   size_t page_mask = mp_.pagesize - 1;
3972   size_t rounded_bytes = (bytes + page_mask) & ~(page_mask);
3973
3974   __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
3975                                         __const __malloc_ptr_t)) =
3976     force_reg (__memalign_hook);
3977   if (__builtin_expect (hook != NULL, 0))
3978     return (*hook)(pagesz, rounded_bytes, RETURN_ADDRESS (0));
3979
3980   arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE);
3981   p = _int_pvalloc(ar_ptr, bytes);
3982   (void)mutex_unlock(&ar_ptr->mutex);
3983   if(!p) {
3984     /* Maybe the failure is due to running out of mmapped areas. */
3985     if(ar_ptr != &main_arena) {
3986       ar_ptr = &main_arena;
3987       (void)mutex_lock(&ar_ptr->mutex);
3988       p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
3989       (void)mutex_unlock(&ar_ptr->mutex);
3990     } else {
3991 #if USE_ARENAS
3992       /* ... or sbrk() has failed and there is still a chance to mmap() */
3993       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0,
3994                           bytes + 2*pagesz + MINSIZE);
3995       if(ar_ptr) {
3996         p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
3997         (void)mutex_unlock(&ar_ptr->mutex);
3998       }
3999 #endif
4000     }
4001   }
4002   assert(!p || chunk_is_mmapped(mem2chunk(p)) ||
4003          ar_ptr == arena_for_chunk(mem2chunk(p)));
4004
4005   return p;
4006 }
4007
4008 Void_t*
4009 public_cALLOc(size_t n, size_t elem_size)
4010 {
4011   mstate av;
4012   mchunkptr oldtop, p;
4013   INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
4014   Void_t* mem;
4015   unsigned long clearsize;
4016   unsigned long nclears;
4017   INTERNAL_SIZE_T* d;
4018
4019   /* size_t is unsigned so the behavior on overflow is defined.  */
4020   bytes = n * elem_size;
4021 #define HALF_INTERNAL_SIZE_T \
4022   (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2))
4023   if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) {
4024     if (elem_size != 0 && bytes / elem_size != n) {
4025       MALLOC_FAILURE_ACTION;
4026       return 0;
4027     }
4028   }
4029
4030   __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, __const __malloc_ptr_t)) =
4031     force_reg (__malloc_hook);
4032   if (__builtin_expect (hook != NULL, 0)) {
4033     sz = bytes;
4034     mem = (*hook)(sz, RETURN_ADDRESS (0));
4035     if(mem == 0)
4036       return 0;
4037 #ifdef HAVE_MEMCPY
4038     return memset(mem, 0, sz);
4039 #else
4040     while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
4041     return mem;
4042 #endif
4043   }
4044
4045   sz = bytes;
4046
4047   arena_get(av, sz);
4048   if(!av)
4049     return 0;
4050
4051   /* Check if we hand out the top chunk, in which case there may be no
4052      need to clear. */
4053 #if MORECORE_CLEARS
4054   oldtop = top(av);
4055   oldtopsize = chunksize(top(av));
4056 #if MORECORE_CLEARS < 2
4057   /* Only newly allocated memory is guaranteed to be cleared.  */
4058   if (av == &main_arena &&
4059       oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
4060     oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
4061 #endif
4062   if (av != &main_arena)
4063     {
4064       heap_info *heap = heap_for_ptr (oldtop);
4065       if (oldtopsize < (char *) heap + heap->mprotect_size - (char *) oldtop)
4066         oldtopsize = (char *) heap + heap->mprotect_size - (char *) oldtop;
4067     }
4068 #endif
4069   mem = _int_malloc(av, sz);
4070
4071   /* Only clearing follows, so we can unlock early. */
4072   (void)mutex_unlock(&av->mutex);
4073
4074   assert(!mem || chunk_is_mmapped(mem2chunk(mem)) ||
4075          av == arena_for_chunk(mem2chunk(mem)));
4076
4077   if (mem == 0) {
4078     /* Maybe the failure is due to running out of mmapped areas. */
4079     if(av != &main_arena) {
4080       (void)mutex_lock(&main_arena.mutex);
4081       mem = _int_malloc(&main_arena, sz);
4082       (void)mutex_unlock(&main_arena.mutex);
4083     } else {
4084 #if USE_ARENAS
4085       /* ... or sbrk() has failed and there is still a chance to mmap() */
4086       (void)mutex_lock(&main_arena.mutex);
4087       av = arena_get2(av->next ? av : 0, sz);
4088       (void)mutex_unlock(&main_arena.mutex);
4089       if(av) {
4090         mem = _int_malloc(av, sz);
4091         (void)mutex_unlock(&av->mutex);
4092       }
4093 #endif
4094     }
4095     if (mem == 0) return 0;
4096   }
4097   p = mem2chunk(mem);
4098
4099   /* Two optional cases in which clearing not necessary */
4100 #if HAVE_MMAP
4101   if (chunk_is_mmapped (p))
4102     {
4103       if (__builtin_expect (perturb_byte, 0))
4104         MALLOC_ZERO (mem, sz);
4105       return mem;
4106     }
4107 #endif
4108
4109   csz = chunksize(p);
4110
4111 #if MORECORE_CLEARS
4112   if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) {
4113     /* clear only the bytes from non-freshly-sbrked memory */
4114     csz = oldtopsize;
4115   }
4116 #endif
4117
4118   /* Unroll clear of <= 36 bytes (72 if 8byte sizes).  We know that
4119      contents have an odd number of INTERNAL_SIZE_T-sized words;
4120      minimally 3.  */
4121   d = (INTERNAL_SIZE_T*)mem;
4122   clearsize = csz - SIZE_SZ;
4123   nclears = clearsize / sizeof(INTERNAL_SIZE_T);
4124   assert(nclears >= 3);
4125
4126   if (nclears > 9)
4127     MALLOC_ZERO(d, clearsize);
4128
4129   else {
4130     *(d+0) = 0;
4131     *(d+1) = 0;
4132     *(d+2) = 0;
4133     if (nclears > 4) {
4134       *(d+3) = 0;
4135       *(d+4) = 0;
4136       if (nclears > 6) {
4137         *(d+5) = 0;
4138         *(d+6) = 0;
4139         if (nclears > 8) {
4140           *(d+7) = 0;
4141           *(d+8) = 0;
4142         }
4143       }
4144     }
4145   }
4146
4147   return mem;
4148 }
4149
4150 #ifndef _LIBC
4151
4152 Void_t**
4153 public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
4154 {
4155   mstate ar_ptr;
4156   Void_t** m;
4157
4158   arena_get(ar_ptr, n*elem_size);
4159   if(!ar_ptr)
4160     return 0;
4161
4162   m = _int_icalloc(ar_ptr, n, elem_size, chunks);
4163   (void)mutex_unlock(&ar_ptr->mutex);
4164   return m;
4165 }
4166
4167 Void_t**
4168 public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
4169 {
4170   mstate ar_ptr;
4171   Void_t** m;
4172
4173   arena_get(ar_ptr, 0);
4174   if(!ar_ptr)
4175     return 0;
4176
4177   m = _int_icomalloc(ar_ptr, n, sizes, chunks);
4178   (void)mutex_unlock(&ar_ptr->mutex);
4179   return m;
4180 }
4181
4182 void
4183 public_cFREe(Void_t* m)
4184 {
4185   public_fREe(m);
4186 }
4187
4188 #endif /* _LIBC */
4189
4190 int
4191 public_mTRIm(size_t s)
4192 {
4193   int result = 0;
4194
4195   if(__malloc_initialized < 0)
4196     ptmalloc_init ();
4197
4198   mstate ar_ptr = &main_arena;
4199   do
4200     {
4201       (void) mutex_lock (&ar_ptr->mutex);
4202       result |= mTRIm (ar_ptr, s);
4203       (void) mutex_unlock (&ar_ptr->mutex);
4204
4205       ar_ptr = ar_ptr->next;
4206     }
4207   while (ar_ptr != &main_arena);
4208
4209   return result;
4210 }
4211
4212 size_t
4213 public_mUSABLe(Void_t* m)
4214 {
4215   size_t result;
4216
4217   result = mUSABLe(m);
4218   return result;
4219 }
4220
4221 void
4222 public_mSTATs()
4223 {
4224   mSTATs();
4225 }
4226
4227 struct mallinfo public_mALLINFo()
4228 {
4229   struct mallinfo m;
4230
4231   if(__malloc_initialized < 0)
4232     ptmalloc_init ();
4233   (void)mutex_lock(&main_arena.mutex);
4234   m = mALLINFo(&main_arena);
4235   (void)mutex_unlock(&main_arena.mutex);
4236   return m;
4237 }
4238
4239 int
4240 public_mALLOPt(int p, int v)
4241 {
4242   int result;
4243   result = mALLOPt(p, v);
4244   return result;
4245 }
4246
4247 /*
4248   ------------------------------ malloc ------------------------------
4249 */
4250
4251 static Void_t*
4252 _int_malloc(mstate av, size_t bytes)
4253 {
4254   INTERNAL_SIZE_T nb;               /* normalized request size */
4255   unsigned int    idx;              /* associated bin index */
4256   mbinptr         bin;              /* associated bin */
4257
4258   mchunkptr       victim;           /* inspected/selected chunk */
4259   INTERNAL_SIZE_T size;             /* its size */
4260   int             victim_index;     /* its bin index */
4261
4262   mchunkptr       remainder;        /* remainder from a split */
4263   unsigned long   remainder_size;   /* its size */
4264
4265   unsigned int    block;            /* bit map traverser */
4266   unsigned int    bit;              /* bit map traverser */
4267   unsigned int    map;              /* current word of binmap */
4268
4269   mchunkptr       fwd;              /* misc temp for linking */
4270   mchunkptr       bck;              /* misc temp for linking */
4271
4272   const char *errstr = NULL;
4273
4274   /*
4275     Convert request size to internal form by adding SIZE_SZ bytes
4276     overhead plus possibly more to obtain necessary alignment and/or
4277     to obtain a size of at least MINSIZE, the smallest allocatable
4278     size. Also, checked_request2size traps (returning 0) request sizes
4279     that are so large that they wrap around zero when padded and
4280     aligned.
4281   */
4282
4283   checked_request2size(bytes, nb);
4284
4285   /*
4286     If the size qualifies as a fastbin, first check corresponding bin.
4287     This code is safe to execute even if av is not yet initialized, so we
4288     can try it without checking, which saves some time on this fast path.
4289   */
4290
4291   if ((unsigned long)(nb) <= (unsigned long)(get_max_fast ())) {
4292     idx = fastbin_index(nb);
4293     mfastbinptr* fb = &fastbin (av, idx);
4294 #ifdef ATOMIC_FASTBINS
4295     mchunkptr pp = *fb;
4296     do
4297       {
4298         victim = pp;
4299         if (victim == NULL)
4300           break;
4301       }
4302     while ((pp = catomic_compare_and_exchange_val_acq (fb, victim->fd, victim))
4303            != victim);
4304 #else
4305     victim = *fb;
4306 #endif
4307     if (victim != 0) {
4308       if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
4309         {
4310           errstr = "malloc(): memory corruption (fast)";
4311         errout:
4312           malloc_printerr (check_action, errstr, chunk2mem (victim));
4313           return NULL;
4314         }
4315 #ifndef ATOMIC_FASTBINS
4316       *fb = victim->fd;
4317 #endif
4318       check_remalloced_chunk(av, victim, nb);
4319       void *p = chunk2mem(victim);
4320       if (__builtin_expect (perturb_byte, 0))
4321         alloc_perturb (p, bytes);
4322       return p;
4323     }
4324   }
4325
4326   /*
4327     If a small request, check regular bin.  Since these "smallbins"
4328     hold one size each, no searching within bins is necessary.
4329     (For a large request, we need to wait until unsorted chunks are
4330     processed to find best fit. But for small ones, fits are exact
4331     anyway, so we can check now, which is faster.)
4332   */
4333
4334   if (in_smallbin_range(nb)) {
4335     idx = smallbin_index(nb);
4336     bin = bin_at(av,idx);
4337
4338     if ( (victim = last(bin)) != bin) {
4339       if (victim == 0) /* initialization check */
4340         malloc_consolidate(av);
4341       else {
4342         bck = victim->bk;
4343         if (__builtin_expect (bck->fd != victim, 0))
4344           {
4345             errstr = "malloc(): smallbin double linked list corrupted";
4346             goto errout;
4347           }
4348         set_inuse_bit_at_offset(victim, nb);
4349         bin->bk = bck;
4350         bck->fd = bin;
4351
4352         if (av != &main_arena)
4353           victim->size |= NON_MAIN_ARENA;
4354         check_malloced_chunk(av, victim, nb);
4355         void *p = chunk2mem(victim);
4356         if (__builtin_expect (perturb_byte, 0))
4357           alloc_perturb (p, bytes);
4358         return p;
4359       }
4360     }
4361   }
4362
4363   /*
4364      If this is a large request, consolidate fastbins before continuing.
4365      While it might look excessive to kill all fastbins before
4366      even seeing if there is space available, this avoids
4367      fragmentation problems normally associated with fastbins.
4368      Also, in practice, programs tend to have runs of either small or
4369      large requests, but less often mixtures, so consolidation is not
4370      invoked all that often in most programs. And the programs that
4371      it is called frequently in otherwise tend to fragment.
4372   */
4373
4374   else {
4375     idx = largebin_index(nb);
4376     if (have_fastchunks(av))
4377       malloc_consolidate(av);
4378   }
4379
4380   /*
4381     Process recently freed or remaindered chunks, taking one only if
4382     it is exact fit, or, if this a small request, the chunk is remainder from
4383     the most recent non-exact fit.  Place other traversed chunks in
4384     bins.  Note that this step is the only place in any routine where
4385     chunks are placed in bins.
4386
4387     The outer loop here is needed because we might not realize until
4388     near the end of malloc that we should have consolidated, so must
4389     do so and retry. This happens at most once, and only when we would
4390     otherwise need to expand memory to service a "small" request.
4391   */
4392
4393   for(;;) {
4394
4395     int iters = 0;
4396     while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
4397       bck = victim->bk;
4398       if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
4399           || __builtin_expect (victim->size > av->system_mem, 0))
4400         malloc_printerr (check_action, "malloc(): memory corruption",
4401                          chunk2mem (victim));
4402       size = chunksize(victim);
4403
4404       /*
4405          If a small request, try to use last remainder if it is the
4406          only chunk in unsorted bin.  This helps promote locality for
4407          runs of consecutive small requests. This is the only
4408          exception to best-fit, and applies only when there is
4409          no exact fit for a small chunk.
4410       */
4411
4412       if (in_smallbin_range(nb) &&
4413           bck == unsorted_chunks(av) &&
4414           victim == av->last_remainder &&
4415           (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4416
4417         /* split and reattach remainder */
4418         remainder_size = size - nb;
4419         remainder = chunk_at_offset(victim, nb);
4420         unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
4421         av->last_remainder = remainder;
4422         remainder->bk = remainder->fd = unsorted_chunks(av);
4423         if (!in_smallbin_range(remainder_size))
4424           {
4425             remainder->fd_nextsize = NULL;
4426             remainder->bk_nextsize = NULL;
4427           }
4428
4429         set_head(victim, nb | PREV_INUSE |
4430                  (av != &main_arena ? NON_MAIN_ARENA : 0));
4431         set_head(remainder, remainder_size | PREV_INUSE);
4432         set_foot(remainder, remainder_size);
4433
4434         check_malloced_chunk(av, victim, nb);
4435         void *p = chunk2mem(victim);
4436         if (__builtin_expect (perturb_byte, 0))
4437           alloc_perturb (p, bytes);
4438         return p;
4439       }
4440
4441       /* remove from unsorted list */
4442       unsorted_chunks(av)->bk = bck;
4443       bck->fd = unsorted_chunks(av);
4444
4445       /* Take now instead of binning if exact fit */
4446
4447       if (size == nb) {
4448         set_inuse_bit_at_offset(victim, size);
4449         if (av != &main_arena)
4450           victim->size |= NON_MAIN_ARENA;
4451         check_malloced_chunk(av, victim, nb);
4452         void *p = chunk2mem(victim);
4453         if (__builtin_expect (perturb_byte, 0))
4454           alloc_perturb (p, bytes);
4455         return p;
4456       }
4457
4458       /* place chunk in bin */
4459
4460       if (in_smallbin_range(size)) {
4461         victim_index = smallbin_index(size);
4462         bck = bin_at(av, victim_index);
4463         fwd = bck->fd;
4464       }
4465       else {
4466         victim_index = largebin_index(size);
4467         bck = bin_at(av, victim_index);
4468         fwd = bck->fd;
4469
4470         /* maintain large bins in sorted order */
4471         if (fwd != bck) {
4472           /* Or with inuse bit to speed comparisons */
4473           size |= PREV_INUSE;
4474           /* if smaller than smallest, bypass loop below */
4475           assert((bck->bk->size & NON_MAIN_ARENA) == 0);
4476           if ((unsigned long)(size) < (unsigned long)(bck->bk->size)) {
4477             fwd = bck;
4478             bck = bck->bk;
4479
4480             victim->fd_nextsize = fwd->fd;
4481             victim->bk_nextsize = fwd->fd->bk_nextsize;
4482             fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
4483           }
4484           else {
4485             assert((fwd->size & NON_MAIN_ARENA) == 0);
4486             while ((unsigned long) size < fwd->size)
4487               {
4488                 fwd = fwd->fd_nextsize;
4489                 assert((fwd->size & NON_MAIN_ARENA) == 0);
4490               }
4491
4492             if ((unsigned long) size == (unsigned long) fwd->size)
4493               /* Always insert in the second position.  */
4494               fwd = fwd->fd;
4495             else
4496               {
4497                 victim->fd_nextsize = fwd;
4498                 victim->bk_nextsize = fwd->bk_nextsize;
4499                 fwd->bk_nextsize = victim;
4500                 victim->bk_nextsize->fd_nextsize = victim;
4501               }
4502             bck = fwd->bk;
4503           }
4504         } else
4505           victim->fd_nextsize = victim->bk_nextsize = victim;
4506       }
4507
4508       mark_bin(av, victim_index);
4509       victim->bk = bck;
4510       victim->fd = fwd;
4511       fwd->bk = victim;
4512       bck->fd = victim;
4513
4514 #define MAX_ITERS       10000
4515       if (++iters >= MAX_ITERS)
4516         break;
4517     }
4518
4519     /*
4520       If a large request, scan through the chunks of current bin in
4521       sorted order to find smallest that fits.  Use the skip list for this.
4522     */
4523
4524     if (!in_smallbin_range(nb)) {
4525       bin = bin_at(av, idx);
4526
4527       /* skip scan if empty or largest chunk is too small */
4528       if ((victim = first(bin)) != bin &&
4529           (unsigned long)(victim->size) >= (unsigned long)(nb)) {
4530
4531         victim = victim->bk_nextsize;
4532         while (((unsigned long)(size = chunksize(victim)) <
4533                 (unsigned long)(nb)))
4534           victim = victim->bk_nextsize;
4535
4536         /* Avoid removing the first entry for a size so that the skip
4537            list does not have to be rerouted.  */
4538         if (victim != last(bin) && victim->size == victim->fd->size)
4539           victim = victim->fd;
4540
4541         remainder_size = size - nb;
4542         unlink(victim, bck, fwd);
4543
4544         /* Exhaust */
4545         if (remainder_size < MINSIZE)  {
4546           set_inuse_bit_at_offset(victim, size);
4547           if (av != &main_arena)
4548             victim->size |= NON_MAIN_ARENA;
4549         }
4550         /* Split */
4551         else {
4552           remainder = chunk_at_offset(victim, nb);
4553           /* We cannot assume the unsorted list is empty and therefore
4554              have to perform a complete insert here.  */
4555           bck = unsorted_chunks(av);
4556           fwd = bck->fd;
4557           if (__builtin_expect (fwd->bk != bck, 0))
4558             {
4559               errstr = "malloc(): corrupted unsorted chunks";
4560               goto errout;
4561             }
4562           remainder->bk = bck;
4563           remainder->fd = fwd;
4564           bck->fd = remainder;
4565           fwd->bk = remainder;
4566           if (!in_smallbin_range(remainder_size))
4567             {
4568               remainder->fd_nextsize = NULL;
4569               remainder->bk_nextsize = NULL;
4570             }
4571           set_head(victim, nb | PREV_INUSE |
4572                    (av != &main_arena ? NON_MAIN_ARENA : 0));
4573           set_head(remainder, remainder_size | PREV_INUSE);
4574           set_foot(remainder, remainder_size);
4575         }
4576         check_malloced_chunk(av, victim, nb);
4577         void *p = chunk2mem(victim);
4578         if (__builtin_expect (perturb_byte, 0))
4579           alloc_perturb (p, bytes);
4580         return p;
4581       }
4582     }
4583
4584     /*
4585       Search for a chunk by scanning bins, starting with next largest
4586       bin. This search is strictly by best-fit; i.e., the smallest
4587       (with ties going to approximately the least recently used) chunk
4588       that fits is selected.
4589
4590       The bitmap avoids needing to check that most blocks are nonempty.
4591       The particular case of skipping all bins during warm-up phases
4592       when no chunks have been returned yet is faster than it might look.
4593     */
4594
4595     ++idx;
4596     bin = bin_at(av,idx);
4597     block = idx2block(idx);
4598     map = av->binmap[block];
4599     bit = idx2bit(idx);
4600
4601     for (;;) {
4602
4603       /* Skip rest of block if there are no more set bits in this block.  */
4604       if (bit > map || bit == 0) {
4605         do {
4606           if (++block >= BINMAPSIZE)  /* out of bins */
4607             goto use_top;
4608         } while ( (map = av->binmap[block]) == 0);
4609
4610         bin = bin_at(av, (block << BINMAPSHIFT));
4611         bit = 1;
4612       }
4613
4614       /* Advance to bin with set bit. There must be one. */
4615       while ((bit & map) == 0) {
4616         bin = next_bin(bin);
4617         bit <<= 1;
4618         assert(bit != 0);
4619       }
4620
4621       /* Inspect the bin. It is likely to be non-empty */
4622       victim = last(bin);
4623
4624       /*  If a false alarm (empty bin), clear the bit. */
4625       if (victim == bin) {
4626         av->binmap[block] = map &= ~bit; /* Write through */
4627         bin = next_bin(bin);
4628         bit <<= 1;
4629       }
4630
4631       else {
4632         size = chunksize(victim);
4633
4634         /*  We know the first chunk in this bin is big enough to use. */
4635         assert((unsigned long)(size) >= (unsigned long)(nb));
4636
4637         remainder_size = size - nb;
4638
4639         /* unlink */
4640         unlink(victim, bck, fwd);
4641
4642         /* Exhaust */
4643         if (remainder_size < MINSIZE) {
4644           set_inuse_bit_at_offset(victim, size);
4645           if (av != &main_arena)
4646             victim->size |= NON_MAIN_ARENA;
4647         }
4648
4649         /* Split */
4650         else {
4651           remainder = chunk_at_offset(victim, nb);
4652
4653           /* We cannot assume the unsorted list is empty and therefore
4654              have to perform a complete insert here.  */
4655           bck = unsorted_chunks(av);
4656           fwd = bck->fd;
4657           if (__builtin_expect (fwd->bk != bck, 0))
4658             {
4659               errstr = "malloc(): corrupted unsorted chunks 2";
4660               goto errout;
4661             }
4662           remainder->bk = bck;
4663           remainder->fd = fwd;
4664           bck->fd = remainder;
4665           fwd->bk = remainder;
4666
4667           /* advertise as last remainder */
4668           if (in_smallbin_range(nb))
4669             av->last_remainder = remainder;
4670           if (!in_smallbin_range(remainder_size))
4671             {
4672               remainder->fd_nextsize = NULL;
4673               remainder->bk_nextsize = NULL;
4674             }
4675           set_head(victim, nb | PREV_INUSE |
4676                    (av != &main_arena ? NON_MAIN_ARENA : 0));
4677           set_head(remainder, remainder_size | PREV_INUSE);
4678           set_foot(remainder, remainder_size);
4679         }
4680         check_malloced_chunk(av, victim, nb);
4681         void *p = chunk2mem(victim);
4682         if (__builtin_expect (perturb_byte, 0))
4683           alloc_perturb (p, bytes);
4684         return p;
4685       }
4686     }
4687
4688   use_top:
4689     /*
4690       If large enough, split off the chunk bordering the end of memory
4691       (held in av->top). Note that this is in accord with the best-fit
4692       search rule.  In effect, av->top is treated as larger (and thus
4693       less well fitting) than any other available chunk since it can
4694       be extended to be as large as necessary (up to system
4695       limitations).
4696
4697       We require that av->top always exists (i.e., has size >=
4698       MINSIZE) after initialization, so if it would otherwise be
4699       exhausted by current request, it is replenished. (The main
4700       reason for ensuring it exists is that we may need MINSIZE space
4701       to put in fenceposts in sysmalloc.)
4702     */
4703
4704     victim = av->top;
4705     size = chunksize(victim);
4706
4707     if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
4708       remainder_size = size - nb;
4709       remainder = chunk_at_offset(victim, nb);
4710       av->top = remainder;
4711       set_head(victim, nb | PREV_INUSE |
4712                (av != &main_arena ? NON_MAIN_ARENA : 0));
4713       set_head(remainder, remainder_size | PREV_INUSE);
4714
4715       check_malloced_chunk(av, victim, nb);
4716       void *p = chunk2mem(victim);
4717       if (__builtin_expect (perturb_byte, 0))
4718         alloc_perturb (p, bytes);
4719       return p;
4720     }
4721
4722 #ifdef ATOMIC_FASTBINS
4723     /* When we are using atomic ops to free fast chunks we can get
4724        here for all block sizes.  */
4725     else if (have_fastchunks(av)) {
4726       malloc_consolidate(av);
4727       /* restore original bin index */
4728       if (in_smallbin_range(nb))
4729         idx = smallbin_index(nb);
4730       else
4731         idx = largebin_index(nb);
4732     }
4733 #else
4734     /*
4735       If there is space available in fastbins, consolidate and retry,
4736       to possibly avoid expanding memory. This can occur only if nb is
4737       in smallbin range so we didn't consolidate upon entry.
4738     */
4739
4740     else if (have_fastchunks(av)) {
4741       assert(in_smallbin_range(nb));
4742       malloc_consolidate(av);
4743       idx = smallbin_index(nb); /* restore original bin index */
4744     }
4745 #endif
4746
4747     /*
4748        Otherwise, relay to handle system-dependent cases
4749     */
4750     else {
4751       void *p = sYSMALLOc(nb, av);
4752       if (p != NULL && __builtin_expect (perturb_byte, 0))
4753         alloc_perturb (p, bytes);
4754       return p;
4755     }
4756   }
4757 }
4758
4759 /*
4760   ------------------------------ free ------------------------------
4761 */
4762
4763 static void
4764 #ifdef ATOMIC_FASTBINS
4765 _int_free(mstate av, mchunkptr p, int have_lock)
4766 #else
4767 _int_free(mstate av, mchunkptr p)
4768 #endif
4769 {
4770   INTERNAL_SIZE_T size;        /* its size */
4771   mfastbinptr*    fb;          /* associated fastbin */
4772   mchunkptr       nextchunk;   /* next contiguous chunk */
4773   INTERNAL_SIZE_T nextsize;    /* its size */
4774   int             nextinuse;   /* true if nextchunk is used */
4775   INTERNAL_SIZE_T prevsize;    /* size of previous contiguous chunk */
4776   mchunkptr       bck;         /* misc temp for linking */
4777   mchunkptr       fwd;         /* misc temp for linking */
4778
4779   const char *errstr = NULL;
4780 #ifdef ATOMIC_FASTBINS
4781   int locked = 0;
4782 #endif
4783
4784   size = chunksize(p);
4785
4786   /* Little security check which won't hurt performance: the
4787      allocator never wrapps around at the end of the address space.
4788      Therefore we can exclude some size values which might appear
4789      here by accident or by "design" from some intruder.  */
4790   if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
4791       || __builtin_expect (misaligned_chunk (p), 0))
4792     {
4793       errstr = "free(): invalid pointer";
4794     errout:
4795 #ifdef ATOMIC_FASTBINS
4796       if (! have_lock && locked)
4797         (void)mutex_unlock(&av->mutex);
4798 #endif
4799       malloc_printerr (check_action, errstr, chunk2mem(p));
4800       return;
4801     }
4802   /* We know that each chunk is at least MINSIZE bytes in size.  */
4803   if (__builtin_expect (size < MINSIZE, 0))
4804     {
4805       errstr = "free(): invalid size";
4806       goto errout;
4807     }
4808
4809   check_inuse_chunk(av, p);
4810
4811   /*
4812     If eligible, place chunk on a fastbin so it can be found
4813     and used quickly in malloc.
4814   */
4815
4816   if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
4817
4818 #if TRIM_FASTBINS
4819       /*
4820         If TRIM_FASTBINS set, don't place chunks
4821         bordering top into fastbins
4822       */
4823       && (chunk_at_offset(p, size) != av->top)
4824 #endif
4825       ) {
4826
4827     if (__builtin_expect (chunk_at_offset (p, size)->size <= 2 * SIZE_SZ, 0)
4828         || __builtin_expect (chunksize (chunk_at_offset (p, size))
4829                              >= av->system_mem, 0))
4830       {
4831 #ifdef ATOMIC_FASTBINS
4832         /* We might not have a lock at this point and concurrent modifications
4833            of system_mem might have let to a false positive.  Redo the test
4834            after getting the lock.  */
4835         if (have_lock
4836             || ({ assert (locked == 0);
4837                   mutex_lock(&av->mutex);
4838                   locked = 1;
4839                   chunk_at_offset (p, size)->size <= 2 * SIZE_SZ
4840                     || chunksize (chunk_at_offset (p, size)) >= av->system_mem;
4841               }))
4842 #endif
4843           {
4844             errstr = "free(): invalid next size (fast)";
4845             goto errout;
4846           }
4847 #ifdef ATOMIC_FASTBINS
4848         if (! have_lock)
4849           {
4850             (void)mutex_unlock(&av->mutex);
4851             locked = 0;
4852           }
4853 #endif
4854       }
4855
4856     if (__builtin_expect (perturb_byte, 0))
4857       free_perturb (chunk2mem(p), size - SIZE_SZ);
4858
4859     set_fastchunks(av);
4860     unsigned int idx = fastbin_index(size);
4861     fb = &fastbin (av, idx);
4862
4863 #ifdef ATOMIC_FASTBINS
4864     mchunkptr fd;
4865     mchunkptr old = *fb;
4866     do
4867       {
4868         /* Another simple check: make sure the top of the bin is not the
4869            record we are going to add (i.e., double free).  */
4870         if (__builtin_expect (old == p, 0))
4871           {
4872             errstr = "double free or corruption (fasttop)";
4873             goto errout;
4874           }
4875         if (old != NULL
4876             && __builtin_expect (fastbin_index(chunksize(old)) != idx, 0))
4877           {
4878             errstr = "invalid fastbin entry (free)";
4879             goto errout;
4880           }
4881         p->fd = fd = old;
4882       }
4883     while ((old = catomic_compare_and_exchange_val_rel (fb, p, fd)) != fd);
4884 #else
4885     /* Another simple check: make sure the top of the bin is not the
4886        record we are going to add (i.e., double free).  */
4887     if (__builtin_expect (*fb == p, 0))
4888       {
4889         errstr = "double free or corruption (fasttop)";
4890         goto errout;
4891       }
4892     if (*fb != NULL
4893         && __builtin_expect (fastbin_index(chunksize(*fb)) != idx, 0))
4894       {
4895         errstr = "invalid fastbin entry (free)";
4896         goto errout;
4897       }
4898
4899     p->fd = *fb;
4900     *fb = p;
4901 #endif
4902   }
4903
4904   /*
4905     Consolidate other non-mmapped chunks as they arrive.
4906   */
4907
4908   else if (!chunk_is_mmapped(p)) {
4909 #ifdef ATOMIC_FASTBINS
4910     if (! have_lock) {
4911 # if THREAD_STATS
4912       if(!mutex_trylock(&av->mutex))
4913         ++(av->stat_lock_direct);
4914       else {
4915         (void)mutex_lock(&av->mutex);
4916         ++(av->stat_lock_wait);
4917       }
4918 # else
4919       (void)mutex_lock(&av->mutex);
4920 # endif
4921       locked = 1;
4922     }
4923 #endif
4924
4925     nextchunk = chunk_at_offset(p, size);
4926
4927     /* Lightweight tests: check whether the block is already the
4928        top block.  */
4929     if (__builtin_expect (p == av->top, 0))
4930       {
4931         errstr = "double free or corruption (top)";
4932         goto errout;
4933       }
4934     /* Or whether the next chunk is beyond the boundaries of the arena.  */
4935     if (__builtin_expect (contiguous (av)
4936                           && (char *) nextchunk
4937                           >= ((char *) av->top + chunksize(av->top)), 0))
4938       {
4939         errstr = "double free or corruption (out)";
4940         goto errout;
4941       }
4942     /* Or whether the block is actually not marked used.  */
4943     if (__builtin_expect (!prev_inuse(nextchunk), 0))
4944       {
4945         errstr = "double free or corruption (!prev)";
4946         goto errout;
4947       }
4948
4949     nextsize = chunksize(nextchunk);
4950     if (__builtin_expect (nextchunk->size <= 2 * SIZE_SZ, 0)
4951         || __builtin_expect (nextsize >= av->system_mem, 0))
4952       {
4953         errstr = "free(): invalid next size (normal)";
4954         goto errout;
4955       }
4956
4957     if (__builtin_expect (perturb_byte, 0))
4958       free_perturb (chunk2mem(p), size - SIZE_SZ);
4959
4960     /* consolidate backward */
4961     if (!prev_inuse(p)) {
4962       prevsize = p->prev_size;
4963       size += prevsize;
4964       p = chunk_at_offset(p, -((long) prevsize));
4965       unlink(p, bck, fwd);
4966     }
4967
4968     if (nextchunk != av->top) {
4969       /* get and clear inuse bit */
4970       nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
4971
4972       /* consolidate forward */
4973       if (!nextinuse) {
4974         unlink(nextchunk, bck, fwd);
4975         size += nextsize;
4976       } else
4977         clear_inuse_bit_at_offset(nextchunk, 0);
4978
4979       /*
4980         Place the chunk in unsorted chunk list. Chunks are
4981         not placed into regular bins until after they have
4982         been given one chance to be used in malloc.
4983       */
4984
4985       bck = unsorted_chunks(av);
4986       fwd = bck->fd;
4987       if (__builtin_expect (fwd->bk != bck, 0))
4988         {
4989           errstr = "free(): corrupted unsorted chunks";
4990           goto errout;
4991         }
4992       p->fd = fwd;
4993       p->bk = bck;
4994       if (!in_smallbin_range(size))
4995         {
4996           p->fd_nextsize = NULL;
4997           p->bk_nextsize = NULL;
4998         }
4999       bck->fd = p;
5000       fwd->bk = p;
5001
5002       set_head(p, size | PREV_INUSE);
5003       set_foot(p, size);
5004
5005       check_free_chunk(av, p);
5006     }
5007
5008     /*
5009       If the chunk borders the current high end of memory,
5010       consolidate into top
5011     */
5012
5013     else {
5014       size += nextsize;
5015       set_head(p, size | PREV_INUSE);
5016       av->top = p;
5017       check_chunk(av, p);
5018     }
5019
5020     /*
5021       If freeing a large space, consolidate possibly-surrounding
5022       chunks. Then, if the total unused topmost memory exceeds trim
5023       threshold, ask malloc_trim to reduce top.
5024
5025       Unless max_fast is 0, we don't know if there are fastbins
5026       bordering top, so we cannot tell for sure whether threshold
5027       has been reached unless fastbins are consolidated.  But we
5028       don't want to consolidate on each free.  As a compromise,
5029       consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
5030       is reached.
5031     */
5032
5033     if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
5034       if (have_fastchunks(av))
5035         malloc_consolidate(av);
5036
5037       if (av == &main_arena) {
5038 #ifndef MORECORE_CANNOT_TRIM
5039         if ((unsigned long)(chunksize(av->top)) >=
5040             (unsigned long)(mp_.trim_threshold))
5041           sYSTRIm(mp_.top_pad, av);
5042 #endif
5043       } else {
5044         /* Always try heap_trim(), even if the top chunk is not
5045            large, because the corresponding heap might go away.  */
5046         heap_info *heap = heap_for_ptr(top(av));
5047
5048         assert(heap->ar_ptr == av);
5049         heap_trim(heap, mp_.top_pad);
5050       }
5051     }
5052
5053 #ifdef ATOMIC_FASTBINS
5054     if (! have_lock) {
5055       assert (locked);
5056       (void)mutex_unlock(&av->mutex);
5057     }
5058 #endif
5059   }
5060   /*
5061     If the chunk was allocated via mmap, release via munmap(). Note
5062     that if HAVE_MMAP is false but chunk_is_mmapped is true, then
5063     user must have overwritten memory. There's nothing we can do to
5064     catch this error unless MALLOC_DEBUG is set, in which case
5065     check_inuse_chunk (above) will have triggered error.
5066   */
5067
5068   else {
5069 #if HAVE_MMAP
5070     munmap_chunk (p);
5071 #endif
5072   }
5073 }
5074
5075 /*
5076   ------------------------- malloc_consolidate -------------------------
5077
5078   malloc_consolidate is a specialized version of free() that tears
5079   down chunks held in fastbins.  Free itself cannot be used for this
5080   purpose since, among other things, it might place chunks back onto
5081   fastbins.  So, instead, we need to use a minor variant of the same
5082   code.
5083
5084   Also, because this routine needs to be called the first time through
5085   malloc anyway, it turns out to be the perfect place to trigger
5086   initialization code.
5087 */
5088
5089 #if __STD_C
5090 static void malloc_consolidate(mstate av)
5091 #else
5092 static void malloc_consolidate(av) mstate av;
5093 #endif
5094 {
5095   mfastbinptr*    fb;                 /* current fastbin being consolidated */
5096   mfastbinptr*    maxfb;              /* last fastbin (for loop control) */
5097   mchunkptr       p;                  /* current chunk being consolidated */
5098   mchunkptr       nextp;              /* next chunk to consolidate */
5099   mchunkptr       unsorted_bin;       /* bin header */
5100   mchunkptr       first_unsorted;     /* chunk to link to */
5101
5102   /* These have same use as in free() */
5103   mchunkptr       nextchunk;
5104   INTERNAL_SIZE_T size;
5105   INTERNAL_SIZE_T nextsize;
5106   INTERNAL_SIZE_T prevsize;
5107   int             nextinuse;
5108   mchunkptr       bck;
5109   mchunkptr       fwd;
5110
5111   /*
5112     If max_fast is 0, we know that av hasn't
5113     yet been initialized, in which case do so below
5114   */
5115
5116   if (get_max_fast () != 0) {
5117     clear_fastchunks(av);
5118
5119     unsorted_bin = unsorted_chunks(av);
5120
5121     /*
5122       Remove each chunk from fast bin and consolidate it, placing it
5123       then in unsorted bin. Among other reasons for doing this,
5124       placing in unsorted bin avoids needing to calculate actual bins
5125       until malloc is sure that chunks aren't immediately going to be
5126       reused anyway.
5127     */
5128
5129 #if 0
5130     /* It is wrong to limit the fast bins to search using get_max_fast
5131        because, except for the main arena, all the others might have
5132        blocks in the high fast bins.  It's not worth it anyway, just
5133        search all bins all the time.  */
5134     maxfb = &fastbin (av, fastbin_index(get_max_fast ()));
5135 #else
5136     maxfb = &fastbin (av, NFASTBINS - 1);
5137 #endif
5138     fb = &fastbin (av, 0);
5139     do {
5140 #ifdef ATOMIC_FASTBINS
5141       p = atomic_exchange_acq (fb, 0);
5142 #else
5143       p = *fb;
5144 #endif
5145       if (p != 0) {
5146 #ifndef ATOMIC_FASTBINS
5147         *fb = 0;
5148 #endif
5149         do {
5150           check_inuse_chunk(av, p);
5151           nextp = p->fd;
5152
5153           /* Slightly streamlined version of consolidation code in free() */
5154           size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
5155           nextchunk = chunk_at_offset(p, size);
5156           nextsize = chunksize(nextchunk);
5157
5158           if (!prev_inuse(p)) {
5159             prevsize = p->prev_size;
5160             size += prevsize;
5161             p = chunk_at_offset(p, -((long) prevsize));
5162             unlink(p, bck, fwd);
5163           }
5164
5165           if (nextchunk != av->top) {
5166             nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
5167
5168             if (!nextinuse) {
5169               size += nextsize;
5170               unlink(nextchunk, bck, fwd);
5171             } else
5172               clear_inuse_bit_at_offset(nextchunk, 0);
5173
5174             first_unsorted = unsorted_bin->fd;
5175             unsorted_bin->fd = p;
5176             first_unsorted->bk = p;
5177
5178             if (!in_smallbin_range (size)) {
5179               p->fd_nextsize = NULL;
5180               p->bk_nextsize = NULL;
5181             }
5182
5183             set_head(p, size | PREV_INUSE);
5184             p->bk = unsorted_bin;
5185             p->fd = first_unsorted;
5186             set_foot(p, size);
5187           }
5188
5189           else {
5190             size += nextsize;
5191             set_head(p, size | PREV_INUSE);
5192             av->top = p;
5193           }
5194
5195         } while ( (p = nextp) != 0);
5196
5197       }
5198     } while (fb++ != maxfb);
5199   }
5200   else {
5201     malloc_init_state(av);
5202     check_malloc_state(av);
5203   }
5204 }
5205
5206 /*
5207   ------------------------------ realloc ------------------------------
5208 */
5209
5210 Void_t*
5211 _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
5212              INTERNAL_SIZE_T nb)
5213 {
5214   mchunkptr        newp;            /* chunk to return */
5215   INTERNAL_SIZE_T  newsize;         /* its size */
5216   Void_t*          newmem;          /* corresponding user mem */
5217
5218   mchunkptr        next;            /* next contiguous chunk after oldp */
5219
5220   mchunkptr        remainder;       /* extra space at end of newp */
5221   unsigned long    remainder_size;  /* its size */
5222
5223   mchunkptr        bck;             /* misc temp for linking */
5224   mchunkptr        fwd;             /* misc temp for linking */
5225
5226   unsigned long    copysize;        /* bytes to copy */
5227   unsigned int     ncopies;         /* INTERNAL_SIZE_T words to copy */
5228   INTERNAL_SIZE_T* s;               /* copy source */
5229   INTERNAL_SIZE_T* d;               /* copy destination */
5230
5231   const char *errstr = NULL;
5232
5233   /* oldmem size */
5234   if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0)
5235       || __builtin_expect (oldsize >= av->system_mem, 0))
5236     {
5237       errstr = "realloc(): invalid old size";
5238     errout:
5239       malloc_printerr (check_action, errstr, chunk2mem(oldp));
5240       return NULL;
5241     }
5242
5243   check_inuse_chunk(av, oldp);
5244
5245   /* All callers already filter out mmap'ed chunks.  */
5246 #if 0
5247   if (!chunk_is_mmapped(oldp))
5248 #else
5249   assert (!chunk_is_mmapped(oldp));
5250 #endif
5251   {
5252
5253     next = chunk_at_offset(oldp, oldsize);
5254     INTERNAL_SIZE_T nextsize = chunksize(next);
5255     if (__builtin_expect (next->size <= 2 * SIZE_SZ, 0)
5256         || __builtin_expect (nextsize >= av->system_mem, 0))
5257       {
5258         errstr = "realloc(): invalid next size";
5259         goto errout;
5260       }
5261
5262     if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
5263       /* already big enough; split below */
5264       newp = oldp;
5265       newsize = oldsize;
5266     }
5267
5268     else {
5269       /* Try to expand forward into top */
5270       if (next == av->top &&
5271           (unsigned long)(newsize = oldsize + nextsize) >=
5272           (unsigned long)(nb + MINSIZE)) {
5273         set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
5274         av->top = chunk_at_offset(oldp, nb);
5275         set_head(av->top, (newsize - nb) | PREV_INUSE);
5276         check_inuse_chunk(av, oldp);
5277         return chunk2mem(oldp);
5278       }
5279
5280       /* Try to expand forward into next chunk;  split off remainder below */
5281       else if (next != av->top &&
5282                !inuse(next) &&
5283                (unsigned long)(newsize = oldsize + nextsize) >=
5284                (unsigned long)(nb)) {
5285         newp = oldp;
5286         unlink(next, bck, fwd);
5287       }
5288
5289       /* allocate, copy, free */
5290       else {
5291         newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
5292         if (newmem == 0)
5293           return 0; /* propagate failure */
5294
5295         newp = mem2chunk(newmem);
5296         newsize = chunksize(newp);
5297
5298         /*
5299           Avoid copy if newp is next chunk after oldp.
5300         */
5301         if (newp == next) {
5302           newsize += oldsize;
5303           newp = oldp;
5304         }
5305         else {
5306           /*
5307             Unroll copy of <= 36 bytes (72 if 8byte sizes)
5308             We know that contents have an odd number of
5309             INTERNAL_SIZE_T-sized words; minimally 3.
5310           */
5311
5312           copysize = oldsize - SIZE_SZ;
5313           s = (INTERNAL_SIZE_T*)(chunk2mem(oldp));
5314           d = (INTERNAL_SIZE_T*)(newmem);
5315           ncopies = copysize / sizeof(INTERNAL_SIZE_T);
5316           assert(ncopies >= 3);
5317
5318           if (ncopies > 9)
5319             MALLOC_COPY(d, s, copysize);
5320
5321           else {
5322             *(d+0) = *(s+0);
5323             *(d+1) = *(s+1);
5324             *(d+2) = *(s+2);
5325             if (ncopies > 4) {
5326               *(d+3) = *(s+3);
5327               *(d+4) = *(s+4);
5328               if (ncopies > 6) {
5329                 *(d+5) = *(s+5);
5330                 *(d+6) = *(s+6);
5331                 if (ncopies > 8) {
5332                   *(d+7) = *(s+7);
5333                   *(d+8) = *(s+8);
5334                 }
5335               }
5336             }
5337           }
5338
5339 #ifdef ATOMIC_FASTBINS
5340           _int_free(av, oldp, 1);
5341 #else
5342           _int_free(av, oldp);
5343 #endif
5344           check_inuse_chunk(av, newp);
5345           return chunk2mem(newp);
5346         }
5347       }
5348     }
5349
5350     /* If possible, free extra space in old or extended chunk */
5351
5352     assert((unsigned long)(newsize) >= (unsigned long)(nb));
5353
5354     remainder_size = newsize - nb;
5355
5356     if (remainder_size < MINSIZE) { /* not enough extra to split off */
5357       set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5358       set_inuse_bit_at_offset(newp, newsize);
5359     }
5360     else { /* split remainder */
5361       remainder = chunk_at_offset(newp, nb);
5362       set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
5363       set_head(remainder, remainder_size | PREV_INUSE |
5364                (av != &main_arena ? NON_MAIN_ARENA : 0));
5365       /* Mark remainder as inuse so free() won't complain */
5366       set_inuse_bit_at_offset(remainder, remainder_size);
5367 #ifdef ATOMIC_FASTBINS
5368       _int_free(av, remainder, 1);
5369 #else
5370       _int_free(av, remainder);
5371 #endif
5372     }
5373
5374     check_inuse_chunk(av, newp);
5375     return chunk2mem(newp);
5376   }
5377
5378 #if 0
5379   /*
5380     Handle mmap cases
5381   */
5382
5383   else {
5384 #if HAVE_MMAP
5385
5386 #if HAVE_MREMAP
5387     INTERNAL_SIZE_T offset = oldp->prev_size;
5388     size_t pagemask = mp_.pagesize - 1;
5389     char *cp;
5390     unsigned long sum;
5391
5392     /* Note the extra SIZE_SZ overhead */
5393     newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
5394
5395     /* don't need to remap if still within same page */
5396     if (oldsize == newsize - offset)
5397       return chunk2mem(oldp);
5398
5399     cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
5400
5401     if (cp != MAP_FAILED) {
5402
5403       newp = (mchunkptr)(cp + offset);
5404       set_head(newp, (newsize - offset)|IS_MMAPPED);
5405
5406       assert(aligned_OK(chunk2mem(newp)));
5407       assert((newp->prev_size == offset));
5408
5409       /* update statistics */
5410       sum = mp_.mmapped_mem += newsize - oldsize;
5411       if (sum > (unsigned long)(mp_.max_mmapped_mem))
5412         mp_.max_mmapped_mem = sum;
5413 #ifdef NO_THREADS
5414       sum += main_arena.system_mem;
5415       if (sum > (unsigned long)(mp_.max_total_mem))
5416         mp_.max_total_mem = sum;
5417 #endif
5418
5419       return chunk2mem(newp);
5420     }
5421 #endif
5422
5423     /* Note the extra SIZE_SZ overhead. */
5424     if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
5425       newmem = chunk2mem(oldp); /* do nothing */
5426     else {
5427       /* Must alloc, copy, free. */
5428       newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
5429       if (newmem != 0) {
5430         MALLOC_COPY(newmem, chunk2mem(oldp), oldsize - 2*SIZE_SZ);
5431 #ifdef ATOMIC_FASTBINS
5432         _int_free(av, oldp, 1);
5433 #else
5434         _int_free(av, oldp);
5435 #endif
5436       }
5437     }
5438     return newmem;
5439
5440 #else
5441     /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
5442     check_malloc_state(av);
5443     MALLOC_FAILURE_ACTION;
5444     return 0;
5445 #endif
5446   }
5447 #endif
5448 }
5449
5450 /*
5451   ------------------------------ memalign ------------------------------
5452 */
5453
5454 static Void_t*
5455 _int_memalign(mstate av, size_t alignment, size_t bytes)
5456 {
5457   INTERNAL_SIZE_T nb;             /* padded  request size */
5458   char*           m;              /* memory returned by malloc call */
5459   mchunkptr       p;              /* corresponding chunk */
5460   char*           brk;            /* alignment point within p */
5461   mchunkptr       newp;           /* chunk to return */
5462   INTERNAL_SIZE_T newsize;        /* its size */
5463   INTERNAL_SIZE_T leadsize;       /* leading space before alignment point */
5464   mchunkptr       remainder;      /* spare room at end to split off */
5465   unsigned long   remainder_size; /* its size */
5466   INTERNAL_SIZE_T size;
5467
5468   /* If need less alignment than we give anyway, just relay to malloc */
5469
5470   if (alignment <= MALLOC_ALIGNMENT) return _int_malloc(av, bytes);
5471
5472   /* Otherwise, ensure that it is at least a minimum chunk size */
5473
5474   if (alignment <  MINSIZE) alignment = MINSIZE;
5475
5476   /* Make sure alignment is power of 2 (in case MINSIZE is not).  */
5477   if ((alignment & (alignment - 1)) != 0) {
5478     size_t a = MALLOC_ALIGNMENT * 2;
5479     while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
5480     alignment = a;
5481   }
5482
5483   checked_request2size(bytes, nb);
5484
5485   /*
5486     Strategy: find a spot within that chunk that meets the alignment
5487     request, and then possibly free the leading and trailing space.
5488   */
5489
5490
5491   /* Call malloc with worst case padding to hit alignment. */
5492
5493   m  = (char*)(_int_malloc(av, nb + alignment + MINSIZE));
5494
5495   if (m == 0) return 0; /* propagate failure */
5496
5497   p = mem2chunk(m);
5498
5499   if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
5500
5501     /*
5502       Find an aligned spot inside chunk.  Since we need to give back
5503       leading space in a chunk of at least MINSIZE, if the first
5504       calculation places us at a spot with less than MINSIZE leader,
5505       we can move to the next aligned spot -- we've allocated enough
5506       total room so that this is always possible.
5507     */
5508
5509     brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
5510                            -((signed long) alignment));
5511     if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
5512       brk += alignment;
5513
5514     newp = (mchunkptr)brk;
5515     leadsize = brk - (char*)(p);
5516     newsize = chunksize(p) - leadsize;
5517
5518     /* For mmapped chunks, just adjust offset */
5519     if (chunk_is_mmapped(p)) {
5520       newp->prev_size = p->prev_size + leadsize;
5521       set_head(newp, newsize|IS_MMAPPED);
5522       return chunk2mem(newp);
5523     }
5524
5525     /* Otherwise, give back leader, use the rest */
5526     set_head(newp, newsize | PREV_INUSE |
5527              (av != &main_arena ? NON_MAIN_ARENA : 0));
5528     set_inuse_bit_at_offset(newp, newsize);
5529     set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
5530 #ifdef ATOMIC_FASTBINS
5531     _int_free(av, p, 1);
5532 #else
5533     _int_free(av, p);
5534 #endif
5535     p = newp;
5536
5537     assert (newsize >= nb &&
5538             (((unsigned long)(chunk2mem(p))) % alignment) == 0);
5539   }
5540
5541   /* Also give back spare room at the end */
5542   if (!chunk_is_mmapped(p)) {
5543     size = chunksize(p);
5544     if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
5545       remainder_size = size - nb;
5546       remainder = chunk_at_offset(p, nb);
5547       set_head(remainder, remainder_size | PREV_INUSE |
5548                (av != &main_arena ? NON_MAIN_ARENA : 0));
5549       set_head_size(p, nb);
5550 #ifdef ATOMIC_FASTBINS
5551       _int_free(av, remainder, 1);
5552 #else
5553       _int_free(av, remainder);
5554 #endif
5555     }
5556   }
5557
5558   check_inuse_chunk(av, p);
5559   return chunk2mem(p);
5560 }
5561
5562 #if 0
5563 /*
5564   ------------------------------ calloc ------------------------------
5565 */
5566
5567 #if __STD_C
5568 Void_t* cALLOc(size_t n_elements, size_t elem_size)
5569 #else
5570 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
5571 #endif
5572 {
5573   mchunkptr p;
5574   unsigned long clearsize;
5575   unsigned long nclears;
5576   INTERNAL_SIZE_T* d;
5577
5578   Void_t* mem = mALLOc(n_elements * elem_size);
5579
5580   if (mem != 0) {
5581     p = mem2chunk(mem);
5582
5583 #if MMAP_CLEARS
5584     if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
5585 #endif
5586     {
5587       /*
5588         Unroll clear of <= 36 bytes (72 if 8byte sizes)
5589         We know that contents have an odd number of
5590         INTERNAL_SIZE_T-sized words; minimally 3.
5591       */
5592
5593       d = (INTERNAL_SIZE_T*)mem;
5594       clearsize = chunksize(p) - SIZE_SZ;
5595       nclears = clearsize / sizeof(INTERNAL_SIZE_T);
5596       assert(nclears >= 3);
5597
5598       if (nclears > 9)
5599         MALLOC_ZERO(d, clearsize);
5600
5601       else {
5602         *(d+0) = 0;
5603         *(d+1) = 0;
5604         *(d+2) = 0;
5605         if (nclears > 4) {
5606           *(d+3) = 0;
5607           *(d+4) = 0;
5608           if (nclears > 6) {
5609             *(d+5) = 0;
5610             *(d+6) = 0;
5611             if (nclears > 8) {
5612               *(d+7) = 0;
5613               *(d+8) = 0;
5614             }
5615           }
5616         }
5617       }
5618     }
5619   }
5620   return mem;
5621 }
5622 #endif /* 0 */
5623
5624 #ifndef _LIBC
5625 /*
5626   ------------------------- independent_calloc -------------------------
5627 */
5628
5629 Void_t**
5630 #if __STD_C
5631 _int_icalloc(mstate av, size_t n_elements, size_t elem_size, Void_t* chunks[])
5632 #else
5633 _int_icalloc(av, n_elements, elem_size, chunks)
5634 mstate av; size_t n_elements; size_t elem_size; Void_t* chunks[];
5635 #endif
5636 {
5637   size_t sz = elem_size; /* serves as 1-element array */
5638   /* opts arg of 3 means all elements are same size, and should be cleared */
5639   return iALLOc(av, n_elements, &sz, 3, chunks);
5640 }
5641
5642 /*
5643   ------------------------- independent_comalloc -------------------------
5644 */
5645
5646 Void_t**
5647 #if __STD_C
5648 _int_icomalloc(mstate av, size_t n_elements, size_t sizes[], Void_t* chunks[])
5649 #else
5650 _int_icomalloc(av, n_elements, sizes, chunks)
5651 mstate av; size_t n_elements; size_t sizes[]; Void_t* chunks[];
5652 #endif
5653 {
5654   return iALLOc(av, n_elements, sizes, 0, chunks);
5655 }
5656
5657
5658 /*
5659   ------------------------------ ialloc ------------------------------
5660   ialloc provides common support for independent_X routines, handling all of
5661   the combinations that can result.
5662
5663   The opts arg has:
5664     bit 0 set if all elements are same size (using sizes[0])
5665     bit 1 set if elements should be zeroed
5666 */
5667
5668
5669 static Void_t**
5670 #if __STD_C
5671 iALLOc(mstate av, size_t n_elements, size_t* sizes, int opts, Void_t* chunks[])
5672 #else
5673 iALLOc(av, n_elements, sizes, opts, chunks)
5674 mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
5675 #endif
5676 {
5677   INTERNAL_SIZE_T element_size;   /* chunksize of each element, if all same */
5678   INTERNAL_SIZE_T contents_size;  /* total size of elements */
5679   INTERNAL_SIZE_T array_size;     /* request size of pointer array */
5680   Void_t*         mem;            /* malloced aggregate space */
5681   mchunkptr       p;              /* corresponding chunk */
5682   INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
5683   Void_t**        marray;         /* either "chunks" or malloced ptr array */
5684   mchunkptr       array_chunk;    /* chunk for malloced ptr array */
5685   int             mmx;            /* to disable mmap */
5686   INTERNAL_SIZE_T size;
5687   INTERNAL_SIZE_T size_flags;
5688   size_t          i;
5689
5690   /* Ensure initialization/consolidation */
5691   if (have_fastchunks(av)) malloc_consolidate(av);
5692
5693   /* compute array length, if needed */
5694   if (chunks != 0) {
5695     if (n_elements == 0)
5696       return chunks; /* nothing to do */
5697     marray = chunks;
5698     array_size = 0;
5699   }
5700   else {
5701     /* if empty req, must still return chunk representing empty array */
5702     if (n_elements == 0)
5703       return (Void_t**) _int_malloc(av, 0);
5704     marray = 0;
5705     array_size = request2size(n_elements * (sizeof(Void_t*)));
5706   }
5707
5708   /* compute total element size */
5709   if (opts & 0x1) { /* all-same-size */
5710     element_size = request2size(*sizes);
5711     contents_size = n_elements * element_size;
5712   }
5713   else { /* add up all the sizes */
5714     element_size = 0;
5715     contents_size = 0;
5716     for (i = 0; i != n_elements; ++i)
5717       contents_size += request2size(sizes[i]);
5718   }
5719
5720   /* subtract out alignment bytes from total to minimize overallocation */
5721   size = contents_size + array_size - MALLOC_ALIGN_MASK;
5722
5723   /*
5724      Allocate the aggregate chunk.
5725      But first disable mmap so malloc won't use it, since
5726      we would not be able to later free/realloc space internal
5727      to a segregated mmap region.
5728   */
5729   mmx = mp_.n_mmaps_max;   /* disable mmap */
5730   mp_.n_mmaps_max = 0;
5731   mem = _int_malloc(av, size);
5732   mp_.n_mmaps_max = mmx;   /* reset mmap */
5733   if (mem == 0)
5734     return 0;
5735
5736   p = mem2chunk(mem);
5737   assert(!chunk_is_mmapped(p));
5738   remainder_size = chunksize(p);
5739
5740   if (opts & 0x2) {       /* optionally clear the elements */
5741     MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
5742   }
5743
5744   size_flags = PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0);
5745
5746   /* If not provided, allocate the pointer array as final part of chunk */
5747   if (marray == 0) {
5748     array_chunk = chunk_at_offset(p, contents_size);
5749     marray = (Void_t**) (chunk2mem(array_chunk));
5750     set_head(array_chunk, (remainder_size - contents_size) | size_flags);
5751     remainder_size = contents_size;
5752   }
5753
5754   /* split out elements */
5755   for (i = 0; ; ++i) {
5756     marray[i] = chunk2mem(p);
5757     if (i != n_elements-1) {
5758       if (element_size != 0)
5759         size = element_size;
5760       else
5761         size = request2size(sizes[i]);
5762       remainder_size -= size;
5763       set_head(p, size | size_flags);
5764       p = chunk_at_offset(p, size);
5765     }
5766     else { /* the final element absorbs any overallocation slop */
5767       set_head(p, remainder_size | size_flags);
5768       break;
5769     }
5770   }
5771
5772 #if MALLOC_DEBUG
5773   if (marray != chunks) {
5774     /* final element must have exactly exhausted chunk */
5775     if (element_size != 0)
5776       assert(remainder_size == element_size);
5777     else
5778       assert(remainder_size == request2size(sizes[i]));
5779     check_inuse_chunk(av, mem2chunk(marray));
5780   }
5781
5782   for (i = 0; i != n_elements; ++i)
5783     check_inuse_chunk(av, mem2chunk(marray[i]));
5784 #endif
5785
5786   return marray;
5787 }
5788 #endif /* _LIBC */
5789
5790
5791 /*
5792   ------------------------------ valloc ------------------------------
5793 */
5794
5795 static Void_t*
5796 #if __STD_C
5797 _int_valloc(mstate av, size_t bytes)
5798 #else
5799 _int_valloc(av, bytes) mstate av; size_t bytes;
5800 #endif
5801 {
5802   /* Ensure initialization/consolidation */
5803   if (have_fastchunks(av)) malloc_consolidate(av);
5804   return _int_memalign(av, mp_.pagesize, bytes);
5805 }
5806
5807 /*
5808   ------------------------------ pvalloc ------------------------------
5809 */
5810
5811
5812 static Void_t*
5813 #if __STD_C
5814 _int_pvalloc(mstate av, size_t bytes)
5815 #else
5816 _int_pvalloc(av, bytes) mstate av, size_t bytes;
5817 #endif
5818 {
5819   size_t pagesz;
5820
5821   /* Ensure initialization/consolidation */
5822   if (have_fastchunks(av)) malloc_consolidate(av);
5823   pagesz = mp_.pagesize;
5824   return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
5825 }
5826
5827
5828 /*
5829   ------------------------------ malloc_trim ------------------------------
5830 */
5831
5832 #if __STD_C
5833 static int mTRIm(mstate av, size_t pad)
5834 #else
5835 static int mTRIm(av, pad) mstate av; size_t pad;
5836 #endif
5837 {
5838   /* Ensure initialization/consolidation */
5839   malloc_consolidate (av);
5840
5841   const size_t ps = mp_.pagesize;
5842   int psindex = bin_index (ps);
5843   const size_t psm1 = ps - 1;
5844
5845   int result = 0;
5846   for (int i = 1; i < NBINS; ++i)
5847     if (i == 1 || i >= psindex)
5848       {
5849         mbinptr bin = bin_at (av, i);
5850
5851         for (mchunkptr p = last (bin); p != bin; p = p->bk)
5852           {
5853             INTERNAL_SIZE_T size = chunksize (p);
5854
5855             if (size > psm1 + sizeof (struct malloc_chunk))
5856               {
5857                 /* See whether the chunk contains at least one unused page.  */
5858                 char *paligned_mem = (char *) (((uintptr_t) p
5859                                                 + sizeof (struct malloc_chunk)
5860                                                 + psm1) & ~psm1);
5861
5862                 assert ((char *) chunk2mem (p) + 4 * SIZE_SZ <= paligned_mem);
5863                 assert ((char *) p + size > paligned_mem);
5864
5865                 /* This is the size we could potentially free.  */
5866                 size -= paligned_mem - (char *) p;
5867
5868                 if (size > psm1)
5869                   {
5870 #ifdef MALLOC_DEBUG
5871                     /* When debugging we simulate destroying the memory
5872                        content.  */
5873                     memset (paligned_mem, 0x89, size & ~psm1);
5874 #endif
5875                     madvise (paligned_mem, size & ~psm1, MADV_DONTNEED);
5876
5877                     result = 1;
5878                   }
5879               }
5880           }
5881       }
5882
5883 #ifndef MORECORE_CANNOT_TRIM
5884   return result | (av == &main_arena ? sYSTRIm (pad, av) : 0);
5885 #else
5886   return result;
5887 #endif
5888 }
5889
5890
5891 /*
5892   ------------------------- malloc_usable_size -------------------------
5893 */
5894
5895 #if __STD_C
5896 size_t mUSABLe(Void_t* mem)
5897 #else
5898 size_t mUSABLe(mem) Void_t* mem;
5899 #endif
5900 {
5901   mchunkptr p;
5902   if (mem != 0) {
5903     p = mem2chunk(mem);
5904     if (chunk_is_mmapped(p))
5905       return chunksize(p) - 2*SIZE_SZ;
5906     else if (inuse(p))
5907       return chunksize(p) - SIZE_SZ;
5908   }
5909   return 0;
5910 }
5911
5912 /*
5913   ------------------------------ mallinfo ------------------------------
5914 */
5915
5916 struct mallinfo mALLINFo(mstate av)
5917 {
5918   struct mallinfo mi;
5919   size_t i;
5920   mbinptr b;
5921   mchunkptr p;
5922   INTERNAL_SIZE_T avail;
5923   INTERNAL_SIZE_T fastavail;
5924   int nblocks;
5925   int nfastblocks;
5926
5927   /* Ensure initialization */
5928   if (av->top == 0)  malloc_consolidate(av);
5929
5930   check_malloc_state(av);
5931
5932   /* Account for top */
5933   avail = chunksize(av->top);
5934   nblocks = 1;  /* top always exists */
5935
5936   /* traverse fastbins */
5937   nfastblocks = 0;
5938   fastavail = 0;
5939
5940   for (i = 0; i < NFASTBINS; ++i) {
5941     for (p = fastbin (av, i); p != 0; p = p->fd) {
5942       ++nfastblocks;
5943       fastavail += chunksize(p);
5944     }
5945   }
5946
5947   avail += fastavail;
5948
5949   /* traverse regular bins */
5950   for (i = 1; i < NBINS; ++i) {
5951     b = bin_at(av, i);
5952     for (p = last(b); p != b; p = p->bk) {
5953       ++nblocks;
5954       avail += chunksize(p);
5955     }
5956   }
5957
5958   mi.smblks = nfastblocks;
5959   mi.ordblks = nblocks;
5960   mi.fordblks = avail;
5961   mi.uordblks = av->system_mem - avail;
5962   mi.arena = av->system_mem;
5963   mi.hblks = mp_.n_mmaps;
5964   mi.hblkhd = mp_.mmapped_mem;
5965   mi.fsmblks = fastavail;
5966   mi.keepcost = chunksize(av->top);
5967   mi.usmblks = mp_.max_total_mem;
5968   return mi;
5969 }
5970
5971 /*
5972   ------------------------------ malloc_stats ------------------------------
5973 */
5974
5975 void mSTATs()
5976 {
5977   int i;
5978   mstate ar_ptr;
5979   struct mallinfo mi;
5980   unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
5981 #if THREAD_STATS
5982   long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
5983 #endif
5984
5985   if(__malloc_initialized < 0)
5986     ptmalloc_init ();
5987 #ifdef _LIBC
5988   _IO_flockfile (stderr);
5989   int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
5990   ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
5991 #endif
5992   for (i=0, ar_ptr = &main_arena;; i++) {
5993     (void)mutex_lock(&ar_ptr->mutex);
5994     mi = mALLINFo(ar_ptr);
5995     fprintf(stderr, "Arena %d:\n", i);
5996     fprintf(stderr, "system bytes     = %10u\n", (unsigned int)mi.arena);
5997     fprintf(stderr, "in use bytes     = %10u\n", (unsigned int)mi.uordblks);
5998 #if MALLOC_DEBUG > 1
5999     if (i > 0)
6000       dump_heap(heap_for_ptr(top(ar_ptr)));
6001 #endif
6002     system_b += mi.arena;
6003     in_use_b += mi.uordblks;
6004 #if THREAD_STATS
6005     stat_lock_direct += ar_ptr->stat_lock_direct;
6006     stat_lock_loop += ar_ptr->stat_lock_loop;
6007     stat_lock_wait += ar_ptr->stat_lock_wait;
6008 #endif
6009     (void)mutex_unlock(&ar_ptr->mutex);
6010     ar_ptr = ar_ptr->next;
6011     if(ar_ptr == &main_arena) break;
6012   }
6013 #if HAVE_MMAP
6014   fprintf(stderr, "Total (incl. mmap):\n");
6015 #else
6016   fprintf(stderr, "Total:\n");
6017 #endif
6018   fprintf(stderr, "system bytes     = %10u\n", system_b);
6019   fprintf(stderr, "in use bytes     = %10u\n", in_use_b);
6020 #ifdef NO_THREADS
6021   fprintf(stderr, "max system bytes = %10u\n", (unsigned int)mp_.max_total_mem);
6022 #endif
6023 #if HAVE_MMAP
6024   fprintf(stderr, "max mmap regions = %10u\n", (unsigned int)mp_.max_n_mmaps);
6025   fprintf(stderr, "max mmap bytes   = %10lu\n",
6026           (unsigned long)mp_.max_mmapped_mem);
6027 #endif
6028 #if THREAD_STATS
6029   fprintf(stderr, "heaps created    = %10d\n",  stat_n_heaps);
6030   fprintf(stderr, "locked directly  = %10ld\n", stat_lock_direct);
6031   fprintf(stderr, "locked in loop   = %10ld\n", stat_lock_loop);
6032   fprintf(stderr, "locked waiting   = %10ld\n", stat_lock_wait);
6033   fprintf(stderr, "locked total     = %10ld\n",
6034           stat_lock_direct + stat_lock_loop + stat_lock_wait);
6035 #endif
6036 #ifdef _LIBC
6037   ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
6038   _IO_funlockfile (stderr);
6039 #endif
6040 }
6041
6042
6043 /*
6044   ------------------------------ mallopt ------------------------------
6045 */
6046
6047 #if __STD_C
6048 int mALLOPt(int param_number, int value)
6049 #else
6050 int mALLOPt(param_number, value) int param_number; int value;
6051 #endif
6052 {
6053   mstate av = &main_arena;
6054   int res = 1;
6055
6056   if(__malloc_initialized < 0)
6057     ptmalloc_init ();
6058   (void)mutex_lock(&av->mutex);
6059   /* Ensure initialization/consolidation */
6060   malloc_consolidate(av);
6061
6062   switch(param_number) {
6063   case M_MXFAST:
6064     if (value >= 0 && value <= MAX_FAST_SIZE) {
6065       set_max_fast(value);
6066     }
6067     else
6068       res = 0;
6069     break;
6070
6071   case M_TRIM_THRESHOLD:
6072     mp_.trim_threshold = value;
6073     mp_.no_dyn_threshold = 1;
6074     break;
6075
6076   case M_TOP_PAD:
6077     mp_.top_pad = value;
6078     mp_.no_dyn_threshold = 1;
6079     break;
6080
6081   case M_MMAP_THRESHOLD:
6082 #if USE_ARENAS
6083     /* Forbid setting the threshold too high. */
6084     if((unsigned long)value > HEAP_MAX_SIZE/2)
6085       res = 0;
6086     else
6087 #endif
6088       mp_.mmap_threshold = value;
6089       mp_.no_dyn_threshold = 1;
6090     break;
6091
6092   case M_MMAP_MAX:
6093 #if !HAVE_MMAP
6094     if (value != 0)
6095       res = 0;
6096     else
6097 #endif
6098       mp_.n_mmaps_max = value;
6099       mp_.no_dyn_threshold = 1;
6100     break;
6101
6102   case M_CHECK_ACTION:
6103     check_action = value;
6104     break;
6105
6106   case M_PERTURB:
6107     perturb_byte = value;
6108     break;
6109
6110 #ifdef PER_THREAD
6111   case M_ARENA_TEST:
6112     if (value > 0)
6113       mp_.arena_test = value;
6114     break;
6115
6116   case M_ARENA_MAX:
6117     if (value > 0)
6118       mp_.arena_max = value;
6119     break;
6120 #endif
6121   }
6122   (void)mutex_unlock(&av->mutex);
6123   return res;
6124 }
6125
6126
6127 /*
6128   -------------------- Alternative MORECORE functions --------------------
6129 */
6130
6131
6132 /*
6133   General Requirements for MORECORE.
6134
6135   The MORECORE function must have the following properties:
6136
6137   If MORECORE_CONTIGUOUS is false:
6138
6139     * MORECORE must allocate in multiples of pagesize. It will
6140       only be called with arguments that are multiples of pagesize.
6141
6142     * MORECORE(0) must return an address that is at least
6143       MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
6144
6145   else (i.e. If MORECORE_CONTIGUOUS is true):
6146
6147     * Consecutive calls to MORECORE with positive arguments
6148       return increasing addresses, indicating that space has been
6149       contiguously extended.
6150
6151     * MORECORE need not allocate in multiples of pagesize.
6152       Calls to MORECORE need not have args of multiples of pagesize.
6153
6154     * MORECORE need not page-align.
6155
6156   In either case:
6157
6158     * MORECORE may allocate more memory than requested. (Or even less,
6159       but this will generally result in a malloc failure.)
6160
6161     * MORECORE must not allocate memory when given argument zero, but
6162       instead return one past the end address of memory from previous
6163       nonzero call. This malloc does NOT call MORECORE(0)
6164       until at least one call with positive arguments is made, so
6165       the initial value returned is not important.
6166
6167     * Even though consecutive calls to MORECORE need not return contiguous
6168       addresses, it must be OK for malloc'ed chunks to span multiple
6169       regions in those cases where they do happen to be contiguous.
6170
6171     * MORECORE need not handle negative arguments -- it may instead
6172       just return MORECORE_FAILURE when given negative arguments.
6173       Negative arguments are always multiples of pagesize. MORECORE
6174       must not misinterpret negative args as large positive unsigned
6175       args. You can suppress all such calls from even occurring by defining
6176       MORECORE_CANNOT_TRIM,
6177
6178   There is some variation across systems about the type of the
6179   argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
6180   actually be size_t, because sbrk supports negative args, so it is
6181   normally the signed type of the same width as size_t (sometimes
6182   declared as "intptr_t", and sometimes "ptrdiff_t").  It doesn't much
6183   matter though. Internally, we use "long" as arguments, which should
6184   work across all reasonable possibilities.
6185
6186   Additionally, if MORECORE ever returns failure for a positive
6187   request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
6188   system allocator. This is a useful backup strategy for systems with
6189   holes in address spaces -- in this case sbrk cannot contiguously
6190   expand the heap, but mmap may be able to map noncontiguous space.
6191
6192   If you'd like mmap to ALWAYS be used, you can define MORECORE to be
6193   a function that always returns MORECORE_FAILURE.
6194
6195   If you are using this malloc with something other than sbrk (or its
6196   emulation) to supply memory regions, you probably want to set
6197   MORECORE_CONTIGUOUS as false.  As an example, here is a custom
6198   allocator kindly contributed for pre-OSX macOS.  It uses virtually
6199   but not necessarily physically contiguous non-paged memory (locked
6200   in, present and won't get swapped out).  You can use it by
6201   uncommenting this section, adding some #includes, and setting up the
6202   appropriate defines above:
6203
6204       #define MORECORE osMoreCore
6205       #define MORECORE_CONTIGUOUS 0
6206
6207   There is also a shutdown routine that should somehow be called for
6208   cleanup upon program exit.
6209
6210   #define MAX_POOL_ENTRIES 100
6211   #define MINIMUM_MORECORE_SIZE  (64 * 1024)
6212   static int next_os_pool;
6213   void *our_os_pools[MAX_POOL_ENTRIES];
6214
6215   void *osMoreCore(int size)
6216   {
6217     void *ptr = 0;
6218     static void *sbrk_top = 0;
6219
6220     if (size > 0)
6221     {
6222       if (size < MINIMUM_MORECORE_SIZE)
6223          size = MINIMUM_MORECORE_SIZE;
6224       if (CurrentExecutionLevel() == kTaskLevel)
6225          ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
6226       if (ptr == 0)
6227       {
6228         return (void *) MORECORE_FAILURE;
6229       }
6230       // save ptrs so they can be freed during cleanup
6231       our_os_pools[next_os_pool] = ptr;
6232       next_os_pool++;
6233       ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
6234       sbrk_top = (char *) ptr + size;
6235       return ptr;
6236     }
6237     else if (size < 0)
6238     {
6239       // we don't currently support shrink behavior
6240       return (void *) MORECORE_FAILURE;
6241     }
6242     else
6243     {
6244       return sbrk_top;
6245     }
6246   }
6247
6248   // cleanup any allocated memory pools
6249   // called as last thing before shutting down driver
6250
6251   void osCleanupMem(void)
6252   {
6253     void **ptr;
6254
6255     for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
6256       if (*ptr)
6257       {
6258          PoolDeallocate(*ptr);
6259          *ptr = 0;
6260       }
6261   }
6262
6263 */
6264
6265
6266 /* Helper code.  */
6267
6268 extern char **__libc_argv attribute_hidden;
6269
6270 static void
6271 malloc_printerr(int action, const char *str, void *ptr)
6272 {
6273   if ((action & 5) == 5)
6274     __libc_message (action & 2, "%s\n", str);
6275   else if (action & 1)
6276     {
6277       char buf[2 * sizeof (uintptr_t) + 1];
6278
6279       buf[sizeof (buf) - 1] = '\0';
6280       char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
6281       while (cp > buf)
6282         *--cp = '0';
6283
6284       __libc_message (action & 2,
6285                       "*** glibc detected *** %s: %s: 0x%s ***\n",
6286                       __libc_argv[0] ?: "<unknown>", str, cp);
6287     }
6288   else if (action & 2)
6289     abort ();
6290 }
6291
6292 #ifdef _LIBC
6293 # include <sys/param.h>
6294
6295 /* We need a wrapper function for one of the additions of POSIX.  */
6296 int
6297 __posix_memalign (void **memptr, size_t alignment, size_t size)
6298 {
6299   void *mem;
6300
6301   /* Test whether the SIZE argument is valid.  It must be a power of
6302      two multiple of sizeof (void *).  */
6303   if (alignment % sizeof (void *) != 0
6304       || !powerof2 (alignment / sizeof (void *)) != 0
6305       || alignment == 0)
6306     return EINVAL;
6307
6308   /* Call the hook here, so that caller is posix_memalign's caller
6309      and not posix_memalign itself.  */
6310   __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
6311                                         __const __malloc_ptr_t)) =
6312     force_reg (__memalign_hook);
6313   if (__builtin_expect (hook != NULL, 0))
6314     mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
6315   else
6316     mem = public_mEMALIGn (alignment, size);
6317
6318   if (mem != NULL) {
6319     *memptr = mem;
6320     return 0;
6321   }
6322
6323   return ENOMEM;
6324 }
6325 weak_alias (__posix_memalign, posix_memalign)
6326
6327
6328 int
6329 malloc_info (int options, FILE *fp)
6330 {
6331   /* For now, at least.  */
6332   if (options != 0)
6333     return EINVAL;
6334
6335   int n = 0;
6336   size_t total_nblocks = 0;
6337   size_t total_nfastblocks = 0;
6338   size_t total_avail = 0;
6339   size_t total_fastavail = 0;
6340   size_t total_system = 0;
6341   size_t total_max_system = 0;
6342   size_t total_aspace = 0;
6343   size_t total_aspace_mprotect = 0;
6344
6345   void mi_arena (mstate ar_ptr)
6346   {
6347     fprintf (fp, "<heap nr=\"%d\">\n<sizes>\n", n++);
6348
6349     size_t nblocks = 0;
6350     size_t nfastblocks = 0;
6351     size_t avail = 0;
6352     size_t fastavail = 0;
6353     struct
6354     {
6355       size_t from;
6356       size_t to;
6357       size_t total;
6358       size_t count;
6359     } sizes[NFASTBINS + NBINS - 1];
6360 #define nsizes (sizeof (sizes) / sizeof (sizes[0]))
6361
6362     mutex_lock (&ar_ptr->mutex);
6363
6364     for (size_t i = 0; i < NFASTBINS; ++i)
6365       {
6366         mchunkptr p = fastbin (ar_ptr, i);
6367         if (p != NULL)
6368           {
6369             size_t nthissize = 0;
6370             size_t thissize = chunksize (p);
6371
6372             while (p != NULL)
6373               {
6374                 ++nthissize;
6375                 p = p->fd;
6376               }
6377
6378             fastavail += nthissize * thissize;
6379             nfastblocks += nthissize;
6380             sizes[i].from = thissize - (MALLOC_ALIGNMENT - 1);
6381             sizes[i].to = thissize;
6382             sizes[i].count = nthissize;
6383           }
6384         else
6385           sizes[i].from = sizes[i].to = sizes[i].count = 0;
6386
6387         sizes[i].total = sizes[i].count * sizes[i].to;
6388       }
6389
6390     mbinptr bin = bin_at (ar_ptr, 1);
6391     struct malloc_chunk *r = bin->fd;
6392     if (r != NULL)
6393       {
6394         while (r != bin)
6395           {
6396             ++sizes[NFASTBINS].count;
6397             sizes[NFASTBINS].total += r->size;
6398             sizes[NFASTBINS].from = MIN (sizes[NFASTBINS].from, r->size);
6399             sizes[NFASTBINS].to = MAX (sizes[NFASTBINS].to, r->size);
6400             r = r->fd;
6401           }
6402         nblocks += sizes[NFASTBINS].count;
6403         avail += sizes[NFASTBINS].total;
6404       }
6405
6406     for (size_t i = 2; i < NBINS; ++i)
6407       {
6408         bin = bin_at (ar_ptr, i);
6409         r = bin->fd;
6410         sizes[NFASTBINS - 1 + i].from = ~((size_t) 0);
6411         sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total
6412           = sizes[NFASTBINS - 1 + i].count = 0;
6413
6414         if (r != NULL)
6415           while (r != bin)
6416             {
6417               ++sizes[NFASTBINS - 1 + i].count;
6418               sizes[NFASTBINS - 1 + i].total += r->size;
6419               sizes[NFASTBINS - 1 + i].from
6420                 = MIN (sizes[NFASTBINS - 1 + i].from, r->size);
6421               sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to,
6422                                                  r->size);
6423
6424               r = r->fd;
6425             }
6426
6427         if (sizes[NFASTBINS - 1 + i].count == 0)
6428           sizes[NFASTBINS - 1 + i].from = 0;
6429         nblocks += sizes[NFASTBINS - 1 + i].count;
6430         avail += sizes[NFASTBINS - 1 + i].total;
6431       }
6432
6433     mutex_unlock (&ar_ptr->mutex);
6434
6435     total_nfastblocks += nfastblocks;
6436     total_fastavail += fastavail;
6437
6438     total_nblocks += nblocks;
6439     total_avail += avail;
6440
6441     for (size_t i = 0; i < nsizes; ++i)
6442       if (sizes[i].count != 0 && i != NFASTBINS)
6443         fprintf (fp, "\
6444 <size from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n",
6445                  sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count);
6446
6447     if (sizes[NFASTBINS].count != 0)
6448       fprintf (fp, "\
6449 <unsorted from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n",
6450                sizes[NFASTBINS].from, sizes[NFASTBINS].to,
6451                sizes[NFASTBINS].total, sizes[NFASTBINS].count);
6452
6453     total_system += ar_ptr->system_mem;
6454     total_max_system += ar_ptr->max_system_mem;
6455
6456     fprintf (fp,
6457              "</sizes>\n<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n"
6458              "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n"
6459              "<system type=\"current\" size=\"%zu\"/>\n"
6460              "<system type=\"max\" size=\"%zu\"/>\n",
6461              nfastblocks, fastavail, nblocks, avail,
6462              ar_ptr->system_mem, ar_ptr->max_system_mem);
6463
6464     if (ar_ptr != &main_arena)
6465       {
6466         heap_info *heap = heap_for_ptr(top(ar_ptr));
6467         fprintf (fp,
6468                  "<aspace type=\"total\" size=\"%zu\"/>\n"
6469                  "<aspace type=\"mprotect\" size=\"%zu\"/>\n",
6470                  heap->size, heap->mprotect_size);
6471         total_aspace += heap->size;
6472         total_aspace_mprotect += heap->mprotect_size;
6473       }
6474     else
6475       {
6476         fprintf (fp,
6477                  "<aspace type=\"total\" size=\"%zu\"/>\n"
6478                  "<aspace type=\"mprotect\" size=\"%zu\"/>\n",
6479                  ar_ptr->system_mem, ar_ptr->system_mem);
6480         total_aspace += ar_ptr->system_mem;
6481         total_aspace_mprotect += ar_ptr->system_mem;
6482       }
6483
6484     fputs ("</heap>\n", fp);
6485   }
6486
6487   if(__malloc_initialized < 0)
6488     ptmalloc_init ();
6489
6490   fputs ("<malloc version=\"1\">\n", fp);
6491
6492   /* Iterate over all arenas currently in use.  */
6493   mstate ar_ptr = &main_arena;
6494   do
6495     {
6496       mi_arena (ar_ptr);
6497       ar_ptr = ar_ptr->next;
6498     }
6499   while (ar_ptr != &main_arena);
6500
6501   fprintf (fp,
6502            "<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n"
6503            "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n"
6504            "<system type=\"current\" size=\"%zu\"/>\n"
6505            "<system type=\"max\" size=\"%zu\"/>\n"
6506            "<aspace type=\"total\" size=\"%zu\"/>\n"
6507            "<aspace type=\"mprotect\" size=\"%zu\"/>\n"
6508            "</malloc>\n",
6509            total_nfastblocks, total_fastavail, total_nblocks, total_avail,
6510            total_system, total_max_system,
6511            total_aspace, total_aspace_mprotect);
6512
6513   return 0;
6514 }
6515
6516
6517 strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
6518 strong_alias (__libc_free, __cfree) weak_alias (__libc_free, cfree)
6519 strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
6520 strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
6521 strong_alias (__libc_memalign, __memalign)
6522 weak_alias (__libc_memalign, memalign)
6523 strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
6524 strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
6525 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
6526 strong_alias (__libc_mallinfo, __mallinfo)
6527 weak_alias (__libc_mallinfo, mallinfo)
6528 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
6529
6530 weak_alias (__malloc_stats, malloc_stats)
6531 weak_alias (__malloc_usable_size, malloc_usable_size)
6532 weak_alias (__malloc_trim, malloc_trim)
6533 weak_alias (__malloc_get_state, malloc_get_state)
6534 weak_alias (__malloc_set_state, malloc_set_state)
6535
6536 #endif /* _LIBC */
6537
6538 /* ------------------------------------------------------------
6539 History:
6540
6541 [see ftp://g.oswego.edu/pub/misc/malloc.c for the history of dlmalloc]
6542
6543 */
6544 /*
6545  * Local variables:
6546  * c-basic-offset: 2
6547  * End:
6548  */