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