bb0f482d9fc087a143335e159605cf08b7d51191
   1/*
   2  This is a version (aka dlmalloc) of malloc/free/realloc written by
   3  Doug Lea and released to the public domain, as explained at
   4  http://creativecommons.org/licenses/publicdomain.  Send questions,
   5  comments, complaints, performance data, etc to dl@cs.oswego.edu
   6
   7* Version pre-2.8.4 Mon Nov 27 11:22:37 2006    (dl at gee)
   8
   9   Note: There may be an updated version of this malloc obtainable at
  10           ftp://gee.cs.oswego.edu/pub/misc/malloc.c
  11         Check before installing!
  12
  13* Quickstart
  14
  15  This library is all in one file to simplify the most common usage:
  16  ftp it, compile it (-O3), and link it into another program. All of
  17  the compile-time options default to reasonable values for use on
  18  most platforms.  You might later want to step through various
  19  compile-time and dynamic tuning options.
  20
  21  For convenience, an include file for code using this malloc is at:
  22     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.4.h
  23  You don't really need this .h file unless you call functions not
  24  defined in your system include files.  The .h file contains only the
  25  excerpts from this file needed for using this malloc on ANSI C/C++
  26  systems, so long as you haven't changed compile-time options about
  27  naming and tuning parameters.  If you do, then you can create your
  28  own malloc.h that does include all settings by cutting at the point
  29  indicated below. Note that you may already by default be using a C
  30  library containing a malloc that is based on some version of this
  31  malloc (for example in linux). You might still want to use the one
  32  in this file to customize settings or to avoid overheads associated
  33  with library versions.
  34
  35* Vital statistics:
  36
  37  Supported pointer/size_t representation:       4 or 8 bytes
  38       size_t MUST be an unsigned type of the same width as
  39       pointers. (If you are using an ancient system that declares
  40       size_t as a signed type, or need it to be a different width
  41       than pointers, you can use a previous release of this malloc
  42       (e.g. 2.7.2) supporting these.)
  43
  44  Alignment:                                     8 bytes (default)
  45       This suffices for nearly all current machines and C compilers.
  46       However, you can define MALLOC_ALIGNMENT to be wider than this
  47       if necessary (up to 128bytes), at the expense of using more space.
  48
  49  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)
  50                                          8 or 16 bytes (if 8byte sizes)
  51       Each malloced chunk has a hidden word of overhead holding size
  52       and status information, and additional cross-check word
  53       if FOOTERS is defined.
  54
  55  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)
  56                          8-byte ptrs:  32 bytes    (including overhead)
  57
  58       Even a request for zero bytes (i.e., malloc(0)) returns a
  59       pointer to something of the minimum allocatable size.
  60       The maximum overhead wastage (i.e., number of extra bytes
  61       allocated than were requested in malloc) is less than or equal
  62       to the minimum size, except for requests >= mmap_threshold that
  63       are serviced via mmap(), where the worst case wastage is about
  64       32 bytes plus the remainder from a system page (the minimal
  65       mmap unit); typically 4096 or 8192 bytes.
  66
  67  Security: static-safe; optionally more or less
  68       The "security" of malloc refers to the ability of malicious
  69       code to accentuate the effects of errors (for example, freeing
  70       space that is not currently malloc'ed or overwriting past the
  71       ends of chunks) in code that calls malloc.  This malloc
  72       guarantees not to modify any memory locations below the base of
  73       heap, i.e., static variables, even in the presence of usage
  74       errors.  The routines additionally detect most improper frees
  75       and reallocs.  All this holds as long as the static bookkeeping
  76       for malloc itself is not corrupted by some other means.  This
  77       is only one aspect of security -- these checks do not, and
  78       cannot, detect all possible programming errors.
  79
  80       If FOOTERS is defined nonzero, then each allocated chunk
  81       carries an additional check word to verify that it was malloced
  82       from its space.  These check words are the same within each
  83       execution of a program using malloc, but differ across
  84       executions, so externally crafted fake chunks cannot be
  85       freed. This improves security by rejecting frees/reallocs that
  86       could corrupt heap memory, in addition to the checks preventing
  87       writes to statics that are always on.  This may further improve
  88       security at the expense of time and space overhead.  (Note that
  89       FOOTERS may also be worth using with MSPACES.)
  90
  91       By default detected errors cause the program to abort (calling
  92       "abort()"). You can override this to instead proceed past
  93       errors by defining PROCEED_ON_ERROR.  In this case, a bad free
  94       has no effect, and a malloc that encounters a bad address
  95       caused by user overwrites will ignore the bad address by
  96       dropping pointers and indices to all known memory. This may
  97       be appropriate for programs that should continue if at all
  98       possible in the face of programming errors, although they may
  99       run out of memory because dropped memory is never reclaimed.
 100
 101       If you don't like either of these options, you can define
 102       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
 103       else. And if if you are sure that your program using malloc has
 104       no errors or vulnerabilities, you can define INSECURE to 1,
 105       which might (or might not) provide a small performance improvement.
 106
 107  Thread-safety: NOT thread-safe unless USE_LOCKS defined
 108       When USE_LOCKS is defined, each public call to malloc, free,
 109       etc is surrounded with either a pthread mutex or a win32
 110       spinlock (depending on WIN32). This is not especially fast, and
 111       can be a major bottleneck.  It is designed only to provide
 112       minimal protection in concurrent environments, and to provide a
 113       basis for extensions.  If you are using malloc in a concurrent
 114       program, consider instead using nedmalloc
 115       (http://www.nedprod.com/programs/portable/nedmalloc/) or
 116       ptmalloc (See http://www.malloc.de), which are derived
 117       from versions of this malloc.
 118
 119  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
 120       This malloc can use unix sbrk or any emulation (invoked using
 121       the CALL_MORECORE macro) and/or mmap/munmap or any emulation
 122       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
 123       memory.  On most unix systems, it tends to work best if both
 124       MORECORE and MMAP are enabled.  On Win32, it uses emulations
 125       based on VirtualAlloc. It also uses common C library functions
 126       like memset.
 127
 128  Compliance: I believe it is compliant with the Single Unix Specification
 129       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
 130       others as well.
 131
 132* Overview of algorithms
 133
 134  This is not the fastest, most space-conserving, most portable, or
 135  most tunable malloc ever written. However it is among the fastest
 136  while also being among the most space-conserving, portable and
 137  tunable.  Consistent balance across these factors results in a good
 138  general-purpose allocator for malloc-intensive programs.
 139
 140  In most ways, this malloc is a best-fit allocator. Generally, it
 141  chooses the best-fitting existing chunk for a request, with ties
 142  broken in approximately least-recently-used order. (This strategy
 143  normally maintains low fragmentation.) However, for requests less
 144  than 256bytes, it deviates from best-fit when there is not an
 145  exactly fitting available chunk by preferring to use space adjacent
 146  to that used for the previous small request, as well as by breaking
 147  ties in approximately most-recently-used order. (These enhance
 148  locality of series of small allocations.)  And for very large requests
 149  (>= 256Kb by default), it relies on system memory mapping
 150  facilities, if supported.  (This helps avoid carrying around and
 151  possibly fragmenting memory used only for large chunks.)
 152
 153  All operations (except malloc_stats and mallinfo) have execution
 154  times that are bounded by a constant factor of the number of bits in
 155  a size_t, not counting any clearing in calloc or copying in realloc,
 156  or actions surrounding MORECORE and MMAP that have times
 157  proportional to the number of non-contiguous regions returned by
 158  system allocation routines, which is often just 1. In real-time
 159  applications, you can optionally suppress segment traversals using
 160  NO_SEGMENT_TRAVERSAL, which assures bounded execution even when
 161  system allocators return non-contiguous spaces, at the typical
 162  expense of carrying around more memory and increased fragmentation.
 163
 164  The implementation is not very modular and seriously overuses
 165  macros. Perhaps someday all C compilers will do as good a job
 166  inlining modular code as can now be done by brute-force expansion,
 167  but now, enough of them seem not to.
 168
 169  Some compilers issue a lot of warnings about code that is
 170  dead/unreachable only on some platforms, and also about intentional
 171  uses of negation on unsigned types. All known cases of each can be
 172  ignored.
 173
 174  For a longer but out of date high-level description, see
 175     http://gee.cs.oswego.edu/dl/html/malloc.html
 176
 177* MSPACES
 178  If MSPACES is defined, then in addition to malloc, free, etc.,
 179  this file also defines mspace_malloc, mspace_free, etc. These
 180  are versions of malloc routines that take an "mspace" argument
 181  obtained using create_mspace, to control all internal bookkeeping.
 182  If ONLY_MSPACES is defined, only these versions are compiled.
 183  So if you would like to use this allocator for only some allocations,
 184  and your system malloc for others, you can compile with
 185  ONLY_MSPACES and then do something like...
 186    static mspace mymspace = create_mspace(0,0); // for example
 187    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)
 188
 189  (Note: If you only need one instance of an mspace, you can instead
 190  use "USE_DL_PREFIX" to relabel the global malloc.)
 191
 192  You can similarly create thread-local allocators by storing
 193  mspaces as thread-locals. For example:
 194    static __thread mspace tlms = 0;
 195    void*  tlmalloc(size_t bytes) {
 196      if (tlms == 0) tlms = create_mspace(0, 0);
 197      return mspace_malloc(tlms, bytes);
 198    }
 199    void  tlfree(void* mem) { mspace_free(tlms, mem); }
 200
 201  Unless FOOTERS is defined, each mspace is completely independent.
 202  You cannot allocate from one and free to another (although
 203  conformance is only weakly checked, so usage errors are not always
 204  caught). If FOOTERS is defined, then each chunk carries around a tag
 205  indicating its originating mspace, and frees are directed to their
 206  originating spaces.
 207
 208 -------------------------  Compile-time options ---------------------------
 209
 210Be careful in setting #define values for numerical constants of type
 211size_t. On some systems, literal values are not automatically extended
 212to size_t precision unless they are explicitly casted. You can also
 213use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below.
 214
 215WIN32                    default: defined if _WIN32 defined
 216  Defining WIN32 sets up defaults for MS environment and compilers.
 217  Otherwise defaults are for unix. Beware that there seem to be some
 218  cases where this malloc might not be a pure drop-in replacement for
 219  Win32 malloc: Random-looking failures from Win32 GDI API's (eg;
 220  SetDIBits()) may be due to bugs in some video driver implementations
 221  when pixel buffers are malloc()ed, and the region spans more than
 222  one VirtualAlloc()ed region. Because dlmalloc uses a small (64Kb)
 223  default granularity, pixel buffers may straddle virtual allocation
 224  regions more often than when using the Microsoft allocator.  You can
 225  avoid this by using VirtualAlloc() and VirtualFree() for all pixel
 226  buffers rather than using malloc().  If this is not possible,
 227  recompile this malloc with a larger DEFAULT_GRANULARITY.
 228
 229MALLOC_ALIGNMENT         default: (size_t)8
 230  Controls the minimum alignment for malloc'ed chunks.  It must be a
 231  power of two and at least 8, even on machines for which smaller
 232  alignments would suffice. It may be defined as larger than this
 233  though. Note however that code and data structures are optimized for
 234  the case of 8-byte alignment.
 235
 236MSPACES                  default: 0 (false)
 237  If true, compile in support for independent allocation spaces.
 238  This is only supported if HAVE_MMAP is true.
 239
 240ONLY_MSPACES             default: 0 (false)
 241  If true, only compile in mspace versions, not regular versions.
 242
 243USE_LOCKS                default: 0 (false)
 244  Causes each call to each public routine to be surrounded with
 245  pthread or WIN32 mutex lock/unlock. (If set true, this can be
 246  overridden on a per-mspace basis for mspace versions.) If set to a
 247  non-zero value other than 1, locks are used, but their
 248  implementation is left out, so lock functions must be supplied manually.
 249
 250USE_SPIN_LOCKS           default: 1 iff USE_LOCKS and on x86 using gcc or MSC
 251  If true, uses custom spin locks for locking. This is currently
 252  supported only for x86 platforms using gcc or recent MS compilers.
 253  Otherwise, posix locks or win32 critical sections are used.
 254
 255FOOTERS                  default: 0
 256  If true, provide extra checking and dispatching by placing
 257  information in the footers of allocated chunks. This adds
 258  space and time overhead.
 259
 260INSECURE                 default: 0
 261  If true, omit checks for usage errors and heap space overwrites.
 262
 263USE_DL_PREFIX            default: NOT defined
 264  Causes compiler to prefix all public routines with the string 'dl'.
 265  This can be useful when you only want to use this malloc in one part
 266  of a program, using your regular system malloc elsewhere.
 267
 268ABORT                    default: defined as abort()
 269  Defines how to abort on failed checks.  On most systems, a failed
 270  check cannot die with an "assert" or even print an informative
 271  message, because the underlying print routines in turn call malloc,
 272  which will fail again.  Generally, the best policy is to simply call
 273  abort(). It's not very useful to do more than this because many
 274  errors due to overwriting will show up as address faults (null, odd
 275  addresses etc) rather than malloc-triggered checks, so will also
 276  abort.  Also, most compilers know that abort() does not return, so
 277  can better optimize code conditionally calling it.
 278
 279PROCEED_ON_ERROR           default: defined as 0 (false)
 280  Controls whether detected bad addresses cause them to bypassed
 281  rather than aborting. If set, detected bad arguments to free and
 282  realloc are ignored. And all bookkeeping information is zeroed out
 283  upon a detected overwrite of freed heap space, thus losing the
 284  ability to ever return it from malloc again, but enabling the
 285  application to proceed. If PROCEED_ON_ERROR is defined, the
 286  static variable malloc_corruption_error_count is compiled in
 287  and can be examined to see if errors have occurred. This option
 288  generates slower code than the default abort policy.
 289
 290DEBUG                    default: NOT defined
 291  The DEBUG setting is mainly intended for people trying to modify
 292  this code or diagnose problems when porting to new platforms.
 293  However, it may also be able to better isolate user errors than just
 294  using runtime checks.  The assertions in the check routines spell
 295  out in more detail the assumptions and invariants underlying the
 296  algorithms.  The checking is fairly extensive, and will slow down
 297  execution noticeably. Calling malloc_stats or mallinfo with DEBUG
 298  set will attempt to check every non-mmapped allocated and free chunk
 299  in the course of computing the summaries.
 300
 301ABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)
 302  Debugging assertion failures can be nearly impossible if your
 303  version of the assert macro causes malloc to be called, which will
 304  lead to a cascade of further failures, blowing the runtime stack.
 305  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
 306  which will usually make debugging easier.
 307
 308MALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32
 309  The action to take before "return 0" when malloc fails to be able to
 310  return memory because there is none available.
 311
 312HAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES
 313  True if this system supports sbrk or an emulation of it.
 314
 315MORECORE                  default: sbrk
 316  The name of the sbrk-style system routine to call to obtain more
 317  memory.  See below for guidance on writing custom MORECORE
 318  functions. The type of the argument to sbrk/MORECORE varies across
 319  systems.  It cannot be size_t, because it supports negative
 320  arguments, so it is normally the signed type of the same width as
 321  size_t (sometimes declared as "intptr_t").  It doesn't much matter
 322  though. Internally, we only call it with arguments less than half
 323  the max value of a size_t, which should work across all reasonable
 324  possibilities, although sometimes generating compiler warnings.
 325
 326MORECORE_CONTIGUOUS       default: 1 (true) if HAVE_MORECORE
 327  If true, take advantage of fact that consecutive calls to MORECORE
 328  with positive arguments always return contiguous increasing
 329  addresses.  This is true of unix sbrk. It does not hurt too much to
 330  set it true anyway, since malloc copes with non-contiguities.
 331  Setting it false when definitely non-contiguous saves time
 332  and possibly wasted space it would take to discover this though.
 333
 334MORECORE_CANNOT_TRIM      default: NOT defined
 335  True if MORECORE cannot release space back to the system when given
 336  negative arguments. This is generally necessary only if you are
 337  using a hand-crafted MORECORE function that cannot handle negative
 338  arguments.
 339
 340NO_SEGMENT_TRAVERSAL       default: 0
 341  If non-zero, suppresses traversals of memory segments
 342  returned by either MORECORE or CALL_MMAP. This disables
 343  merging of segments that are contiguous, and selectively
 344  releasing them to the OS if unused, but bounds execution times.
 345
 346HAVE_MMAP                 default: 1 (true)
 347  True if this system supports mmap or an emulation of it.  If so, and
 348  HAVE_MORECORE is not true, MMAP is used for all system
 349  allocation. If set and HAVE_MORECORE is true as well, MMAP is
 350  primarily used to directly allocate very large blocks. It is also
 351  used as a backup strategy in cases where MORECORE fails to provide
 352  space from system. Note: A single call to MUNMAP is assumed to be
 353  able to unmap memory that may have be allocated using multiple calls
 354  to MMAP, so long as they are adjacent.
 355
 356HAVE_MREMAP               default: 1 on linux, else 0
 357  If true realloc() uses mremap() to re-allocate large blocks and
 358  extend or shrink allocation spaces.
 359
 360MMAP_CLEARS               default: 1 except on WINCE.
 361  True if mmap clears memory so calloc doesn't need to. This is true
 362  for standard unix mmap using /dev/zero and on WIN32 except for WINCE.
 363
 364USE_BUILTIN_FFS            default: 0 (i.e., not used)
 365  Causes malloc to use the builtin ffs() function to compute indices.
 366  Some compilers may recognize and intrinsify ffs to be faster than the
 367  supplied C version. Also, the case of x86 using gcc is special-cased
 368  to an asm instruction, so is already as fast as it can be, and so
 369  this setting has no effect. Similarly for Win32 under recent MS compilers.
 370  (On most x86s, the asm version is only slightly faster than the C version.)
 371
 372malloc_getpagesize         default: derive from system includes, or 4096.
 373  The system page size. To the extent possible, this malloc manages
 374  memory from the system in page-size units.  This may be (and
 375  usually is) a function rather than a constant. This is ignored
 376  if WIN32, where page size is determined using getSystemInfo during
 377  initialization.
 378
 379USE_DEV_RANDOM             default: 0 (i.e., not used)
 380  Causes malloc to use /dev/random to initialize secure magic seed for
 381  stamping footers. Otherwise, the current time is used.
 382
 383NO_MALLINFO                default: 0
 384  If defined, don't compile "mallinfo". This can be a simple way
 385  of dealing with mismatches between system declarations and
 386  those in this file.
 387
 388MALLINFO_FIELD_TYPE        default: size_t
 389  The type of the fields in the mallinfo struct. This was originally
 390  defined as "int" in SVID etc, but is more usefully defined as
 391  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set
 392
 393REALLOC_ZERO_BYTES_FREES    default: not defined
 394  This should be set if a call to realloc with zero bytes should
 395  be the same as a call to free. Some people think it should. Otherwise,
 396  since this malloc returns a unique pointer for malloc(0), so does
 397  realloc(p, 0).
 398
 399LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
 400LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H
 401LACKS_STDLIB_H                default: NOT defined unless on WIN32
 402  Define these if your system does not have these header files.
 403  You might need to manually insert some of the declarations they provide.
 404
 405DEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,
 406                                system_info.dwAllocationGranularity in WIN32,
 407                                otherwise 64K.
 408      Also settable using mallopt(M_GRANULARITY, x)
 409  The unit for allocating and deallocating memory from the system.  On
 410  most systems with contiguous MORECORE, there is no reason to
 411  make this more than a page. However, systems with MMAP tend to
 412  either require or encourage larger granularities.  You can increase
 413  this value to prevent system allocation functions to be called so
 414  often, especially if they are slow.  The value must be at least one
 415  page and must be a power of two.  Setting to 0 causes initialization
 416  to either page size or win32 region size.  (Note: In previous
 417  versions of malloc, the equivalent of this option was called
 418  "TOP_PAD")
 419
 420DEFAULT_TRIM_THRESHOLD    default: 2MB
 421      Also settable using mallopt(M_TRIM_THRESHOLD, x)
 422  The maximum amount of unused top-most memory to keep before
 423  releasing via malloc_trim in free().  Automatic trimming is mainly
 424  useful in long-lived programs using contiguous MORECORE.  Because
 425  trimming via sbrk can be slow on some systems, and can sometimes be
 426  wasteful (in cases where programs immediately afterward allocate
 427  more large chunks) the value should be high enough so that your
 428  overall system performance would improve by releasing this much
 429  memory.  As a rough guide, you might set to a value close to the
 430  average size of a process (program) running on your system.
 431  Releasing this much memory would allow such a process to run in
 432  memory.  Generally, it is worth tuning trim thresholds when a
 433  program undergoes phases where several large chunks are allocated
 434  and released in ways that can reuse each other's storage, perhaps
 435  mixed with phases where there are no such chunks at all. The trim
 436  value must be greater than page size to have any useful effect.  To
 437  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
 438  some people use of mallocing a huge space and then freeing it at
 439  program startup, in an attempt to reserve system memory, doesn't
 440  have the intended effect under automatic trimming, since that memory
 441  will immediately be returned to the system.
 442
 443DEFAULT_MMAP_THRESHOLD       default: 256K
 444      Also settable using mallopt(M_MMAP_THRESHOLD, x)
 445  The request size threshold for using MMAP to directly service a
 446  request. Requests of at least this size that cannot be allocated
 447  using already-existing space will be serviced via mmap.  (If enough
 448  normal freed space already exists it is used instead.)  Using mmap
 449  segregates relatively large chunks of memory so that they can be
 450  individually obtained and released from the host system. A request
 451  serviced through mmap is never reused by any other request (at least
 452  not directly; the system may just so happen to remap successive
 453  requests to the same locations).  Segregating space in this way has
 454  the benefits that: Mmapped space can always be individually released
 455  back to the system, which helps keep the system level memory demands
 456  of a long-lived program low.  Also, mapped memory doesn't become
 457  `locked' between other chunks, as can happen with normally allocated
 458  chunks, which means that even trimming via malloc_trim would not
 459  release them.  However, it has the disadvantage that the space
 460  cannot be reclaimed, consolidated, and then used to service later
 461  requests, as happens with normal chunks.  The advantages of mmap
 462  nearly always outweigh disadvantages for "large" chunks, but the
 463  value of "large" may vary across systems.  The default is an
 464  empirically derived value that works well in most systems. You can
 465  disable mmap by setting to MAX_SIZE_T.
 466
 467MAX_RELEASE_CHECK_RATE   default: 4095 unless not HAVE_MMAP
 468  The number of consolidated frees between checks to release
 469  unused segments when freeing. When using non-contiguous segments,
 470  especially with multiple mspaces, checking only for topmost space
 471  doesn't always suffice to trigger trimming. To compensate for this,
 472  free() will, with a period of MAX_RELEASE_CHECK_RATE (or the
 473  current number of segments, if greater) try to release unused
 474  segments to the OS when freeing chunks that result in
 475  consolidation. The best value for this parameter is a compromise
 476  between slowing down frees with relatively costly checks that
 477  rarely trigger versus holding on to unused memory. To effectively
 478  disable, set to MAX_SIZE_T. This may lead to a very slight speed
 479  improvement at the expense of carrying around more memory.
 480*/
 481
 482/* Version identifier to allow people to support multiple versions */
 483#ifndef DLMALLOC_VERSION
 484#define DLMALLOC_VERSION 20804
 485#endif /* DLMALLOC_VERSION */
 486
 487#ifndef WIN32
 488#ifdef _WIN32
 489#define WIN32 1
 490#endif  /* _WIN32 */
 491#ifdef _WIN32_WCE
 492#define LACKS_FCNTL_H
 493#define WIN32 1
 494#endif /* _WIN32_WCE */
 495#endif  /* WIN32 */
 496#ifdef WIN32
 497#define WIN32_LEAN_AND_MEAN
 498#define _WIN32_WINNT 0x403
 499#include <windows.h>
 500#define HAVE_MMAP 1
 501#define HAVE_MORECORE 0
 502#define LACKS_UNISTD_H
 503#define LACKS_SYS_PARAM_H
 504#define LACKS_SYS_MMAN_H
 505#define LACKS_STRING_H
 506#define LACKS_STRINGS_H
 507#define LACKS_SYS_TYPES_H
 508#define LACKS_ERRNO_H
 509#ifndef MALLOC_FAILURE_ACTION
 510#define MALLOC_FAILURE_ACTION
 511#endif /* MALLOC_FAILURE_ACTION */
 512#ifdef _WIN32_WCE /* WINCE reportedly does not clear */
 513#define MMAP_CLEARS 0
 514#else
 515#define MMAP_CLEARS 1
 516#endif /* _WIN32_WCE */
 517#endif  /* WIN32 */
 518
 519#if defined(DARWIN) || defined(_DARWIN)
 520/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
 521#ifndef HAVE_MORECORE
 522#define HAVE_MORECORE 0
 523#define HAVE_MMAP 1
 524/* OSX allocators provide 16 byte alignment */
 525#ifndef MALLOC_ALIGNMENT
 526#define MALLOC_ALIGNMENT ((size_t)16U)
 527#endif
 528#endif  /* HAVE_MORECORE */
 529#endif  /* DARWIN */
 530
 531#ifndef LACKS_SYS_TYPES_H
 532#include <sys/types.h>  /* For size_t */
 533#endif  /* LACKS_SYS_TYPES_H */
 534
 535/* The maximum possible size_t value has all bits set */
 536#define MAX_SIZE_T           (~(size_t)0)
 537
 538#ifndef ONLY_MSPACES
 539#define ONLY_MSPACES 0     /* define to a value */
 540#else
 541#define ONLY_MSPACES 1
 542#endif  /* ONLY_MSPACES */
 543#ifndef MSPACES
 544#if ONLY_MSPACES
 545#define MSPACES 1
 546#else   /* ONLY_MSPACES */
 547#define MSPACES 0
 548#endif  /* ONLY_MSPACES */
 549#endif  /* MSPACES */
 550#ifndef MALLOC_ALIGNMENT
 551#define MALLOC_ALIGNMENT ((size_t)8U)
 552#endif  /* MALLOC_ALIGNMENT */
 553#ifndef FOOTERS
 554#define FOOTERS 0
 555#endif  /* FOOTERS */
 556#ifndef ABORT
 557#define ABORT  abort()
 558#endif  /* ABORT */
 559#ifndef ABORT_ON_ASSERT_FAILURE
 560#define ABORT_ON_ASSERT_FAILURE 1
 561#endif  /* ABORT_ON_ASSERT_FAILURE */
 562#ifndef PROCEED_ON_ERROR
 563#define PROCEED_ON_ERROR 0
 564#endif  /* PROCEED_ON_ERROR */
 565#ifndef USE_LOCKS
 566#define USE_LOCKS 0
 567#endif  /* USE_LOCKS */
 568#ifndef USE_SPIN_LOCKS
 569#if USE_LOCKS && (defined(__GNUC__) && ((defined(__i386__) || defined(__x86_64__)))) || (defined(_MSC_VER) && _MSC_VER>=1310)
 570#define USE_SPIN_LOCKS 1
 571#else
 572#define USE_SPIN_LOCKS 0
 573#endif /* USE_LOCKS && ... */
 574#endif /* USE_SPIN_LOCKS */
 575#ifndef INSECURE
 576#define INSECURE 0
 577#endif  /* INSECURE */
 578#ifndef HAVE_MMAP
 579#define HAVE_MMAP 1
 580#endif  /* HAVE_MMAP */
 581#ifndef MMAP_CLEARS
 582#define MMAP_CLEARS 1
 583#endif  /* MMAP_CLEARS */
 584#ifndef HAVE_MREMAP
 585#ifdef linux
 586#define HAVE_MREMAP 1
 587#else   /* linux */
 588#define HAVE_MREMAP 0
 589#endif  /* linux */
 590#endif  /* HAVE_MREMAP */
 591#ifndef MALLOC_FAILURE_ACTION
 592#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
 593#endif  /* MALLOC_FAILURE_ACTION */
 594#ifndef HAVE_MORECORE
 595#if ONLY_MSPACES
 596#define HAVE_MORECORE 0
 597#else   /* ONLY_MSPACES */
 598#define HAVE_MORECORE 1
 599#endif  /* ONLY_MSPACES */
 600#endif  /* HAVE_MORECORE */
 601#if !HAVE_MORECORE
 602#define MORECORE_CONTIGUOUS 0
 603#else   /* !HAVE_MORECORE */
 604#define MORECORE_DEFAULT sbrk
 605#ifndef MORECORE_CONTIGUOUS
 606#define MORECORE_CONTIGUOUS 1
 607#endif  /* MORECORE_CONTIGUOUS */
 608#endif  /* HAVE_MORECORE */
 609#ifndef DEFAULT_GRANULARITY
 610#if (MORECORE_CONTIGUOUS || defined(WIN32))
 611#define DEFAULT_GRANULARITY (0)  /* 0 means to compute in init_mparams */
 612#else   /* MORECORE_CONTIGUOUS */
 613#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
 614#endif  /* MORECORE_CONTIGUOUS */
 615#endif  /* DEFAULT_GRANULARITY */
 616#ifndef DEFAULT_TRIM_THRESHOLD
 617#ifndef MORECORE_CANNOT_TRIM
 618#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
 619#else   /* MORECORE_CANNOT_TRIM */
 620#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
 621#endif  /* MORECORE_CANNOT_TRIM */
 622#endif  /* DEFAULT_TRIM_THRESHOLD */
 623#ifndef DEFAULT_MMAP_THRESHOLD
 624#if HAVE_MMAP
 625#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
 626#else   /* HAVE_MMAP */
 627#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
 628#endif  /* HAVE_MMAP */
 629#endif  /* DEFAULT_MMAP_THRESHOLD */
 630#ifndef MAX_RELEASE_CHECK_RATE
 631#if HAVE_MMAP
 632#define MAX_RELEASE_CHECK_RATE 4095
 633#else
 634#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T
 635#endif /* HAVE_MMAP */
 636#endif /* MAX_RELEASE_CHECK_RATE */
 637#ifndef USE_BUILTIN_FFS
 638#define USE_BUILTIN_FFS 0
 639#endif  /* USE_BUILTIN_FFS */
 640#ifndef USE_DEV_RANDOM
 641#define USE_DEV_RANDOM 0
 642#endif  /* USE_DEV_RANDOM */
 643#ifndef NO_MALLINFO
 644#define NO_MALLINFO 0
 645#endif  /* NO_MALLINFO */
 646#ifndef MALLINFO_FIELD_TYPE
 647#define MALLINFO_FIELD_TYPE size_t
 648#endif  /* MALLINFO_FIELD_TYPE */
 649#ifndef NO_SEGMENT_TRAVERSAL
 650#define NO_SEGMENT_TRAVERSAL 0
 651#endif /* NO_SEGMENT_TRAVERSAL */
 652
 653/*
 654  mallopt tuning options.  SVID/XPG defines four standard parameter
 655  numbers for mallopt, normally defined in malloc.h.  None of these
 656  are used in this malloc, so setting them has no effect. But this
 657  malloc does support the following options.
 658*/
 659
 660#define M_TRIM_THRESHOLD     (-1)
 661#define M_GRANULARITY        (-2)
 662#define M_MMAP_THRESHOLD     (-3)
 663
 664/* ------------------------ Mallinfo declarations ------------------------ */
 665
 666#if !NO_MALLINFO
 667/*
 668  This version of malloc supports the standard SVID/XPG mallinfo
 669  routine that returns a struct containing usage properties and
 670  statistics. It should work on any system that has a
 671  /usr/include/malloc.h defining struct mallinfo.  The main
 672  declaration needed is the mallinfo struct that is returned (by-copy)
 673  by mallinfo().  The malloinfo struct contains a bunch of fields that
 674  are not even meaningful in this version of malloc.  These fields are
 675  are instead filled by mallinfo() with other numbers that might be of
 676  interest.
 677
 678  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
 679  /usr/include/malloc.h file that includes a declaration of struct
 680  mallinfo.  If so, it is included; else a compliant version is
 681  declared below.  These must be precisely the same for mallinfo() to
 682  work.  The original SVID version of this struct, defined on most
 683  systems with mallinfo, declares all fields as ints. But some others
 684  define as unsigned long. If your system defines the fields using a
 685  type of different width than listed here, you MUST #include your
 686  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
 687*/
 688
 689/* #define HAVE_USR_INCLUDE_MALLOC_H */
 690
 691#ifdef HAVE_USR_INCLUDE_MALLOC_H
 692#include "/usr/include/malloc.h"
 693#else /* HAVE_USR_INCLUDE_MALLOC_H */
 694#ifndef STRUCT_MALLINFO_DECLARED
 695#define STRUCT_MALLINFO_DECLARED 1
 696struct mallinfo {
 697  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
 698  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
 699  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
 700  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
 701  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
 702  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
 703  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
 704  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
 705  MALLINFO_FIELD_TYPE fordblks; /* total free space */
 706  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
 707};
 708#endif /* STRUCT_MALLINFO_DECLARED */
 709#endif /* HAVE_USR_INCLUDE_MALLOC_H */
 710#endif /* NO_MALLINFO */
 711
 712/*
 713  Try to persuade compilers to inline. The most critical functions for
 714  inlining are defined as macros, so these aren't used for them.
 715*/
 716
 717#ifndef FORCEINLINE
 718  #if defined(__GNUC__)
 719#define FORCEINLINE __inline __attribute__ ((always_inline))
 720  #elif defined(_MSC_VER)
 721    #define FORCEINLINE __forceinline
 722  #endif
 723#endif
 724#ifndef NOINLINE
 725  #if defined(__GNUC__)
 726    #define NOINLINE __attribute__ ((noinline))
 727  #elif defined(_MSC_VER)
 728    #define NOINLINE __declspec(noinline)
 729  #else
 730    #define NOINLINE
 731  #endif
 732#endif
 733
 734#ifdef __cplusplus
 735extern "C" {
 736#ifndef FORCEINLINE
 737 #define FORCEINLINE inline
 738#endif
 739#endif /* __cplusplus */
 740#ifndef FORCEINLINE
 741 #define FORCEINLINE
 742#endif
 743
 744#if !ONLY_MSPACES
 745
 746/* ------------------- Declarations of public routines ------------------- */
 747
 748#ifndef USE_DL_PREFIX
 749#define dlcalloc               calloc
 750#define dlfree                 free
 751#define dlmalloc               malloc
 752#define dlmemalign             memalign
 753#define dlrealloc              realloc
 754#define dlvalloc               valloc
 755#define dlpvalloc              pvalloc
 756#define dlmallinfo             mallinfo
 757#define dlmallopt              mallopt
 758#define dlmalloc_trim          malloc_trim
 759#define dlmalloc_stats         malloc_stats
 760#define dlmalloc_usable_size   malloc_usable_size
 761#define dlmalloc_footprint     malloc_footprint
 762#define dlmalloc_max_footprint malloc_max_footprint
 763#define dlindependent_calloc   independent_calloc
 764#define dlindependent_comalloc independent_comalloc
 765#endif /* USE_DL_PREFIX */
 766
 767
 768/*
 769  malloc(size_t n)
 770  Returns a pointer to a newly allocated chunk of at least n bytes, or
 771  null if no space is available, in which case errno is set to ENOMEM
 772  on ANSI C systems.
 773
 774  If n is zero, malloc returns a minimum-sized chunk. (The minimum
 775  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
 776  systems.)  Note that size_t is an unsigned type, so calls with
 777  arguments that would be negative if signed are interpreted as
 778  requests for huge amounts of space, which will often fail. The
 779  maximum supported value of n differs across systems, but is in all
 780  cases less than the maximum representable value of a size_t.
 781*/
 782void* dlmalloc(size_t);
 783
 784/*
 785  free(void* p)
 786  Releases the chunk of memory pointed to by p, that had been previously
 787  allocated using malloc or a related routine such as realloc.
 788  It has no effect if p is null. If p was not malloced or already
 789  freed, free(p) will by default cause the current program to abort.
 790*/
 791void  dlfree(void*);
 792
 793/*
 794  calloc(size_t n_elements, size_t element_size);
 795  Returns a pointer to n_elements * element_size bytes, with all locations
 796  set to zero.
 797*/
 798void* dlcalloc(size_t, size_t);
 799
 800/*
 801  realloc(void* p, size_t n)
 802  Returns a pointer to a chunk of size n that contains the same data
 803  as does chunk p up to the minimum of (n, p's size) bytes, or null
 804  if no space is available.
 805
 806  The returned pointer may or may not be the same as p. The algorithm
 807  prefers extending p in most cases when possible, otherwise it
 808  employs the equivalent of a malloc-copy-free sequence.
 809
 810  If p is null, realloc is equivalent to malloc.
 811
 812  If space is not available, realloc returns null, errno is set (if on
 813  ANSI) and p is NOT freed.
 814
 815  if n is for fewer bytes than already held by p, the newly unused
 816  space is lopped off and freed if possible.  realloc with a size
 817  argument of zero (re)allocates a minimum-sized chunk.
 818
 819  The old unix realloc convention of allowing the last-free'd chunk
 820  to be used as an argument to realloc is not supported.
 821*/
 822
 823void* dlrealloc(void*, size_t);
 824
 825/*
 826  memalign(size_t alignment, size_t n);
 827  Returns a pointer to a newly allocated chunk of n bytes, aligned
 828  in accord with the alignment argument.
 829
 830  The alignment argument should be a power of two. If the argument is
 831  not a power of two, the nearest greater power is used.
 832  8-byte alignment is guaranteed by normal malloc calls, so don't
 833  bother calling memalign with an argument of 8 or less.
 834
 835  Overreliance on memalign is a sure way to fragment space.
 836*/
 837void* dlmemalign(size_t, size_t);
 838
 839/*
 840  valloc(size_t n);
 841  Equivalent to memalign(pagesize, n), where pagesize is the page
 842  size of the system. If the pagesize is unknown, 4096 is used.
 843*/
 844void* dlvalloc(size_t);
 845
 846/*
 847  mallopt(int parameter_number, int parameter_value)
 848  Sets tunable parameters The format is to provide a
 849  (parameter-number, parameter-value) pair.  mallopt then sets the
 850  corresponding parameter to the argument value if it can (i.e., so
 851  long as the value is meaningful), and returns 1 if successful else
 852  0.  To workaround the fact that mallopt is specified to use int,
 853  not size_t parameters, the value -1 is specially treated as the
 854  maximum unsigned size_t value.
 855
 856  SVID/XPG/ANSI defines four standard param numbers for mallopt,
 857  normally defined in malloc.h.  None of these are use in this malloc,
 858  so setting them has no effect. But this malloc also supports other
 859  options in mallopt. See below for details.  Briefly, supported
 860  parameters are as follows (listed defaults are for "typical"
 861  configurations).
 862
 863  Symbol            param #  default    allowed param values
 864  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (-1 disables)
 865  M_GRANULARITY        -2     page size   any power of 2 >= page size
 866  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
 867*/
 868int dlmallopt(int, int);
 869
 870/*
 871  malloc_footprint();
 872  Returns the number of bytes obtained from the system.  The total
 873  number of bytes allocated by malloc, realloc etc., is less than this
 874  value. Unlike mallinfo, this function returns only a precomputed
 875  result, so can be called frequently to monitor memory consumption.
 876  Even if locks are otherwise defined, this function does not use them,
 877  so results might not be up to date.
 878*/
 879size_t dlmalloc_footprint(void);
 880
 881/*
 882  malloc_max_footprint();
 883  Returns the maximum number of bytes obtained from the system. This
 884  value will be greater than current footprint if deallocated space
 885  has been reclaimed by the system. The peak number of bytes allocated
 886  by malloc, realloc etc., is less than this value. Unlike mallinfo,
 887  this function returns only a precomputed result, so can be called
 888  frequently to monitor memory consumption.  Even if locks are
 889  otherwise defined, this function does not use them, so results might
 890  not be up to date.
 891*/
 892size_t dlmalloc_max_footprint(void);
 893
 894#if !NO_MALLINFO
 895/*
 896  mallinfo()
 897  Returns (by copy) a struct containing various summary statistics:
 898
 899  arena:     current total non-mmapped bytes allocated from system
 900  ordblks:   the number of free chunks
 901  smblks:    always zero.
 902  hblks:     current number of mmapped regions
 903  hblkhd:    total bytes held in mmapped regions
 904  usmblks:   the maximum total allocated space. This will be greater
 905                than current total if trimming has occurred.
 906  fsmblks:   always zero
 907  uordblks:  current total allocated space (normal or mmapped)
 908  fordblks:  total free space
 909  keepcost:  the maximum number of bytes that could ideally be released
 910               back to system via malloc_trim. ("ideally" means that
 911               it ignores page restrictions etc.)
 912
 913  Because these fields are ints, but internal bookkeeping may
 914  be kept as longs, the reported values may wrap around zero and
 915  thus be inaccurate.
 916*/
 917struct mallinfo dlmallinfo(void);
 918#endif /* NO_MALLINFO */
 919
 920/*
 921  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
 922
 923  independent_calloc is similar to calloc, but instead of returning a
 924  single cleared space, it returns an array of pointers to n_elements
 925  independent elements that can hold contents of size elem_size, each
 926  of which starts out cleared, and can be independently freed,
 927  realloc'ed etc. The elements are guaranteed to be adjacently
 928  allocated (this is not guaranteed to occur with multiple callocs or
 929  mallocs), which may also improve cache locality in some
 930  applications.
 931
 932  The "chunks" argument is optional (i.e., may be null, which is
 933  probably the most typical usage). If it is null, the returned array
 934  is itself dynamically allocated and should also be freed when it is
 935  no longer needed. Otherwise, the chunks array must be of at least
 936  n_elements in length. It is filled in with the pointers to the
 937  chunks.
 938
 939  In either case, independent_calloc returns this pointer array, or
 940  null if the allocation failed.  If n_elements is zero and "chunks"
 941  is null, it returns a chunk representing an array with zero elements
 942  (which should be freed if not wanted).
 943
 944  Each element must be individually freed when it is no longer
 945  needed. If you'd like to instead be able to free all at once, you
 946  should instead use regular calloc and assign pointers into this
 947  space to represent elements.  (In this case though, you cannot
 948  independently free elements.)
 949
 950  independent_calloc simplifies and speeds up implementations of many
 951  kinds of pools.  It may also be useful when constructing large data
 952  structures that initially have a fixed number of fixed-sized nodes,
 953  but the number is not known at compile time, and some of the nodes
 954  may later need to be freed. For example:
 955
 956  struct Node { int item; struct Node* next; };
 957
 958  struct Node* build_list() {
 959    struct Node** pool;
 960    int n = read_number_of_nodes_needed();
 961    if (n <= 0) return 0;
 962    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
 963    if (pool == 0) die();
 964    // organize into a linked list...
 965    struct Node* first = pool[0];
 966    for (i = 0; i < n-1; ++i)
 967      pool[i]->next = pool[i+1];
 968    free(pool);     // Can now free the array (or not, if it is needed later)
 969    return first;
 970  }
 971*/
 972void** dlindependent_calloc(size_t, size_t, void**);
 973
 974/*
 975  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
 976
 977  independent_comalloc allocates, all at once, a set of n_elements
 978  chunks with sizes indicated in the "sizes" array.    It returns
 979  an array of pointers to these elements, each of which can be
 980  independently freed, realloc'ed etc. The elements are guaranteed to
 981  be adjacently allocated (this is not guaranteed to occur with
 982  multiple callocs or mallocs), which may also improve cache locality
 983  in some applications.
 984
 985  The "chunks" argument is optional (i.e., may be null). If it is null
 986  the returned array is itself dynamically allocated and should also
 987  be freed when it is no longer needed. Otherwise, the chunks array
 988  must be of at least n_elements in length. It is filled in with the
 989  pointers to the chunks.
 990
 991  In either case, independent_comalloc returns this pointer array, or
 992  null if the allocation failed.  If n_elements is zero and chunks is
 993  null, it returns a chunk representing an array with zero elements
 994  (which should be freed if not wanted).
 995
 996  Each element must be individually freed when it is no longer
 997  needed. If you'd like to instead be able to free all at once, you
 998  should instead use a single regular malloc, and assign pointers at
 999  particular offsets in the aggregate space. (In this case though, you
1000  cannot independently free elements.)
1001
1002  independent_comallac differs from independent_calloc in that each
1003  element may have a different size, and also that it does not
1004  automatically clear elements.
1005
1006  independent_comalloc can be used to speed up allocation in cases
1007  where several structs or objects must always be allocated at the
1008  same time.  For example:
1009
1010  struct Head { ... }
1011  struct Foot { ... }
1012
1013  void send_message(char* msg) {
1014    int msglen = strlen(msg);
1015    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
1016    void* chunks[3];
1017    if (independent_comalloc(3, sizes, chunks) == 0)
1018      die();
1019    struct Head* head = (struct Head*)(chunks[0]);
1020    char*        body = (char*)(chunks[1]);
1021    struct Foot* foot = (struct Foot*)(chunks[2]);
1022    // ...
1023  }
1024
1025  In general though, independent_comalloc is worth using only for
1026  larger values of n_elements. For small values, you probably won't
1027  detect enough difference from series of malloc calls to bother.
1028
1029  Overuse of independent_comalloc can increase overall memory usage,
1030  since it cannot reuse existing noncontiguous small chunks that
1031  might be available for some of the elements.
1032*/
1033void** dlindependent_comalloc(size_t, size_t*, void**);
1034
1035
1036/*
1037  pvalloc(size_t n);
1038  Equivalent to valloc(minimum-page-that-holds(n)), that is,
1039  round up n to nearest pagesize.
1040 */
1041void*  dlpvalloc(size_t);
1042
1043/*
1044  malloc_trim(size_t pad);
1045
1046  If possible, gives memory back to the system (via negative arguments
1047  to sbrk) if there is unused memory at the `high' end of the malloc
1048  pool or in unused MMAP segments. You can call this after freeing
1049  large blocks of memory to potentially reduce the system-level memory
1050  requirements of a program. However, it cannot guarantee to reduce
1051  memory. Under some allocation patterns, some large free blocks of
1052  memory will be locked between two used chunks, so they cannot be
1053  given back to the system.
1054
1055  The `pad' argument to malloc_trim represents the amount of free
1056  trailing space to leave untrimmed. If this argument is zero, only
1057  the minimum amount of memory to maintain internal data structures
1058  will be left. Non-zero arguments can be supplied to maintain enough
1059  trailing space to service future expected allocations without having
1060  to re-obtain memory from the system.
1061
1062  Malloc_trim returns 1 if it actually released any memory, else 0.
1063*/
1064int  dlmalloc_trim(size_t);
1065
1066/*
1067  malloc_stats();
1068  Prints on stderr the amount of space obtained from the system (both
1069  via sbrk and mmap), the maximum amount (which may be more than
1070  current if malloc_trim and/or munmap got called), and the current
1071  number of bytes allocated via malloc (or realloc, etc) but not yet
1072  freed. Note that this is the number of bytes allocated, not the
1073  number requested. It will be larger than the number requested
1074  because of alignment and bookkeeping overhead. Because it includes
1075  alignment wastage as being in use, this figure may be greater than
1076  zero even when no user-level chunks are allocated.
1077
1078  The reported current and maximum system memory can be inaccurate if
1079  a program makes other calls to system memory allocation functions
1080  (normally sbrk) outside of malloc.
1081
1082  malloc_stats prints only the most commonly interesting statistics.
1083  More information can be obtained by calling mallinfo.
1084*/
1085void  dlmalloc_stats(void);
1086
1087#endif /* ONLY_MSPACES */
1088
1089/*
1090  malloc_usable_size(void* p);
1091
1092  Returns the number of bytes you can actually use in
1093  an allocated chunk, which may be more than you requested (although
1094  often not) due to alignment and minimum size constraints.
1095  You can use this many bytes without worrying about
1096  overwriting other allocated objects. This is not a particularly great
1097  programming practice. malloc_usable_size can be more useful in
1098  debugging and assertions, for example:
1099
1100  p = malloc(n);
1101  assert(malloc_usable_size(p) >= 256);
1102*/
1103size_t dlmalloc_usable_size(void*);
1104
1105
1106#if MSPACES
1107
1108/*
1109  mspace is an opaque type representing an independent
1110  region of space that supports mspace_malloc, etc.
1111*/
1112typedef void* mspace;
1113
1114/*
1115  create_mspace creates and returns a new independent space with the
1116  given initial capacity, or, if 0, the default granularity size.  It
1117  returns null if there is no system memory available to create the
1118  space.  If argument locked is non-zero, the space uses a separate
1119  lock to control access. The capacity of the space will grow
1120  dynamically as needed to service mspace_malloc requests.  You can
1121  control the sizes of incremental increases of this space by
1122  compiling with a different DEFAULT_GRANULARITY or dynamically
1123  setting with mallopt(M_GRANULARITY, value).
1124*/
1125mspace create_mspace(size_t capacity, int locked);
1126
1127/*
1128  destroy_mspace destroys the given space, and attempts to return all
1129  of its memory back to the system, returning the total number of
1130  bytes freed. After destruction, the results of access to all memory
1131  used by the space become undefined.
1132*/
1133size_t destroy_mspace(mspace msp);
1134
1135/*
1136  create_mspace_with_base uses the memory supplied as the initial base
1137  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
1138  space is used for bookkeeping, so the capacity must be at least this
1139  large. (Otherwise 0 is returned.) When this initial space is
1140  exhausted, additional memory will be obtained from the system.
1141  Destroying this space will deallocate all additionally allocated
1142  space (if possible) but not the initial base.
1143*/
1144mspace create_mspace_with_base(void* base, size_t capacity, int locked);
1145
1146/*
1147  mspace_mmap_large_chunks controls whether requests for large chunks
1148  are allocated in their own mmapped regions, separate from others in
1149  this mspace. By default this is enabled, which reduces
1150  fragmentation. However, such chunks are not necessarily released to
1151  the system upon destroy_mspace.  Disabling by setting to false may
1152  increase fragmentation, but avoids leakage when relying on
1153  destroy_mspace to release all memory allocated using this space.
1154*/
1155int mspace_mmap_large_chunks(mspace msp, int enable);
1156
1157
1158/*
1159  mspace_malloc behaves as malloc, but operates within
1160  the given space.
1161*/
1162void* mspace_malloc(mspace msp, size_t bytes);
1163
1164/*
1165  mspace_free behaves as free, but operates within
1166  the given space.
1167
1168  If compiled with FOOTERS==1, mspace_free is not actually needed.
1169  free may be called instead of mspace_free because freed chunks from
1170  any space are handled by their originating spaces.
1171*/
1172void mspace_free(mspace msp, void* mem);
1173
1174/*
1175  mspace_realloc behaves as realloc, but operates within
1176  the given space.
1177
1178  If compiled with FOOTERS==1, mspace_realloc is not actually
1179  needed.  realloc may be called instead of mspace_realloc because
1180  realloced chunks from any space are handled by their originating
1181  spaces.
1182*/
1183void* mspace_realloc(mspace msp, void* mem, size_t newsize);
1184
1185/*
1186  mspace_calloc behaves as calloc, but operates within
1187  the given space.
1188*/
1189void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
1190
1191/*
1192  mspace_memalign behaves as memalign, but operates within
1193  the given space.
1194*/
1195void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
1196
1197/*
1198  mspace_independent_calloc behaves as independent_calloc, but
1199  operates within the given space.
1200*/
1201void** mspace_independent_calloc(mspace msp, size_t n_elements,
1202                                 size_t elem_size, void* chunks[]);
1203
1204/*
1205  mspace_independent_comalloc behaves as independent_comalloc, but
1206  operates within the given space.
1207*/
1208void** mspace_independent_comalloc(mspace msp, size_t n_elements,
1209                                   size_t sizes[], void* chunks[]);
1210
1211/*
1212  mspace_footprint() returns the number of bytes obtained from the
1213  system for this space.
1214*/
1215size_t mspace_footprint(mspace msp);
1216
1217/*
1218  mspace_max_footprint() returns the peak number of bytes obtained from the
1219  system for this space.
1220*/
1221size_t mspace_max_footprint(mspace msp);
1222
1223
1224#if !NO_MALLINFO
1225/*
1226  mspace_mallinfo behaves as mallinfo, but reports properties of
1227  the given space.
1228*/
1229struct mallinfo mspace_mallinfo(mspace msp);
1230#endif /* NO_MALLINFO */
1231
1232/*
1233  malloc_usable_size(void* p) behaves the same as malloc_usable_size;
1234*/
1235  size_t mspace_usable_size(void* mem);
1236
1237/*
1238  mspace_malloc_stats behaves as malloc_stats, but reports
1239  properties of the given space.
1240*/
1241void mspace_malloc_stats(mspace msp);
1242
1243/*
1244  mspace_trim behaves as malloc_trim, but
1245  operates within the given space.
1246*/
1247int mspace_trim(mspace msp, size_t pad);
1248
1249/*
1250  An alias for mallopt.
1251*/
1252int mspace_mallopt(int, int);
1253
1254#endif /* MSPACES */
1255
1256#ifdef __cplusplus
1257};  /* end of extern "C" */
1258#endif /* __cplusplus */
1259
1260/*
1261  ========================================================================
1262  To make a fully customizable malloc.h header file, cut everything
1263  above this line, put into file malloc.h, edit to suit, and #include it
1264  on the next line, as well as in programs that use this malloc.
1265  ========================================================================
1266*/
1267
1268/* #include "malloc.h" */
1269
1270/*------------------------------ internal #includes ---------------------- */
1271
1272#ifdef WIN32
1273#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
1274#endif /* WIN32 */
1275
1276#include <stdio.h>       /* for printing in malloc_stats */
1277
1278#ifndef LACKS_ERRNO_H
1279#include <errno.h>       /* for MALLOC_FAILURE_ACTION */
1280#endif /* LACKS_ERRNO_H */
1281#if FOOTERS
1282#include <time.h>        /* for magic initialization */
1283#endif /* FOOTERS */
1284#ifndef LACKS_STDLIB_H
1285#include <stdlib.h>      /* for abort() */
1286#endif /* LACKS_STDLIB_H */
1287#ifdef DEBUG
1288#if ABORT_ON_ASSERT_FAILURE
1289#define assert(x) if(!(x)) ABORT
1290#else /* ABORT_ON_ASSERT_FAILURE */
1291#include <assert.h>
1292#endif /* ABORT_ON_ASSERT_FAILURE */
1293#else  /* DEBUG */
1294#ifndef assert
1295#define assert(x)
1296#endif
1297#define DEBUG 0
1298#endif /* DEBUG */
1299#ifndef LACKS_STRING_H
1300#include <string.h>      /* for memset etc */
1301#endif  /* LACKS_STRING_H */
1302#if USE_BUILTIN_FFS
1303#ifndef LACKS_STRINGS_H
1304#include <strings.h>     /* for ffs */
1305#endif /* LACKS_STRINGS_H */
1306#endif /* USE_BUILTIN_FFS */
1307#if HAVE_MMAP
1308#ifndef LACKS_SYS_MMAN_H
1309#include <sys/mman.h>    /* for mmap */
1310#endif /* LACKS_SYS_MMAN_H */
1311#ifndef LACKS_FCNTL_H
1312#include <fcntl.h>
1313#endif /* LACKS_FCNTL_H */
1314#endif /* HAVE_MMAP */
1315#ifndef LACKS_UNISTD_H
1316#include <unistd.h>     /* for sbrk, sysconf */
1317#else /* LACKS_UNISTD_H */
1318#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
1319extern void*     sbrk(ptrdiff_t);
1320#endif /* FreeBSD etc */
1321#endif /* LACKS_UNISTD_H */
1322
1323/* Declarations for locking */
1324#if USE_LOCKS
1325#ifndef WIN32
1326#include <pthread.h>
1327#if defined (__SVR4) && defined (__sun)  /* solaris */
1328#include <thread.h>
1329#endif /* solaris */
1330#else
1331#ifndef _M_AMD64
1332/* These are already defined on AMD64 builds */
1333#ifdef __cplusplus
1334extern "C" {
1335#endif /* __cplusplus */
1336#ifndef __MINGW32__
1337LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp);
1338LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
1339#endif
1340#ifdef __cplusplus
1341}
1342#endif /* __cplusplus */
1343#endif /* _M_AMD64 */
1344#ifndef __MINGW32__
1345#pragma intrinsic (_InterlockedCompareExchange)
1346#pragma intrinsic (_InterlockedExchange)
1347#else
1348  /* --[ start GCC compatibility ]----------------------------------------------
1349   * Compatibility <intrin_x86.h> header for GCC -- GCC equivalents of intrinsic
1350   * Microsoft Visual C++ functions. Originally developed for the ReactOS
1351   * (<http://www.reactos.org/>) and TinyKrnl (<http://www.tinykrnl.org/>)
1352   * projects.
1353   *
1354   * Copyright (c) 2006 KJK::Hyperion <hackbunny@reactos.com>
1355   *
1356   * Permission is hereby granted, free of charge, to any person obtaining a
1357   * copy of this software and associated documentation files (the "Software"),
1358   * to deal in the Software without restriction, including without limitation
1359   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1360   * and/or sell copies of the Software, and to permit persons to whom the
1361   * Software is furnished to do so, subject to the following conditions:
1362   *
1363   * The above copyright notice and this permission notice shall be included in
1364   * all copies or substantial portions of the Software.
1365   *
1366   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1367   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1368   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1369   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1370   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1371   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1372   * DEALINGS IN THE SOFTWARE.
1373   */
1374
1375  /*** Atomic operations ***/
1376  #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
1377    #define _ReadWriteBarrier() __sync_synchronize()
1378  #else
1379    static __inline__ __attribute__((always_inline)) long __sync_lock_test_and_set(volatile long * const Target, const long Value)
1380    {
1381      long res;
1382      __asm__ __volatile__("xchg%z0 %2, %0" : "=g" (*(Target)), "=r" (res) : "1" (Value));
1383      return res;
1384    }
1385    static void __inline__ __attribute__((always_inline)) _MemoryBarrier(void)
1386    {
1387      __asm__ __volatile__("" : : : "memory");
1388    }
1389    #define _ReadWriteBarrier() _MemoryBarrier()
1390  #endif
1391  /* BUGBUG: GCC only supports full barriers */
1392  static __inline__ __attribute__((always_inline)) long _InterlockedExchange(volatile long * const Target, const long Value)
1393  {
1394    /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */
1395    _ReadWriteBarrier();
1396    return __sync_lock_test_and_set(Target, Value);
1397  }
1398  /* --[ end GCC compatibility ]---------------------------------------------- */
1399#endif
1400#define interlockedcompareexchange _InterlockedCompareExchange
1401#define interlockedexchange _InterlockedExchange
1402#endif /* Win32 */
1403#endif /* USE_LOCKS */
1404
1405/* Declarations for bit scanning on win32 */
1406#if defined(_MSC_VER) && _MSC_VER>=1300
1407#ifndef BitScanForward  /* Try to avoid pulling in WinNT.h */
1408#ifdef __cplusplus
1409extern "C" {
1410#endif /* __cplusplus */
1411unsigned char _BitScanForward(unsigned long *index, unsigned long mask);
1412unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
1413#ifdef __cplusplus
1414}
1415#endif /* __cplusplus */
1416
1417#define BitScanForward _BitScanForward
1418#define BitScanReverse _BitScanReverse
1419#pragma intrinsic(_BitScanForward)
1420#pragma intrinsic(_BitScanReverse)
1421#endif /* BitScanForward */
1422#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */
1423
1424#ifndef WIN32
1425#ifndef malloc_getpagesize
1426#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
1427#    ifndef _SC_PAGE_SIZE
1428#      define _SC_PAGE_SIZE _SC_PAGESIZE
1429#    endif
1430#  endif
1431#  ifdef _SC_PAGE_SIZE
1432#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
1433#  else
1434#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
1435       extern size_t getpagesize();
1436#      define malloc_getpagesize getpagesize()
1437#    else
1438#      ifdef WIN32 /* use supplied emulation of getpagesize */
1439#        define malloc_getpagesize getpagesize()
1440#      else
1441#        ifndef LACKS_SYS_PARAM_H
1442#          include <sys/param.h>
1443#        endif
1444#        ifdef EXEC_PAGESIZE
1445#          define malloc_getpagesize EXEC_PAGESIZE
1446#        else
1447#          ifdef NBPG
1448#            ifndef CLSIZE
1449#              define malloc_getpagesize NBPG
1450#            else
1451#              define malloc_getpagesize (NBPG * CLSIZE)
1452#            endif
1453#          else
1454#            ifdef NBPC
1455#              define malloc_getpagesize NBPC
1456#            else
1457#              ifdef PAGESIZE
1458#                define malloc_getpagesize PAGESIZE
1459#              else /* just guess */
1460#                define malloc_getpagesize ((size_t)4096U)
1461#              endif
1462#            endif
1463#          endif
1464#        endif
1465#      endif
1466#    endif
1467#  endif
1468#endif
1469#endif
1470
1471
1472
1473/* ------------------- size_t and alignment properties -------------------- */
1474
1475/* The byte and bit size of a size_t */
1476#define SIZE_T_SIZE         (sizeof(size_t))
1477#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
1478
1479/* Some constants coerced to size_t */
1480/* Annoying but necessary to avoid errors on some platforms */
1481#define SIZE_T_ZERO         ((size_t)0)
1482#define SIZE_T_ONE          ((size_t)1)
1483#define SIZE_T_TWO          ((size_t)2)
1484#define SIZE_T_FOUR         ((size_t)4)
1485#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
1486#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
1487#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
1488#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
1489
1490/* The bit mask value corresponding to MALLOC_ALIGNMENT */
1491#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
1492
1493/* True if address a has acceptable alignment */
1494#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
1495
1496/* the number of bytes to offset an address to align it */
1497#define align_offset(A)\
1498 ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
1499  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
1500
1501/* -------------------------- MMAP preliminaries ------------------------- */
1502
1503/*
1504   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
1505   checks to fail so compiler optimizer can delete code rather than
1506   using so many "#if"s.
1507*/
1508
1509
1510/* MORECORE and MMAP must return MFAIL on failure */
1511#define MFAIL                ((void*)(MAX_SIZE_T))
1512#define CMFAIL               ((char*)(MFAIL)) /* defined for convenience */
1513
1514#if HAVE_MMAP
1515
1516#ifndef WIN32
1517#define MUNMAP_DEFAULT(a, s)  munmap((a), (s))
1518#define MMAP_PROT            (PROT_READ|PROT_WRITE)
1519#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
1520#define MAP_ANONYMOUS        MAP_ANON
1521#endif /* MAP_ANON */
1522#ifdef MAP_ANONYMOUS
1523#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
1524#define MMAP_DEFAULT(s)       mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
1525#else /* MAP_ANONYMOUS */
1526/*
1527   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
1528   is unlikely to be needed, but is supplied just in case.
1529*/
1530#define MMAP_FLAGS           (MAP_PRIVATE)
1531static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
1532#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \
1533           (dev_zero_fd = open("/dev/zero", O_RDWR), \
1534            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
1535            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
1536#endif /* MAP_ANONYMOUS */
1537
1538#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s)
1539
1540#else /* WIN32 */
1541
1542/* Win32 MMAP via VirtualAlloc */
1543static FORCEINLINE void* win32mmap(size_t size) {
1544  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
1545  return (ptr != 0)? ptr: MFAIL;
1546}
1547
1548/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
1549static FORCEINLINE void* win32direct_mmap(size_t size) {
1550  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
1551                           PAGE_READWRITE);
1552  return (ptr != 0)? ptr: MFAIL;
1553}
1554
1555/* This function supports releasing coalesed segments */
1556static FORCEINLINE int win32munmap(void* ptr, size_t size) {
1557  MEMORY_BASIC_INFORMATION minfo;
1558  char* cptr = (char*)ptr;
1559  while (size) {
1560    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
1561      return -1;
1562    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
1563        minfo.State != MEM_COMMIT || minfo.RegionSize > size)
1564      return -1;
1565    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
1566      return -1;
1567    cptr += minfo.RegionSize;
1568    size -= minfo.RegionSize;
1569  }
1570  return 0;
1571}
1572
1573#define MMAP_DEFAULT(s)             win32mmap(s)
1574#define MUNMAP_DEFAULT(a, s)        win32munmap((a), (s))
1575#define DIRECT_MMAP_DEFAULT(s)      win32direct_mmap(s)
1576#endif /* WIN32 */
1577#endif /* HAVE_MMAP */
1578
1579#if HAVE_MREMAP
1580#ifndef WIN32
1581#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
1582#endif /* WIN32 */
1583#endif /* HAVE_MREMAP */
1584
1585
1586/**
1587 * Define CALL_MORECORE
1588 */
1589#if HAVE_MORECORE
1590    #ifdef MORECORE
1591        #define CALL_MORECORE(S)    MORECORE(S)
1592    #else  /* MORECORE */
1593        #define CALL_MORECORE(S)    MORECORE_DEFAULT(S)
1594    #endif /* MORECORE */
1595#else  /* HAVE_MORECORE */
1596    #define CALL_MORECORE(S)        MFAIL
1597#endif /* HAVE_MORECORE */
1598
1599/**
1600 * Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP
1601 */
1602#if HAVE_MMAP
1603    #define IS_MMAPPED_BIT          (SIZE_T_ONE)
1604    #define USE_MMAP_BIT            (SIZE_T_ONE)
1605
1606    #ifdef MMAP
1607        #define CALL_MMAP(s)        MMAP(s)
1608    #else /* MMAP */
1609        #define CALL_MMAP(s)        MMAP_DEFAULT(s)
1610    #endif /* MMAP */
1611    #ifdef MUNMAP
1612        #define CALL_MUNMAP(a, s)   MUNMAP((a), (s))
1613    #else /* MUNMAP */
1614        #define CALL_MUNMAP(a, s)   MUNMAP_DEFAULT((a), (s))
1615    #endif /* MUNMAP */
1616    #ifdef DIRECT_MMAP
1617        #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
1618    #else /* DIRECT_MMAP */
1619        #define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
1620    #endif /* DIRECT_MMAP */
1621#else  /* HAVE_MMAP */
1622    #define IS_MMAPPED_BIT          (SIZE_T_ZERO)
1623    #define USE_MMAP_BIT            (SIZE_T_ZERO)
1624
1625    #define MMAP(s)                 MFAIL
1626    #define MUNMAP(a, s)            (-1)
1627    #define DIRECT_MMAP(s)          MFAIL
1628    #define CALL_DIRECT_MMAP(s)     DIRECT_MMAP(s)
1629    #define CALL_MMAP(s)            MMAP(s)
1630    #define CALL_MUNMAP(a, s)       MUNMAP((a), (s))
1631#endif /* HAVE_MMAP */
1632
1633/**
1634 * Define CALL_MREMAP
1635 */
1636#if HAVE_MMAP && HAVE_MREMAP
1637    #ifdef MREMAP
1638        #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv))
1639    #else /* MREMAP */
1640        #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv))
1641    #endif /* MREMAP */
1642#else  /* HAVE_MMAP && HAVE_MREMAP */
1643    #define CALL_MREMAP(addr, osz, nsz, mv)     MFAIL
1644#endif /* HAVE_MMAP && HAVE_MREMAP */
1645
1646/* mstate bit set if continguous morecore disabled or failed */
1647#define USE_NONCONTIGUOUS_BIT (4U)
1648
1649/* segment bit set in create_mspace_with_base */
1650#define EXTERN_BIT            (8U)
1651
1652
1653/* --------------------------- Lock preliminaries ------------------------ */
1654
1655/*
1656  When locks are defined, there is one global lock, plus
1657  one per-mspace lock.
1658
1659  The global lock_ensures that mparams.magic and other unique
1660  mparams values are initialized only once. It also protects
1661  sequences of calls to MORECORE.  In many cases sys_alloc requires
1662  two calls, that should not be interleaved with calls by other
1663  threads.  This does not protect against direct calls to MORECORE
1664  by other threads not using this lock, so there is still code to
1665  cope the best we can on interference.
1666
1667  Per-mspace locks surround calls to malloc, free, etc.  To enable use
1668  in layered extensions, per-mspace locks are reentrant.
1669
1670  Because lock-protected regions generally have bounded times, it is
1671  OK to use the supplied simple spinlocks in the custom versions for
1672  x86.
1673
1674  If USE_LOCKS is > 1, the definitions of lock routines here are
1675  bypassed, in which case you will need to define at least
1676  INITIAL_LOCK, ACQUIRE_LOCK, RELEASE_LOCK and possibly TRY_LOCK
1677  (which is not used in this malloc, but commonly needed in
1678  extensions.)
1679*/
1680
1681#if USE_LOCKS == 1
1682
1683#if USE_SPIN_LOCKS
1684#ifndef WIN32
1685
1686/* Custom pthread-style spin locks on x86 and x64 for gcc */
1687struct pthread_mlock_t {
1688  volatile unsigned int l;
1689  volatile unsigned int c;
1690  volatile pthread_t threadid;
1691};
1692#define MLOCK_T struct        pthread_mlock_t
1693#define CURRENT_THREAD        pthread_self()
1694#define INITIAL_LOCK(sl)      (memset(sl, 0, sizeof(MLOCK_T)), 0)
1695#define ACQUIRE_LOCK(sl)      pthread_acquire_lock(sl)
1696#define RELEASE_LOCK(sl)      pthread_release_lock(sl)
1697#define TRY_LOCK(sl)          pthread_try_lock(sl)
1698#define SPINS_PER_YIELD       63
1699
1700static MLOCK_T malloc_global_mutex = { 0, 0, 0};
1701
1702static FORCEINLINE int pthread_acquire_lock (MLOCK_T *sl) {
1703  int spins = 0;
1704  volatile unsigned int* lp = &sl->l;
1705  for (;;) {
1706    if (*lp != 0) {
1707      if (sl->threadid == CURRENT_THREAD) {
1708        ++sl->c;
1709        return 0;
1710      }
1711    }
1712    else {
1713      /* place args to cmpxchgl in locals to evade oddities in some gccs */
1714      int cmp = 0;
1715      int val = 1;
1716      int ret;
1717      __asm__ __volatile__  ("lock; cmpxchgl %1, %2"
1718                             : "=a" (ret)
1719                             : "r" (val), "m" (*(lp)), "0"(cmp)
1720                             : "memory", "cc");
1721      if (!ret) {
1722        assert(!sl->threadid);
1723        sl->c = 1;
1724        sl->threadid = CURRENT_THREAD;
1725        return 0;
1726      }
1727      if ((++spins & SPINS_PER_YIELD) == 0) {
1728#if defined (__SVR4) && defined (__sun) /* solaris */
1729        thr_yield();
1730#else
1731#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
1732        sched_yield();
1733#else  /* no-op yield on unknown systems */
1734        ;
1735#endif /* __linux__ || __FreeBSD__ || __APPLE__ */
1736#endif /* solaris */
1737      }
1738    }
1739  }
1740}
1741
1742static FORCEINLINE void pthread_release_lock (MLOCK_T *sl) {
1743  assert(sl->l != 0);
1744  assert(sl->threadid == CURRENT_THREAD);
1745  if (--sl->c == 0) {
1746    sl->threadid = 0;
1747    volatile unsigned int* lp = &sl->l;
1748    int prev = 0;
1749    int ret;
1750    __asm__ __volatile__ ("lock; xchgl %0, %1"
1751                          : "=r" (ret)
1752                          : "m" (*(lp)), "0"(prev)
1753                          : "memory");
1754  }
1755}
1756
1757static FORCEINLINE int pthread_try_lock (MLOCK_T *sl) {
1758  volatile unsigned int* lp = &sl->l;
1759  if (*lp != 0) {
1760      if (sl->threadid == CURRENT_THREAD) {
1761        ++sl->c;
1762        return 1;
1763      }
1764  }
1765  else {
1766    int cmp = 0;
1767    int val = 1;
1768    int ret;
1769    __asm__ __volatile__  ("lock; cmpxchgl %1, %2"
1770                           : "=a" (ret)
1771                           : "r" (val), "m" (*(lp)), "0"(cmp)
1772                           : "memory", "cc");
1773    if (!ret) {
1774      assert(!sl->threadid);
1775      sl->c = 1;
1776      sl->threadid = CURRENT_THREAD;
1777      return 1;
1778    }
1779  }
1780  return 0;
1781}
1782
1783
1784#else /* WIN32 */
1785/* Custom win32-style spin locks on x86 and x64 for MSC */
1786struct win32_mlock_t
1787{
1788  volatile long l;
1789  volatile unsigned int c;
1790  volatile long threadid;
1791};
1792
1793#define MLOCK_T               struct win32_mlock_t
1794#define CURRENT_THREAD        win32_getcurrentthreadid()
1795#define INITIAL_LOCK(sl)      (memset(sl, 0, sizeof(MLOCK_T)), 0)
1796#define ACQUIRE_LOCK(sl)      win32_acquire_lock(sl)
1797#define RELEASE_LOCK(sl)      win32_release_lock(sl)
1798#define TRY_LOCK(sl)          win32_try_lock(sl)
1799#define SPINS_PER_YIELD       63
1800
1801static MLOCK_T malloc_global_mutex = { 0, 0, 0};
1802
1803static FORCEINLINE long win32_getcurrentthreadid() {
1804#ifdef _MSC_VER
1805#if defined(_M_IX86)
1806  long *threadstruct=(long *)__readfsdword(0x18);
1807  long threadid=threadstruct[0x24/sizeof(long)];
1808  return threadid;
1809#elif defined(_M_X64)
1810  /* todo */
1811  return GetCurrentThreadId();
1812#else
1813  return GetCurrentThreadId();
1814#endif
1815#else
1816  return GetCurrentThreadId();
1817#endif
1818}
1819
1820static FORCEINLINE int win32_acquire_lock (MLOCK_T *sl) {
1821  int spins = 0;
1822  for (;;) {
1823    if (sl->l != 0) {
1824      if (sl->threadid == CURRENT_THREAD) {
1825        ++sl->c;
1826        return 0;
1827      }
1828    }
1829    else {
1830      if (!interlockedexchange(&sl->l, 1)) {
1831        assert(!sl->threadid);
1832                sl->c=CURRENT_THREAD;
1833        sl->threadid = CURRENT_THREAD;
1834        sl->c = 1;
1835        return 0;
1836      }
1837    }
1838    if ((++spins & SPINS_PER_YIELD) == 0)
1839      SleepEx(0, FALSE);
1840  }
1841}
1842
1843static FORCEINLINE void win32_release_lock (MLOCK_T *sl) {
1844  assert(sl->threadid == CURRENT_THREAD);
1845  assert(sl->l != 0);
1846  if (--sl->c == 0) {
1847    sl->threadid = 0;
1848    interlockedexchange (&sl->l, 0);
1849  }
1850}
1851
1852static FORCEINLINE int win32_try_lock (MLOCK_T *sl) {
1853  if(sl->l != 0) {
1854      if (sl->threadid == CURRENT_THREAD) {
1855        ++sl->c;
1856        return 1;
1857      }
1858  }
1859  else {
1860    if (!interlockedexchange(&sl->l, 1)){
1861      assert(!sl->threadid);
1862      sl->threadid = CURRENT_THREAD;
1863      sl->c = 1;
1864      return 1;
1865    }
1866  }
1867  return 0;
1868}
1869
1870#endif /* WIN32 */
1871#else /* USE_SPIN_LOCKS */
1872
1873#ifndef WIN32
1874/* pthreads-based locks */
1875
1876#define MLOCK_T               pthread_mutex_t
1877#define CURRENT_THREAD        pthread_self()
1878#define INITIAL_LOCK(sl)      pthread_init_lock(sl)
1879#define ACQUIRE_LOCK(sl)      pthread_mutex_lock(sl)
1880#define RELEASE_LOCK(sl)      pthread_mutex_unlock(sl)
1881#define TRY_LOCK(sl)          (!pthread_mutex_trylock(sl))
1882
1883static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER;
1884
1885/* Cope with old-style linux recursive lock initialization by adding */
1886/* skipped internal declaration from pthread.h */
1887#ifdef linux
1888#ifndef PTHREAD_MUTEX_RECURSIVE
1889extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr,
1890                                           int __kind));
1891#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
1892#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y)
1893#endif
1894#endif
1895
1896static int pthread_init_lock (MLOCK_T *sl) {
1897  pthread_mutexattr_t attr;
1898  if (pthread_mutexattr_init(&attr)) return 1;
1899  if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1;
1900  if (pthread_mutex_init(sl, &attr)) return 1;
1901  if (pthread_mutexattr_destroy(&attr)) return 1;
1902  return 0;
1903}
1904
1905#else /* WIN32 */
1906/* Win32 critical sections */
1907#define MLOCK_T               CRITICAL_SECTION
1908#define CURRENT_THREAD        GetCurrentThreadId()
1909#define INITIAL_LOCK(s)       (!InitializeCriticalSectionAndSpinCount((s), 0x80000000|4000))
1910#define ACQUIRE_LOCK(s)       (EnterCriticalSection(s), 0)
1911#define RELEASE_LOCK(s)       LeaveCriticalSection(s)
1912#define TRY_LOCK(s)           TryEnterCriticalSection(s)
1913#define NEED_GLOBAL_LOCK_INIT
1914
1915static MLOCK_T malloc_global_mutex;
1916static volatile long malloc_global_mutex_status;
1917
1918/* Use spin loop to initialize global lock */
1919static void init_malloc_global_mutex() {
1920  for (;;) {
1921    long stat = malloc_global_mutex_status;
1922    if (stat > 0)
1923      return;
1924    /* transition to < 0 while initializing, then to > 0) */
1925    if (stat == 0 &&
1926        interlockedcompareexchange(&malloc_global_mutex_status, -1, 0) == 0) {
1927      InitializeCriticalSection(&malloc_global_mutex);
1928      interlockedexchange(&malloc_global_mutex_status,1);
1929      return;
1930    }
1931    SleepEx(0, FALSE);
1932  }
1933}
1934
1935#endif /* WIN32 */
1936#endif /* USE_SPIN_LOCKS */
1937#endif /* USE_LOCKS == 1 */
1938
1939/* -----------------------  User-defined locks ------------------------ */
1940
1941#if USE_LOCKS > 1
1942/* Define your own lock implementation here */
1943/* #define INITIAL_LOCK(sl)  ... */
1944/* #define ACQUIRE_LOCK(sl)  ... */
1945/* #define RELEASE_LOCK(sl)  ... */
1946/* #define TRY_LOCK(sl) ... */
1947/* static MLOCK_T malloc_global_mutex = ... */
1948#endif /* USE_LOCKS > 1 */
1949
1950/* -----------------------  Lock-based state ------------------------ */
1951
1952#if USE_LOCKS
1953#define USE_LOCK_BIT               (2U)
1954#else  /* USE_LOCKS */
1955#define USE_LOCK_BIT               (0U)
1956#define INITIAL_LOCK(l)
1957#endif /* USE_LOCKS */
1958
1959#if USE_LOCKS
1960#define ACQUIRE_MALLOC_GLOBAL_LOCK()  ACQUIRE_LOCK(&malloc_global_mutex);
1961#define RELEASE_MALLOC_GLOBAL_LOCK()  RELEASE_LOCK(&malloc_global_mutex);
1962#else  /* USE_LOCKS */
1963#define ACQUIRE_MALLOC_GLOBAL_LOCK()
1964#define RELEASE_MALLOC_GLOBAL_LOCK()
1965#endif /* USE_LOCKS */
1966
1967
1968/* -----------------------  Chunk representations ------------------------ */
1969
1970/*
1971  (The following includes lightly edited explanations by Colin Plumb.)
1972
1973  The malloc_chunk declaration below is misleading (but accurate and
1974  necessary).  It declares a "view" into memory allowing access to
1975  necessary fields at known offsets from a given base.
1976
1977  Chunks of memory are maintained using a `boundary tag' method as
1978  originally described by Knuth.  (See the paper by Paul Wilson
1979  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
1980  techniques.)  Sizes of free chunks are stored both in the front of
1981  each chunk and at the end.  This makes consolidating fragmented
1982  chunks into bigger chunks fast.  The head fields also hold bits
1983  representing whether chunks are free or in use.
1984
1985  Here are some pictures to make it clearer.  They are "exploded" to
1986  show that the state of a chunk can be thought of as extending from
1987  the high 31 bits of the head field of its header through the
1988  prev_foot and PINUSE_BIT bit of the following chunk header.
1989
1990  A chunk that's in use looks like:
1991
1992   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1993           | Size of previous chunk (if P = 0)                             |
1994           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1995         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
1996         | Size of this chunk                                         1| +-+
1997   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1998         |                                                               |
1999         +-                                                             -+
2000         |                                                               |
2001         +-                                                             -+
2002         |                                                               :
2003         +-      size - sizeof(size_t) available payload bytes          -+
2004         :                                                               |
2005 chunk-> +-                                                             -+
2006         |                                                               |
2007         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2008       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
2009       | Size of next chunk (may or may not be in use)               | +-+
2010 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2011
2012    And if it's free, it looks like this:
2013
2014   chunk-> +-                                                             -+
2015           | User payload (must be in use, or we would have merged!)       |
2016           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2017         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
2018         | Size of this chunk                                         0| +-+
2019   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2020         | Next pointer                                                  |
2021         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2022         | Prev pointer                                                  |
2023         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2024         |                                                               :
2025         +-      size - sizeof(struct chunk) unused bytes               -+
2026         :                                                               |
2027 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2028         | Size of this chunk                                            |
2029         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2030       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
2031       | Size of next chunk (must be in use, or we would have merged)| +-+
2032 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2033       |                                                               :
2034       +- User payload                                                -+
2035       :                                                               |
2036       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2037                                                                     |0|
2038                                                                     +-+
2039  Note that since we always merge adjacent free chunks, the chunks
2040  adjacent to a free chunk must be in use.
2041
2042  Given a pointer to a chunk (which can be derived trivially from the
2043  payload pointer) we can, in O(1) time, find out whether the adjacent
2044  chunks are free, and if so, unlink them from the lists that they
2045  are on and merge them with the current chunk.
2046
2047  Chunks always begin on even word boundaries, so the mem portion
2048  (which is returned to the user) is also on an even word boundary, and
2049  thus at least double-word aligned.
2050
2051  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
2052  chunk size (which is always a multiple of two words), is an in-use
2053  bit for the *previous* chunk.  If that bit is *clear*, then the
2054  word before the current chunk size contains the previous chunk
2055  size, and can be used to find the front of the previous chunk.
2056  The very first chunk allocated always has this bit set, preventing
2057  access to non-existent (or non-owned) memory. If pinuse is set for
2058  any given chunk, then you CANNOT determine the size of the
2059  previous chunk, and might even get a memory addressing fault when
2060  trying to do so.
2061
2062  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
2063  the chunk size redundantly records whether the current chunk is
2064  inuse. This redundancy enables usage checks within free and realloc,
2065  and reduces indirection when freeing and consolidating chunks.
2066
2067  Each freshly allocated chunk must have both cinuse and pinuse set.
2068  That is, each allocated chunk borders either a previously allocated
2069  and still in-use chunk, or the base of its memory arena. This is
2070  ensured by making all allocations from the the `lowest' part of any
2071  found chunk.  Further, no free chunk physically borders another one,
2072  so each free chunk is known to be preceded and followed by either
2073  inuse chunks or the ends of memory.
2074
2075  Note that the `foot' of the current chunk is actually represented
2076  as the prev_foot of the NEXT chunk. This makes it easier to
2077  deal with alignments etc but can be very confusing when trying
2078  to extend or adapt this code.
2079
2080  The exceptions to all this are
2081
2082     1. The special chunk `top' is the top-most available chunk (i.e.,
2083        the one bordering the end of available memory). It is treated
2084        specially.  Top is never included in any bin, is used only if
2085        no other chunk is available, and is released back to the
2086        system if it is very large (see M_TRIM_THRESHOLD).  In effect,
2087        the top chunk is treated as larger (and thus less well
2088        fitting) than any other available chunk.  The top chunk
2089        doesn't update its trailing size field since there is no next
2090        contiguous chunk that would have to index off it. However,
2091        space is still allocated for it (TOP_FOOT_SIZE) to enable
2092        separation or merging when space is extended.
2093
2094     3. Chunks allocated via mmap, which have the lowest-order bit
2095        (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set
2096        PINUSE_BIT in their head fields.  Because they are allocated
2097        one-by-one, each must carry its own prev_foot field, which is
2098        also used to hold the offset this chunk has within its mmapped
2099        region, which is needed to preserve alignment. Each mmapped
2100        chunk is trailed by the first two fields of a fake next-chunk
2101        for sake of usage checks.
2102
2103*/
2104
2105struct malloc_chunk {
2106  size_t               prev_foot;  /* Size of previous chunk (if free).  */
2107  size_t               head;       /* Size and inuse bits. */
2108  struct malloc_chunk* fd;         /* double links -- used only if free. */
2109  struct malloc_chunk* bk;
2110};
2111
2112typedef struct malloc_chunk  mchunk;
2113typedef struct malloc_chunk* mchunkptr;
2114typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
2115typedef unsigned int bindex_t;         /* Described below */
2116typedef unsigned int binmap_t;         /* Described below */
2117typedef unsigned int flag_t;           /* The type of various bit flag sets */
2118
2119/* ------------------- Chunks sizes and alignments ----------------------- */
2120
2121#define MCHUNK_SIZE         (sizeof(mchunk))
2122
2123#if FOOTERS
2124#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
2125#else /* FOOTERS */
2126#define CHUNK_OVERHEAD      (SIZE_T_SIZE)
2127#endif /* FOOTERS */
2128
2129/* MMapped chunks need a second word of overhead ... */
2130#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
2131/* ... and additional padding for fake next-chunk at foot */
2132#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
2133
2134/* The smallest size we can malloc is an aligned minimal chunk */
2135#define MIN_CHUNK_SIZE\
2136  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
2137
2138/* conversion from malloc headers to user pointers, and back */
2139#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))
2140#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
2141/* chunk associated with aligned address A */
2142#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
2143
2144/* Bounds on request (not chunk) sizes. */
2145#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
2146#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
2147
2148/* pad request bytes into a usable size */
2149#define pad_request(req) \
2150   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
2151
2152/* pad request, checking for minimum (but not maximum) */
2153#define request2size(req) \
2154  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
2155
2156
2157/* ------------------ Operations on head and foot fields ----------------- */
2158
2159/*
2160  The head field of a chunk is or'ed with PINUSE_BIT when previous
2161  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
2162  use. If the chunk was obtained with mmap, the prev_foot field has
2163  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the
2164  mmapped region to the base of the chunk.
2165
2166  FLAG4_BIT is not used by this malloc, but might be useful in extensions.
2167*/
2168
2169#define PINUSE_BIT          (SIZE_T_ONE)
2170#define CINUSE_BIT          (SIZE_T_TWO)
2171#define FLAG4_BIT           (SIZE_T_FOUR)
2172#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
2173#define FLAG_BITS           (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT)
2174
2175/* Head value for fenceposts */
2176#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
2177
2178/* extraction of fields from head words */
2179#define cinuse(p)           ((p)->head & CINUSE_BIT)
2180#define pinuse(p)           ((p)->head & PINUSE_BIT)
2181#define chunksize(p)        ((p)->head & ~(FLAG_BITS))
2182
2183#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
2184#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)
2185
2186/* Treat space at ptr +/- offset as a chunk */
2187#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
2188#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
2189
2190/* Ptr to next or previous physical malloc_chunk. */
2191#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS)))
2192#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
2193
2194/* extract next chunk's pinuse bit */
2195#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
2196
2197/* Get/set size at footer */
2198#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)
2199#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
2200
2201/* Set size, pinuse bit, and foot */
2202#define set_size_and_pinuse_of_free_chunk(p, s)\
2203  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
2204
2205/* Set size, pinuse bit, foot, and clear next pinuse */
2206#define set_free_with_pinuse(p, s, n)\
2207  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
2208
2209#define is_mmapped(p)\
2210  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))
2211
2212/* Get the internal overhead associated with chunk p */
2213#define overhead_for(p)\
2214 (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
2215
2216/* Return true if malloced space is not necessarily cleared */
2217#if MMAP_CLEARS
2218#define calloc_must_clear(p) (!is_mmapped(p))
2219#else /* MMAP_CLEARS */
2220#define calloc_must_clear(p) (1)
2221#endif /* MMAP_CLEARS */
2222
2223/* ---------------------- Overlaid data structures ----------------------- */
2224
2225/*
2226  When chunks are not in use, they are treated as nodes of either
2227  lists or trees.
2228
2229  "Small"  chunks are stored in circular doubly-linked lists, and look
2230  like this:
2231
2232    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2233            |             Size of previous chunk                            |
2234            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2235    `head:' |             Size of chunk, in bytes                         |P|
2236      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2237            |             Forward pointer to next chunk in list             |
2238            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2239            |             Back pointer to previous chunk in list            |
2240            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2241            |             Unused space (may be 0 bytes long)                .
2242            .                                                               .
2243            .                                                               |
2244nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2245    `foot:' |             Size of chunk, in bytes                           |
2246            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2247
2248  Larger chunks are kept in a form of bitwise digital trees (aka
2249  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for
2250  free chunks greater than 256 bytes, their size doesn't impose any
2251  constraints on user chunk sizes.  Each node looks like:
2252
2253    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2254            |             Size of previous chunk                            |
2255            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2256    `head:' |             Size of chunk, in bytes                         |P|
2257      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2258            |             Forward pointer to next chunk of same size        |
2259            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2260            |             Back pointer to previous chunk of same size       |
2261            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2262            |             Pointer to left child (child[0])                  |
2263            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2264            |             Pointer to right child (child[1])                 |
2265            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2266            |             Pointer to parent                                 |
2267            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2268            |             bin index of this chunk                           |
2269            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2270            |             Unused space                                      .
2271            .                                                               |
2272nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2273    `foot:' |             Size of chunk, in bytes                           |
2274            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2275
2276  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks
2277  of the same size are arranged in a circularly-linked list, with only
2278  the oldest chunk (the next to be used, in our FIFO ordering)
2279  actually in the tree.  (Tree members are distinguished by a non-null
2280  parent pointer.)  If a chunk with the same size an an existing node
2281  is inserted, it is linked off the existing node using pointers that
2282  work in the same way as fd/bk pointers of small chunks.
2283
2284  Each tree contains a power of 2 sized range of chunk sizes (the
2285  smallest is 0x100 <= x < 0x180), which is is divided in half at each
2286  tree level, with the chunks in the smaller half of the range (0x100
2287  <= x < 0x140 for the top nose) in the left subtree and the larger
2288  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,
2289  done by inspecting individual bits.
2290
2291  Using these rules, each node's left subtree contains all smaller
2292  sizes than its right subtree.  However, the node at the root of each
2293  subtree has no particular ordering relationship to either.  (The
2294  dividing line between the subtree sizes is based on trie relation.)
2295  If we remove the last chunk of a given size from the interior of the
2296  tree, we need to replace it with a leaf node.  The tree ordering
2297  rules permit a node to be replaced by any leaf below it.
2298
2299  The smallest chunk in a tree (a common operation in a best-fit
2300  allocator) can be found by walking a path to the leftmost leaf in
2301  the tree.  Unlike a usual binary tree, where we follow left child
2302  pointers until we reach a null, here we follow the right child
2303  pointer any time the left one is null, until we reach a leaf with
2304  both child pointers null. The smallest chunk in the tree will be
2305  somewhere along that path.
2306
2307  The worst case number of steps to add, find, or remove a node is
2308  bounded by the number of bits differentiating chunks within
2309  bins. Under current bin calculations, this ranges from 6 up to 21
2310  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
2311  is of course much better.
2312*/
2313
2314struct malloc_tree_chunk {
2315  /* The first four fields must be compatible with malloc_chunk */
2316  size_t                    prev_foot;
2317  size_t                    head;
2318  struct malloc_tree_chunk* fd;
2319  struct malloc_tree_chunk* bk;
2320
2321  struct malloc_tree_chunk* child[2];
2322  struct malloc_tree_chunk* parent;
2323  bindex_t                  index;
2324};
2325
2326typedef struct malloc_tree_chunk  tchunk;
2327typedef struct malloc_tree_chunk* tchunkptr;
2328typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
2329
2330/* A little helper macro for trees */
2331#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
2332
2333/* ----------------------------- Segments -------------------------------- */
2334
2335/*
2336  Each malloc space may include non-contiguous segments, held in a
2337  list headed by an embedded malloc_segment record representing the
2338  top-most space. Segments also include flags holding properties of
2339  the space. Large chunks that are directly allocated by mmap are not
2340  included in this list. They are instead independently created and
2341  destroyed without otherwise keeping track of them.
2342
2343  Segment management mainly comes into play for spaces allocated by
2344  MMAP.  Any call to MMAP might or might not return memory that is
2345  adjacent to an existing segment.  MORECORE normally contiguously
2346  extends the current space, so this space is almost always adjacent,
2347  which is simpler and faster to deal with. (This is why MORECORE is
2348  used preferentially to MMAP when both are available -- see
2349  sys_alloc.)  When allocating using MMAP, we don't use any of the
2350  hinting mechanisms (inconsistently) supported in various
2351  implementations of unix mmap, or distinguish reserving from
2352  committing memory. Instead, we just ask for space, and exploit
2353  contiguity when we get it.  It is probably possible to do
2354  better than this on some systems, but no general scheme seems
2355  to be significantly better.
2356
2357  Management entails a simpler variant of the consolidation scheme
2358  used for chunks to reduce fragmentation -- new adjacent memory is
2359  normally prepended or appended to an existing segment. However,
2360  there are limitations compared to chunk consolidation that mostly
2361  reflect the fact that segment processing is relatively infrequent
2362  (occurring only when getting memory from system) and that we
2363  don't expect to have huge numbers of segments:
2364
2365  * Segments are not indexed, so traversal requires linear scans.  (It
2366    would be possible to index these, but is not worth the extra
2367    overhead and complexity for most programs on most platforms.)
2368  * New segments are only appended to old ones when holding top-most
2369    memory; if they cannot be prepended to others, they are held in
2370    different segments.
2371
2372  Except for the top-most segment of an mstate, each segment record
2373  is kept at the tail of its segment. Segments are added by pushing
2374  segment records onto the list headed by &mstate.seg for the
2375  containing mstate.
2376
2377  Segment flags control allocation/merge/deallocation policies:
2378  * If EXTERN_BIT set, then we did not allocate this segment,
2379    and so should not try to deallocate or merge with others.
2380    (This currently holds only for the initial segment passed
2381    into create_mspace_with_base.)
2382  * If IS_MMAPPED_BIT set, the segment may be merged with
2383    other surrounding mmapped segments and trimmed/de-allocated
2384    using munmap.
2385  * If neither bit is set, then the segment was obtained using
2386    MORECORE so can be merged with surrounding MORECORE'd segments
2387    and deallocated/trimmed using MORECORE with negative arguments.
2388*/
2389
2390struct malloc_segment {
2391  char*        base;             /* base address */
2392  size_t       size;             /* allocated size */
2393  struct malloc_segment* next;   /* ptr to next segment */
2394  flag_t       sflags;           /* mmap and extern flag */
2395};
2396
2397#define is_mmapped_segment(S)  ((S)->sflags & IS_MMAPPED_BIT)
2398#define is_extern_segment(S)   ((S)->sflags & EXTERN_BIT)
2399
2400typedef struct malloc_segment  msegment;
2401typedef struct malloc_segment* msegmentptr;
2402
2403/* ---------------------------- malloc_state ----------------------------- */
2404
2405/*
2406   A malloc_state holds all of the bookkeeping for a space.
2407   The main fields are:
2408
2409  Top
2410    The topmost chunk of the currently active segment. Its size is
2411    cached in topsize.  The actual size of topmost space is
2412    topsize+TOP_FOOT_SIZE, which includes space reserved for adding
2413    fenceposts and segment records if necessary when getting more
2414    space from the system.  The size at which to autotrim top is
2415    cached from mparams in trim_check, except that it is disabled if
2416    an autotrim fails.
2417
2418  Designated victim (dv)
2419    This is the preferred chunk for servicing small requests that
2420    don't have exact fits.  It is normally the chunk split off most
2421    recently to service another small request.  Its size is cached in
2422    dvsize. The link fields of this chunk are not maintained since it
2423    is not kept in a bin.
2424
2425  SmallBins
2426    An array of bin headers for free chunks.  These bins hold chunks
2427    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
2428    chunks of all the same size, spaced 8 bytes apart.  To simplify
2429    use in double-linked lists, each bin header acts as a malloc_chunk
2430    pointing to the real first node, if it exists (else pointing to
2431    itself).  This avoids special-casing for headers.  But to avoid
2432    waste, we allocate only the fd/bk pointers of bins, and then use
2433    repositioning tricks to treat these as the fields of a chunk.
2434
2435  TreeBins
2436    Treebins are pointers to the roots of trees holding a range of
2437    sizes. There are 2 equally spaced treebins for each power of two
2438    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
2439    larger.
2440
2441  Bin maps
2442    There is one bit map for small bins ("smallmap") and one for
2443    treebins ("treemap).  Each bin sets its bit when non-empty, and
2444    clears the bit when empty.  Bit operations are then used to avoid
2445    bin-by-bin searching -- nearly all "search" is done without ever
2446    looking at bins that won't be selected.  The bit maps
2447    conservatively use 32 bits per map word, even if on 64bit system.
2448    For a good description of some of the bit-based techniques used
2449    here, see Henry S. Warren Jr's book "Hacker's Delight" (and
2450    supplement at http://hackersdelight.org/). Many of these are
2451    intended to reduce the branchiness of paths through malloc etc, as
2452    well as to reduce the number of memory locations read or written.
2453
2454  Segments
2455    A list of segments headed by an embedded malloc_segment record
2456    representing the initial space.
2457
2458  Address check support
2459    The least_addr field is the least address ever obtained from
2460    MORECORE or MMAP. Attempted frees and reallocs of any address less
2461    than this are trapped (unless INSECURE is defined).
2462
2463  Magic tag
2464    A cross-check field that should always hold same value as mparams.magic.
2465
2466  Flags
2467    Bits recording whether to use MMAP, locks, or contiguous MORECORE
2468
2469  Statistics
2470    Each space keeps track of current and maximum system memory
2471    obtained via MORECORE or MMAP.
2472
2473  Trim support
2474    Fields holding the amount of unused topmost memory that should trigger
2475    timming, and a counter to force periodic scanning to release unused
2476    non-topmost segments.
2477
2478  Locking
2479    If USE_LOCKS is defined, the "mutex" lock is acquired and released
2480    around every public call using this mspace.
2481
2482  Extension support
2483    A void* pointer and a size_t field that can be used to help implement
2484    extensions to this malloc.
2485*/
2486
2487/* Bin types, widths and sizes */
2488#define NSMALLBINS        (32U)
2489#define NTREEBINS         (32U)
2490#define SMALLBIN_SHIFT    (3U)
2491#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
2492#define TREEBIN_SHIFT     (8U)
2493#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
2494#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
2495#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
2496
2497struct malloc_state {
2498  binmap_t   smallmap;
2499  binmap_t   treemap;
2500  size_t     dvsize;
2501  size_t     topsize;
2502  char*      least_addr;
2503  mchunkptr  dv;
2504  mchunkptr  top;
2505  size_t     trim_check;
2506  size_t     release_checks;
2507  size_t     magic;
2508  mchunkptr  smallbins[(NSMALLBINS+1)*2];
2509  tbinptr    treebins[NTREEBINS];
2510  size_t     footprint;
2511  size_t     max_footprint;
2512  flag_t     mflags;
2513#if USE_LOCKS
2514  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
2515#endif /* USE_LOCKS */
2516  msegment   seg;
2517  void*      extp;      /* Unused but available for extensions */
2518  size_t     exts;
2519};
2520
2521typedef struct malloc_state*    mstate;
2522
2523/* ------------- Global malloc_state and malloc_params ------------------- */
2524
2525/*
2526  malloc_params holds global properties, including those that can be
2527  dynamically set using mallopt. There is a single instance, mparams,
2528  initialized in init_mparams. Note that the non-zeroness of "magic"
2529  also serves as an initialization flag.
2530*/
2531
2532struct malloc_params {
2533  volatile size_t magic;
2534  size_t page_size;
2535  size_t granularity;
2536  size_t mmap_threshold;
2537  size_t trim_threshold;
2538  flag_t default_mflags;
2539};
2540
2541static struct malloc_params mparams;
2542
2543/* Ensure mparams initialized */
2544#define ensure_initialization() (mparams.magic != 0 || init_mparams())
2545
2546#if !ONLY_MSPACES
2547
2548/* The global malloc_state used for all non-"mspace" calls */
2549static struct malloc_state _gm_;
2550#define gm                 (&_gm_)
2551#define is_global(M)       ((M) == &_gm_)
2552
2553#endif /* !ONLY_MSPACES */
2554
2555#define is_initialized(M)  ((M)->top != 0)
2556
2557/* -------------------------- system alloc setup ------------------------- */
2558
2559/* Operations on mflags */
2560
2561#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
2562#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
2563#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
2564
2565#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
2566#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
2567#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
2568
2569#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
2570#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
2571
2572#define set_lock(M,L)\
2573 ((M)->mflags = (L)?\
2574  ((M)->mflags | USE_LOCK_BIT) :\
2575  ((M)->mflags & ~USE_LOCK_BIT))
2576
2577/* page-align a size */
2578#define page_align(S)\
2579 (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE))
2580
2581/* granularity-align a size */
2582#define granularity_align(S)\
2583  (((S) + (mparams.granularity - SIZE_T_ONE))\
2584   & ~(mparams.granularity - SIZE_T_ONE))
2585
2586
2587/* For mmap, use granularity alignment on windows, else page-align */
2588#ifdef WIN32
2589#define mmap_align(S) granularity_align(S)
2590#else
2591#define mmap_align(S) page_align(S)
2592#endif
2593
2594/* For sys_alloc, enough padding to ensure can malloc request on success */
2595#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT)
2596
2597#define is_page_aligned(S)\
2598   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
2599#define is_granularity_aligned(S)\
2600   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
2601
2602/*  True if segment S holds address A */
2603#define segment_holds(S, A)\
2604  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
2605
2606/* Return segment holding given address */
2607static msegmentptr segment_holding(mstate m, char* addr) {
2608  msegmentptr sp = &m->seg;
2609  for (;;) {
2610    if (addr >= sp->base && addr < sp->base + sp->size)
2611      return sp;
2612    if ((sp = sp->next) == 0)
2613      return 0;
2614  }
2615}
2616
2617/* Return true if segment contains a segment link */
2618static int has_segment_link(mstate m, msegmentptr ss) {
2619  msegmentptr sp = &m->seg;
2620  for (;;) {
2621    if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
2622      return 1;
2623    if ((sp = sp->next) == 0)
2624      return 0;
2625  }
2626}
2627
2628#ifndef MORECORE_CANNOT_TRIM
2629#define should_trim(M,s)  ((s) > (M)->trim_check)
2630#else  /* MORECORE_CANNOT_TRIM */
2631#define should_trim(M,s)  (0)
2632#endif /* MORECORE_CANNOT_TRIM */
2633
2634/*
2635  TOP_FOOT_SIZE is padding at the end of a segment, including space
2636  that may be needed to place segment records and fenceposts when new
2637  noncontiguous segments are added.
2638*/
2639#define TOP_FOOT_SIZE\
2640  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
2641
2642
2643/* -------------------------------  Hooks -------------------------------- */
2644
2645/*
2646  PREACTION should be defined to return 0 on success, and nonzero on
2647  failure. If you are not using locking, you can redefine these to do
2648  anything you like.
2649*/
2650
2651#if USE_LOCKS
2652
2653#define PREACTION(M)  ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
2654#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
2655#else /* USE_LOCKS */
2656
2657#ifndef PREACTION
2658#define PREACTION(M) (0)
2659#endif  /* PREACTION */
2660
2661#ifndef POSTACTION
2662#define POSTACTION(M)
2663#endif  /* POSTACTION */
2664
2665#endif /* USE_LOCKS */
2666
2667/*
2668  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
2669  USAGE_ERROR_ACTION is triggered on detected bad frees and
2670  reallocs. The argument p is an address that might have triggered the
2671  fault. It is ignored by the two predefined actions, but might be
2672  useful in custom actions that try to help diagnose errors.
2673*/
2674
2675#if PROCEED_ON_ERROR
2676
2677/* A count of the number of corruption errors causing resets */
2678int malloc_corruption_error_count;
2679
2680/* default corruption action */
2681static void reset_on_error(mstate m);
2682
2683#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
2684#define USAGE_ERROR_ACTION(m, p)
2685
2686#else /* PROCEED_ON_ERROR */
2687
2688#ifndef CORRUPTION_ERROR_ACTION
2689#define CORRUPTION_ERROR_ACTION(m) ABORT
2690#endif /* CORRUPTION_ERROR_ACTION */
2691
2692#ifndef USAGE_ERROR_ACTION
2693#define USAGE_ERROR_ACTION(m,p) ABORT
2694#endif /* USAGE_ERROR_ACTION */
2695
2696#endif /* PROCEED_ON_ERROR */
2697
2698/* -------------------------- Debugging setup ---------------------------- */
2699
2700#if ! DEBUG
2701
2702#define check_free_chunk(M,P)
2703#define check_inuse_chunk(M,P)
2704#define check_malloced_chunk(M,P,N)
2705#define check_mmapped_chunk(M,P)
2706#define check_malloc_state(M)
2707#define check_top_chunk(M,P)
2708
2709#else /* DEBUG */
2710#define check_free_chunk(M,P)       do_check_free_chunk(M,P)
2711#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
2712#define check_top_chunk(M,P)        do_check_top_chunk(M,P)
2713#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
2714#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
2715#define check_malloc_state(M)       do_check_malloc_state(M)
2716
2717static void   do_check_any_chunk(mstate m, mchunkptr p);
2718static void   do_check_top_chunk(mstate m, mchunkptr p);
2719static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
2720static void   do_check_inuse_chunk(mstate m, mchunkptr p);
2721static void   do_check_free_chunk(mstate m, mchunkptr p);
2722static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
2723static void   do_check_tree(mstate m, tchunkptr t);
2724static void   do_check_treebin(mstate m, bindex_t i);
2725static void   do_check_smallbin(mstate m, bindex_t i);
2726static void   do_check_malloc_state(mstate m);
2727static int    bin_find(mstate m, mchunkptr x);
2728static size_t traverse_and_check(mstate m);
2729#endif /* DEBUG */
2730
2731/* ---------------------------- Indexing Bins ---------------------------- */
2732
2733#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
2734#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)
2735#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
2736#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
2737
2738/* addressing by index. See above about smallbin repositioning */
2739#define smallbin_at(M, i)   ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
2740#define treebin_at(M,i)     (&((M)->treebins[i]))
2741
2742/* assign tree index for size S to variable I. Use x86 asm if possible  */
2743#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
2744#define compute_tree_index(S, I)\
2745{\
2746  unsigned int X = S >> TREEBIN_SHIFT;\
2747  if (X == 0)\
2748    I = 0;\
2749  else if (X > 0xFFFF)\
2750    I = NTREEBINS-1;\
2751  else {\
2752    unsigned int K;\
2753    __asm__("bsrl\t%1, %0\n\t" : "=r" (K) : "rm"  (X));\
2754    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
2755  }\
2756}
2757
2758#elif defined (__INTEL_COMPILER)
2759#define compute_tree_index(S, I)\
2760{\
2761  size_t X = S >> TREEBIN_SHIFT;\
2762  if (X == 0)\
2763    I = 0;\
2764  else if (X > 0xFFFF)\
2765    I = NTREEBINS-1;\
2766  else {\
2767    unsigned int K = _bit_scan_reverse (X); \
2768    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
2769  }\
2770}
2771
2772#elif defined(_MSC_VER) && _MSC_VER>=1300
2773#define compute_tree_index(S, I)\
2774{\
2775  size_t X = S >> TREEBIN_SHIFT;\
2776  if (X == 0)\
2777    I = 0;\
2778  else if (X > 0xFFFF)\
2779    I = NTREEBINS-1;\
2780  else {\
2781    unsigned int K;\
2782    _BitScanReverse((DWORD *) &K, X);\
2783    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
2784  }\
2785}
2786
2787#else /* GNUC */
2788#define compute_tree_index(S, I)\
2789{\
2790  size_t X = S >> TREEBIN_SHIFT;\
2791  if (X == 0)\
2792    I = 0;\
2793  else if (X > 0xFFFF)\
2794    I = NTREEBINS-1;\
2795  else {\
2796    unsigned int Y = (unsigned int)X;\
2797    unsigned int N = ((Y - 0x100) >> 16) & 8;\
2798    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
2799    N += K;\
2800    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
2801    K = 14 - N + ((Y <<= K) >> 15);\
2802    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
2803  }\
2804}
2805#endif /* GNUC */
2806
2807/* Bit representing maximum resolved size in a treebin at i */
2808#define bit_for_tree_index(i) \
2809   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
2810
2811/* Shift placing maximum resolved bit in a treebin at i as sign bit */
2812#define leftshift_for_tree_index(i) \
2813   ((i == NTREEBINS-1)? 0 : \
2814    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
2815
2816/* The size of the smallest chunk held in bin with index i */
2817#define minsize_for_tree_index(i) \
2818   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \
2819   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
2820
2821
2822/* ------------------------ Operations on bin maps ----------------------- */
2823
2824/* bit corresponding to given index */
2825#define idx2bit(i)              ((binmap_t)(1) << (i))
2826
2827/* Mark/Clear bits with given index */
2828#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
2829#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
2830#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
2831
2832#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
2833#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
2834#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
2835
2836/* isolate the least set bit of a bitmap */
2837#define least_bit(x)         ((x) & -(x))
2838
2839/* mask with all bits to left of least bit of x on */
2840#define left_bits(x)         ((x<<1) | -(x<<1))
2841
2842/* mask with all bits to left of or equal to least bit of x on */
2843#define same_or_left_bits(x) ((x) | -(x))
2844
2845/* index corresponding to given bit. Use x86 asm if possible */
2846
2847#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
2848#define compute_bit2idx(X, I)\
2849{\
2850  unsigned int J;\
2851  __asm__("bsfl\t%1, %0\n\t" : "=r" (J) : "rm" (X));\
2852  I = (bindex_t)J;\
2853}
2854
2855#elif defined (__INTEL_COMPILER)
2856#define compute_bit2idx(X, I)\
2857{\
2858  unsigned int J;\
2859  J = _bit_scan_forward (X); \
2860  I = (bindex_t)J;\
2861}
2862
2863#elif defined(_MSC_VER) && _MSC_VER>=1300
2864#define compute_bit2idx(X, I)\
2865{\
2866  unsigned int J;\
2867  _BitScanForward((DWORD *) &J, X);\
2868  I = (bindex_t)J;\
2869}
2870
2871#elif USE_BUILTIN_FFS
2872#define compute_bit2idx(X, I) I = ffs(X)-1
2873
2874#else
2875#define compute_bit2idx(X, I)\
2876{\
2877  unsigned int Y = X - 1;\
2878  unsigned int K = Y >> (16-4) & 16;\
2879  unsigned int N = K;        Y >>= K;\
2880  N += K = Y >> (8-3) &  8;  Y >>= K;\
2881  N += K = Y >> (4-2) &  4;  Y >>= K;\
2882  N += K = Y >> (2-1) &  2;  Y >>= K;\
2883  N += K = Y >> (1-0) &  1;  Y >>= K;\
2884  I = (bindex_t)(N + Y);\
2885}
2886#endif /* GNUC */
2887
2888
2889/* ----------------------- Runtime Check Support ------------------------- */
2890
2891/*
2892  For security, the main invariant is that malloc/free/etc never
2893  writes to a static address other than malloc_state, unless static
2894  malloc_state itself has been corrupted, which cannot occur via
2895  malloc (because of these checks). In essence this means that we
2896  believe all pointers, sizes, maps etc held in malloc_state, but
2897  check all of those linked or offsetted from other embedded data
2898  structures.  These checks are interspersed with main code in a way
2899  that tends to minimize their run-time cost.
2900
2901  When FOOTERS is defined, in addition to range checking, we also
2902  verify footer fields of inuse chunks, which can be used guarantee
2903  that the mstate controlling malloc/free is intact.  This is a
2904  streamlined version of the approach described by William Robertson
2905  et al in "Run-time Detection of Heap-based Overflows" LISA'03
2906  http://www.usenix.org/events/lisa03/tech/robertson.html The footer
2907  of an inuse chunk holds the xor of its mstate and a random seed,
2908  that is checked upon calls to free() and realloc().  This is
2909  (probablistically) unguessable from outside the program, but can be
2910  computed by any code successfully malloc'ing any chunk, so does not
2911  itself provide protection against code that has already broken
2912  security through some other means.  Unlike Robertson et al, we
2913  always dynamically check addresses of all offset chunks (previous,
2914  next, etc). This turns out to be cheaper than relying on hashes.
2915*/
2916
2917#if !INSECURE
2918/* Check if address a is at least as high as any from MORECORE or MMAP */
2919#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
2920/* Check if address of next chunk n is higher than base chunk p */
2921#define ok_next(p, n)    ((char*)(p) < (char*)(n))
2922/* Check if p has its cinuse bit on */
2923#define ok_cinuse(p)     cinuse(p)
2924/* Check if p has its pinuse bit on */
2925#define ok_pinuse(p)     pinuse(p)
2926
2927#else /* !INSECURE */
2928#define ok_address(M, a) (1)
2929#define ok_next(b, n)    (1)
2930#define ok_cinuse(p)     (1)
2931#define ok_pinuse(p)     (1)
2932#endif /* !INSECURE */
2933
2934#if (FOOTERS && !INSECURE)
2935/* Check if (alleged) mstate m has expected magic field */
2936#define ok_magic(M)      ((M)->magic == mparams.magic)
2937#else  /* (FOOTERS && !INSECURE) */
2938#define ok_magic(M)      (1)
2939#endif /* (FOOTERS && !INSECURE) */
2940
2941
2942/* In gcc, use __builtin_expect to minimize impact of checks */
2943#if !INSECURE
2944#if defined(__GNUC__) && __GNUC__ >= 3
2945#define RTCHECK(e)  __builtin_expect(e, 1)
2946#else /* GNUC */
2947#define RTCHECK(e)  (e)
2948#endif /* GNUC */
2949#else /* !INSECURE */
2950#define RTCHECK(e)  (1)
2951#endif /* !INSECURE */
2952
2953/* macros to set up inuse chunks with or without footers */
2954
2955#if !FOOTERS
2956
2957#define mark_inuse_foot(M,p,s)
2958
2959/* Set cinuse bit and pinuse bit of next chunk */
2960#define set_inuse(M,p,s)\
2961  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
2962  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
2963
2964/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
2965#define set_inuse_and_pinuse(M,p,s)\
2966  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
2967  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
2968
2969/* Set size, cinuse and pinuse bit of this chunk */
2970#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
2971  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
2972
2973#else /* FOOTERS */
2974
2975/* Set foot of inuse chunk to be xor of mstate and seed */
2976#define mark_inuse_foot(M,p,s)\
2977  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
2978
2979#define get_mstate_for(p)\
2980  ((mstate)(((mchunkptr)((char*)(p) +\
2981    (chunksize(p))))->prev_foot ^ mparams.magic))
2982
2983#define set_inuse(M,p,s)\
2984  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
2985  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
2986  mark_inuse_foot(M,p,s))
2987
2988#define set_inuse_and_pinuse(M,p,s)\
2989  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
2990  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
2991 mark_inuse_foot(M,p,s))
2992
2993#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
2994  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
2995  mark_inuse_foot(M, p, s))
2996
2997#endif /* !FOOTERS */
2998
2999/* ---------------------------- setting mparams -------------------------- */
3000
3001/* Initialize mparams */
3002static int init_mparams(void) {
3003#ifdef NEED_GLOBAL_LOCK_INIT
3004  if (malloc_global_mutex_status <= 0)
3005    init_malloc_global_mutex();
3006#endif
3007
3008  ACQUIRE_MALLOC_GLOBAL_LOCK();
3009  if (mparams.magic == 0) {
3010    size_t magic;
3011    size_t psize;
3012    size_t gsize;
3013
3014#ifndef WIN32
3015    psize = malloc_getpagesize;
3016    gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize);
3017#else /* WIN32 */
3018    {
3019      SYSTEM_INFO system_info;
3020      GetSystemInfo(&system_info);
3021      psize = system_info.dwPageSize;
3022      gsize = ((DEFAULT_GRANULARITY != 0)?
3023               DEFAULT_GRANULARITY : system_info.dwAllocationGranularity);
3024    }
3025#endif /* WIN32 */
3026
3027    /* Sanity-check configuration:
3028       size_t must be unsigned and as wide as pointer type.
3029       ints must be at least 4 bytes.
3030       alignment must be at least 8.
3031       Alignment, min chunk size, and page size must all be powers of 2.
3032    */
3033    if ((sizeof(size_t) != sizeof(char*)) ||
3034        (MAX_SIZE_T < MIN_CHUNK_SIZE)  ||
3035        (sizeof(int) < 4)  ||
3036        (MALLOC_ALIGNMENT < (size_t)8U) ||
3037        ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) ||
3038        ((MCHUNK_SIZE      & (MCHUNK_SIZE-SIZE_T_ONE))      != 0) ||
3039        ((gsize            & (gsize-SIZE_T_ONE))            != 0) ||
3040        ((psize            & (psize-SIZE_T_ONE))            != 0))
3041      ABORT;
3042
3043    mparams.granularity = gsize;
3044    mparams.page_size = psize;
3045    mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
3046    mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
3047#if MORECORE_CONTIGUOUS
3048    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
3049#else  /* MORECORE_CONTIGUOUS */
3050    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
3051#endif /* MORECORE_CONTIGUOUS */
3052
3053#if !ONLY_MSPACES
3054    /* Set up lock for main malloc area */
3055    gm->mflags = mparams.default_mflags;
3056    INITIAL_LOCK(&gm->mutex);
3057#endif
3058
3059#if (FOOTERS && !INSECURE)
3060    {
3061#if USE_DEV_RANDOM
3062      int fd;
3063      unsigned char buf[sizeof(size_t)];
3064      /* Try to use /dev/urandom, else fall back on using time */
3065      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
3066          read(fd, buf, sizeof(buf)) == sizeof(buf)) {
3067        magic = *((size_t *) buf);
3068        close(fd);
3069      }
3070      else
3071#endif /* USE_DEV_RANDOM */
3072#ifdef WIN32
3073        magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U);
3074#else
3075      magic = (size_t)(time(0) ^ (size_t)0x55555555U);
3076#endif
3077      magic |= (size_t)8U;    /* ensure nonzero */
3078      magic &= ~(size_t)7U;   /* improve chances of fault for bad values */
3079    }
3080#else /* (FOOTERS && !INSECURE) */
3081    magic = (size_t)0x58585858U;
3082#endif /* (FOOTERS && !INSECURE) */
3083
3084    mparams.magic = magic;
3085  }
3086
3087  RELEASE_MALLOC_GLOBAL_LOCK();
3088  return 1;
3089}
3090
3091/* support for mallopt */
3092static int change_mparam(int param_number, int value) {
3093  size_t val = (value == -1)? MAX_SIZE_T : (size_t)value;
3094  ensure_initialization();
3095  switch(param_number) {
3096  case M_TRIM_THRESHOLD:
3097    mparams.trim_threshold = val;
3098    return 1;
3099  case M_GRANULARITY:
3100    if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
3101      mparams.granularity = val;
3102      return 1;
3103    }
3104    else
3105      return 0;
3106  case M_MMAP_THRESHOLD:
3107    mparams.mmap_threshold = val;
3108    return 1;
3109  default:
3110    return 0;
3111  }
3112}
3113
3114#if DEBUG
3115/* ------------------------- Debugging Support --------------------------- */
3116
3117/* Check properties of any chunk, whether free, inuse, mmapped etc  */
3118static void do_check_any_chunk(mstate m, mchunkptr p) {
3119  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
3120  assert(ok_address(m, p));
3121}
3122
3123/* Check properties of top chunk */
3124static void do_check_top_chunk(mstate m, mchunkptr p) {
3125  msegmentptr sp = segment_holding(m, (char*)p);
3126  size_t  sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */
3127  assert(sp != 0);
3128  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
3129  assert(ok_address(m, p));
3130  assert(sz == m->topsize);
3131  assert(sz > 0);
3132  assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
3133  assert(pinuse(p));
3134  assert(!pinuse(chunk_plus_offset(p, sz)));
3135}
3136
3137/* Check properties of (inuse) mmapped chunks */
3138static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
3139  size_t  sz = chunksize(p);
3140  size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD);
3141  assert(is_mmapped(p));
3142  assert(use_mmap(m));
3143  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
3144  assert(ok_address(m, p));
3145  assert(!is_small(sz));
3146  assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
3147  assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
3148  assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
3149}
3150
3151/* Check properties of inuse chunks */
3152static void do_check_inuse_chunk(mstate m, mchunkptr p) {
3153  do_check_any_chunk(m, p);
3154  assert(cinuse(p));
3155  assert(next_pinuse(p));
3156  /* If not pinuse and not mmapped, previous chunk has OK offset */
3157  assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
3158  if (is_mmapped(p))
3159    do_check_mmapped_chunk(m, p);
3160}
3161
3162/* Check properties of free chunks */
3163static void do_check_free_chunk(mstate m, mchunkptr p) {
3164  size_t sz = chunksize(p);
3165  mchunkptr next = chunk_plus_offset(p, sz);
3166  do_check_any_chunk(m, p);
3167  assert(!cinuse(p));
3168  assert(!next_pinuse(p));
3169  assert (!is_mmapped(p));
3170  if (p != m->dv && p != m->top) {
3171    if (sz >= MIN_CHUNK_SIZE) {
3172      assert((sz & CHUNK_ALIGN_MASK) == 0);
3173      assert(is_aligned(chunk2mem(p)));
3174      assert(next->prev_foot == sz);
3175      assert(pinuse(p));
3176      assert (next == m->top || cinuse(next));
3177      assert(p->fd->bk == p);
3178      assert(p->bk->fd == p);
3179    }
3180    else  /* markers are always of size SIZE_T_SIZE */
3181      assert(sz == SIZE_T_SIZE);
3182  }
3183}
3184
3185/* Check properties of malloced chunks at the point they are malloced */
3186static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
3187  if (mem != 0) {
3188    mchunkptr p = mem2chunk(mem);
3189    size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
3190    do_check_inuse_chunk(m, p);
3191    assert((sz & CHUNK_ALIGN_MASK) == 0);
3192    assert(sz >= MIN_CHUNK_SIZE);
3193    assert(sz >= s);
3194    /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
3195    assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
3196  }
3197}
3198
3199/* Check a tree and its subtrees.  */
3200static void do_check_tree(mstate m, tchunkptr t) {
3201  tchunkptr head = 0;
3202  tchunkptr u = t;
3203  bindex_t tindex = t->index;
3204  size_t tsize = chunksize(t);
3205  bindex_t idx;
3206  compute_tree_index(tsize, idx);
3207  assert(tindex == idx);
3208  assert(tsize >= MIN_LARGE_SIZE);
3209  assert(tsize >= minsize_for_tree_index(idx));
3210  assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
3211
3212  do { /* traverse through chain of same-sized nodes */
3213    do_check_any_chunk(m, ((mchunkptr)u));
3214    assert(u->index == tindex);
3215    assert(chunksize(u) == tsize);
3216    assert(!cinuse(u));
3217    assert(!next_pinuse(u));
3218    assert(u->fd->bk == u);
3219    assert(u->bk->fd == u);
3220    if (u->parent == 0) {
3221      assert(u->child[0] == 0);
3222      assert(u->child[1] == 0);
3223    }
3224    else {
3225      assert(head == 0); /* only one node on chain has parent */
3226      head = u;
3227      assert(u->parent != u);
3228      assert (u->parent->child[0] == u ||
3229              u->parent->child[1] == u ||
3230              *((tbinptr*)(u->parent)) == u);
3231      if (u->child[0] != 0) {
3232        assert(u->child[0]->parent == u);
3233        assert(u->child[0] != u);
3234        do_check_tree(m, u->child[0]);
3235      }
3236      if (u->child[1] != 0) {
3237        assert(u->child[1]->parent == u);
3238        assert(u->child[1] != u);
3239        do_check_tree(m, u->child[1]);
3240      }
3241      if (u->child[0] != 0 && u->child[1] != 0) {
3242        assert(chunksize(u->child[0]) < chunksize(u->child[1]));
3243      }
3244    }
3245    u = u->fd;
3246  } while (u != t);
3247  assert(head != 0);
3248}
3249
3250/*  Check all the chunks in a treebin.  */
3251static void do_check_treebin(mstate m, bindex_t i) {
3252  tbinptr* tb = treebin_at(m, i);
3253  tchunkptr t = *tb;
3254  int empty = (m->treemap & (1U << i)) == 0;
3255  if (t == 0)
3256    assert(empty);
3257  if (!empty)
3258    do_check_tree(m, t);
3259}
3260
3261/*  Check all the chunks in a smallbin.  */
3262static void do_check_smallbin(mstate m, bindex_t i) {
3263  sbinptr b = smallbin_at(m, i);
3264  mchunkptr p = b->bk;
3265  unsigned int empty = (m->smallmap & (1U << i)) == 0;
3266  if (p == b)
3267    assert(empty);
3268  if (!empty) {
3269    for (; p != b; p = p->bk) {
3270      size_t size = chunksize(p);
3271      mchunkptr q;
3272      /* each chunk claims to be free */
3273      do_check_free_chunk(m, p);
3274      /* chunk belongs in bin */
3275      assert(small_index(size) == i);
3276      assert(p->bk == b || chunksize(p->bk) == chunksize(p));
3277      /* chunk is followed by an inuse chunk */
3278      q = next_chunk(p);
3279      if (q->head != FENCEPOST_HEAD)
3280        do_check_inuse_chunk(m, q);
3281    }
3282  }
3283}
3284
3285/* Find x in a bin. Used in other check functions. */
3286static int bin_find(mstate m, mchunkptr x) {
3287  size_t size = chunksize(x);
3288  if (is_small(size)) {
3289    bindex_t sidx = small_index(size);
3290    sbinptr b = smallbin_at(m, sidx);
3291    if (smallmap_is_marked(m, sidx)) {
3292      mchunkptr p = b;
3293      do {
3294        if (p == x)
3295          return 1;
3296      } while ((p = p->fd) != b);
3297    }
3298  }
3299  else {
3300    bindex_t tidx;
3301    compute_tree_index(size, tidx);
3302    if (treemap_is_marked(m, tidx)) {
3303      tchunkptr t = *treebin_at(m, tidx);
3304      size_t sizebits = size << leftshift_for_tree_index(tidx);
3305      while (t != 0 && chunksize(t) != size) {
3306        t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
3307        sizebits <<= 1;
3308      }
3309      if (t != 0) {
3310        tchunkptr u = t;
3311        do {
3312          if (u == (tchunkptr)x)
3313            return 1;
3314        } while ((u = u->fd) != t);
3315      }
3316    }
3317  }
3318  return 0;
3319}
3320
3321/* Traverse each chunk and check it; return total */
3322static size_t traverse_and_check(mstate m) {
3323  size_t sum = 0;
3324  if (is_initialized(m)) {
3325    msegmentptr s = &m->seg;
3326    sum += m->topsize + TOP_FOOT_SIZE;
3327    while (s != 0) {
3328      mchunkptr q = align_as_chunk(s->base);
3329      mchunkptr lastq = 0;
3330      assert(pinuse(q));
3331      while (segment_holds(s, q) &&
3332             q != m->top && q->head != FENCEPOST_HEAD) {
3333        sum += chunksize(q);
3334        if (cinuse(q)) {
3335          assert(!bin_find(m, q));
3336          do_check_inuse_chunk(m, q);
3337        }
3338        else {
3339          assert(q == m->dv || bin_find(m, q));
3340          assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */
3341          do_check_free_chunk(m, q);
3342        }
3343        lastq = q;
3344        q = next_chunk(q);
3345      }
3346      s = s->next;
3347    }
3348  }
3349  return sum;
3350}
3351
3352/* Check all properties of malloc_state. */
3353static void do_check_malloc_state(mstate m) {
3354  bindex_t i;
3355  size_t total;
3356  /* check bins */
3357  for (i = 0; i < NSMALLBINS; ++i)
3358    do_check_smallbin(m, i);
3359  for (i = 0; i < NTREEBINS; ++i)
3360    do_check_treebin(m, i);
3361
3362  if (m->dvsize != 0) { /* check dv chunk */
3363    do_check_any_chunk(m, m->dv);
3364    assert(m->dvsize == chunksize(m->dv));
3365    assert(m->dvsize >= MIN_CHUNK_SIZE);
3366    assert(bin_find(m, m->dv) == 0);
3367  }
3368
3369  if (m->top != 0) {   /* check top chunk */
3370    do_check_top_chunk(m, m->top);
3371    /*assert(m->topsize == chunksize(m->top)); redundant */
3372    assert(m->topsize > 0);
3373    assert(bin_find(m, m->top) == 0);
3374  }
3375
3376  total = traverse_and_check(m);
3377  assert(total <= m->footprint);
3378  assert(m->footprint <= m->max_footprint);
3379}
3380#endif /* DEBUG */
3381
3382/* ----------------------------- statistics ------------------------------ */
3383
3384#if !NO_MALLINFO
3385static struct mallinfo internal_mallinfo(mstate m) {
3386  struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
3387  ensure_initialization();
3388  if (!PREACTION(m)) {
3389    check_malloc_state(m);
3390    if (is_initialized(m)) {
3391      size_t nfree = SIZE_T_ONE; /* top always free */
3392      size_t mfree = m->topsize + TOP_FOOT_SIZE;
3393      size_t sum = mfree;
3394      msegmentptr s = &m->seg;
3395      while (s != 0) {
3396        mchunkptr q = align_as_chunk(s->base);
3397        while (segment_holds(s, q) &&
3398               q != m->top && q->head != FENCEPOST_HEAD) {
3399          size_t sz = chunksize(q);
3400          sum += sz;
3401          if (!cinuse(q)) {
3402            mfree += sz;
3403            ++nfree;
3404          }
3405          q = next_chunk(q);
3406        }
3407        s = s->next;
3408      }
3409
3410      nm.arena    = sum;
3411      nm.ordblks  = nfree;
3412      nm.hblkhd   = m->footprint - sum;
3413      nm.usmblks  = m->max_footprint;
3414      nm.uordblks = m->footprint - mfree;
3415      nm.fordblks = mfree;
3416      nm.keepcost = m->topsize;
3417    }
3418
3419    POSTACTION(m);
3420  }
3421  return nm;
3422}
3423#endif /* !NO_MALLINFO */
3424
3425static void internal_malloc_stats(mstate m) {
3426  ensure_initialization();
3427  if (!PREACTION(m)) {
3428    size_t maxfp = 0;
3429    size_t fp = 0;
3430    size_t used = 0;
3431    check_malloc_state(m);
3432    if (is_initialized(m)) {
3433      msegmentptr s = &m->seg;
3434      maxfp = m->max_footprint;
3435      fp = m->footprint;
3436      used = fp - (m->topsize + TOP_FOOT_SIZE);
3437
3438      while (s != 0) {
3439        mchunkptr q = align_as_chunk(s->base);
3440        while (segment_holds(s, q) &&
3441               q != m->top && q->head != FENCEPOST_HEAD) {
3442          if (!cinuse(q))
3443            used -= chunksize(q);
3444          q = next_chunk(q);
3445        }
3446        s = s->next;
3447      }
3448    }
3449
3450    fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
3451    fprintf(stderr, "system bytes     = %10lu\n", (unsigned long)(fp));
3452    fprintf(stderr, "in use bytes     = %10lu\n", (unsigned long)(used));
3453
3454    POSTACTION(m);
3455  }
3456}
3457
3458/* ----------------------- Operations on smallbins ----------------------- */
3459
3460/*
3461  Various forms of linking and unlinking are defined as macros.  Even
3462  the ones for trees, which are very long but have very short typical
3463  paths.  This is ugly but reduces reliance on inlining support of
3464  compilers.
3465*/
3466
3467/* Link a free chunk into a smallbin  */
3468#define insert_small_chunk(M, P, S) {\
3469  bindex_t I  = small_index(S);\
3470  mchunkptr B = smallbin_at(M, I);\
3471  mchunkptr F = B;\
3472  assert(S >= MIN_CHUNK_SIZE);\
3473  if (!smallmap_is_marked(M, I))\
3474    mark_smallmap(M, I);\
3475  else if (RTCHECK(ok_address(M, B->fd)))\
3476    F = B->fd;\
3477  else {\
3478    CORRUPTION_ERROR_ACTION(M);\
3479  }\
3480  B->fd = P;\
3481  F->bk = P;\
3482  P->fd = F;\
3483  P->bk = B;\
3484}
3485
3486/* Unlink a chunk from a smallbin  */
3487#define unlink_small_chunk(M, P, S) {\
3488  mchunkptr F = P->fd;\
3489  mchunkptr B = P->bk;\
3490  bindex_t I = small_index(S);\
3491  assert(P != B);\
3492  assert(P != F);\
3493  assert(chunksize(P) == small_index2size(I));\
3494  if (F == B)\
3495    clear_smallmap(M, I);\
3496  else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\
3497                   (B == smallbin_at(M,I) || ok_address(M, B)))) {\
3498    F->bk = B;\
3499    B->fd = F;\
3500  }\
3501  else {\
3502    CORRUPTION_ERROR_ACTION(M);\
3503  }\
3504}
3505
3506/* Unlink the first chunk from a smallbin */
3507#define unlink_first_small_chunk(M, B, P, I) {\
3508  mchunkptr F = P->fd;\
3509  assert(P != B);\
3510  assert(P != F);\
3511  assert(chunksize(P) == small_index2size(I));\
3512  if (B == F)\
3513    clear_smallmap(M, I);\
3514  else if (RTCHECK(ok_address(M, F))) {\
3515    B->fd = F;\
3516    F->bk = B;\
3517  }\
3518  else {\
3519    CORRUPTION_ERROR_ACTION(M);\
3520  }\
3521}
3522
3523
3524
3525/* Replace dv node, binning the old one */
3526/* Used only when dvsize known to be small */
3527#define replace_dv(M, P, S) {\
3528  size_t DVS = M->dvsize;\
3529  if (DVS != 0) {\
3530    mchunkptr DV = M->dv;\
3531    assert(is_small(DVS));\
3532    insert_small_chunk(M, DV, DVS);\
3533  }\
3534  M->dvsize = S;\
3535  M->dv = P;\
3536}
3537
3538/* ------------------------- Operations on trees ------------------------- */
3539
3540/* Insert chunk into tree */
3541#define insert_large_chunk(M, X, S) {\
3542  tbinptr* H;\
3543  bindex_t I;\
3544  compute_tree_index(S, I);\
3545  H = treebin_at(M, I);\
3546  X->index = I;\
3547  X->child[0] = X->child[1] = 0;\
3548  if (!treemap_is_marked(M, I)) {\
3549    mark_treemap(M, I);\
3550    *H = X;\
3551    X->parent = (tchunkptr)H;\
3552    X->fd = X->bk = X;\
3553  }\
3554  else {\
3555    tchunkptr T = *H;\
3556    size_t K = S << leftshift_for_tree_index(I);\
3557    for (;;) {\
3558      if (chunksize(T) != S) {\
3559        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
3560        K <<= 1;\
3561        if (*C != 0)\
3562          T = *C;\
3563        else if (RTCHECK(ok_address(M, C))) {\
3564          *C = X;\
3565          X->parent = T;\
3566          X->fd = X->bk = X;\
3567          break;\
3568        }\
3569        else {\
3570          CORRUPTION_ERROR_ACTION(M);\
3571          break;\
3572        }\
3573      }\
3574      else {\
3575        tchunkptr F = T->fd;\
3576        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
3577          T->fd = F->bk = X;\
3578          X->fd = F;\
3579          X->bk = T;\
3580          X->parent = 0;\
3581          break;\
3582        }\
3583        else {\
3584          CORRUPTION_ERROR_ACTION(M);\
3585          break;\
3586        }\
3587      }\
3588    }\
3589  }\
3590}
3591
3592/*
3593  Unlink steps:
3594
3595  1. If x is a chained node, unlink it from its same-sized fd/bk links
3596     and choose its bk node as its replacement.
3597  2. If x was the last node of its size, but not a leaf node, it must
3598     be replaced with a leaf node (not merely one with an open left or
3599     right), to make sure that lefts and rights of descendents
3600     correspond properly to bit masks.  We use the rightmost descendent
3601     of x.  We could use any other leaf, but this is easy to locate and
3602     tends to counteract removal of leftmosts elsewhere, and so keeps
3603     paths shorter than minimally guaranteed.  This doesn't loop much
3604     because on average a node in a tree is near the bottom.
3605  3. If x is the base of a chain (i.e., has parent links) relink
3606     x's parent and children to x's replacement (or null if none).
3607*/
3608
3609#define unlink_large_chunk(M, X) {\
3610  tchunkptr XP = X->parent;\
3611  tchunkptr R;\
3612  if (X->bk != X) {\
3613    tchunkptr F = X->fd;\
3614    R = X->bk;\
3615    if (RTCHECK(ok_address(M, F))) {\
3616      F->bk = R;\
3617      R->fd = F;\
3618    }\
3619    else {\
3620      CORRUPTION_ERROR_ACTION(M);\
3621    }\
3622  }\
3623  else {\
3624    tchunkptr* RP;\
3625    if (((R = *(RP = &(X->child[1]))) != 0) ||\
3626        ((R = *(RP = &(X->child[0]))) != 0)) {\
3627      tchunkptr* CP;\
3628      while ((*(CP = &(R->child[1])) != 0) ||\
3629             (*(CP = &(R->child[0])) != 0)) {\
3630        R = *(RP = CP);\
3631      }\
3632      if (RTCHECK(ok_address(M, RP)))\
3633        *RP = 0;\
3634      else {\
3635        CORRUPTION_ERROR_ACTION(M);\
3636      }\
3637    }\
3638  }\
3639  if (XP != 0) {\
3640    tbinptr* H = treebin_at(M, X->index);\
3641    if (X == *H) {\
3642      if ((*H = R) == 0) \
3643        clear_treemap(M, X->index);\
3644    }\
3645    else if (RTCHECK(ok_address(M, XP))) {\
3646      if (XP->child[0] == X) \
3647        XP->child[0] = R;\
3648      else \
3649        XP->child[1] = R;\
3650    }\
3651    else\
3652      CORRUPTION_ERROR_ACTION(M);\
3653    if (R != 0) {\
3654      if (RTCHECK(ok_address(M, R))) {\
3655        tchunkptr C0, C1;\
3656        R->parent = XP;\
3657        if ((C0 = X->child[0]) != 0) {\
3658          if (RTCHECK(ok_address(M, C0))) {\
3659            R->child[0] = C0;\
3660            C0->parent = R;\
3661          }\
3662          else\
3663            CORRUPTION_ERROR_ACTION(M);\
3664        }\
3665        if ((C1 = X->child[1]) != 0) {\
3666          if (RTCHECK(ok_address(M, C1))) {\
3667            R->child[1] = C1;\
3668            C1->parent = R;\
3669          }\
3670          else\
3671            CORRUPTION_ERROR_ACTION(M);\
3672        }\
3673      }\
3674      else\
3675        CORRUPTION_ERROR_ACTION(M);\
3676    }\
3677  }\
3678}
3679
3680/* Relays to large vs small bin operations */
3681
3682#define insert_chunk(M, P, S)\
3683  if (is_small(S)) insert_small_chunk(M, P, S)\
3684  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
3685
3686#define unlink_chunk(M, P, S)\
3687  if (is_small(S)) unlink_small_chunk(M, P, S)\
3688  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
3689
3690
3691/* Relays to internal calls to malloc/free from realloc, memalign etc */
3692
3693#if ONLY_MSPACES
3694#define internal_malloc(m, b) mspace_malloc(m, b)
3695#define internal_free(m, mem) mspace_free(m,mem);
3696#else /* ONLY_MSPACES */
3697#if MSPACES
3698#define internal_malloc(m, b)\
3699   (m == gm)? dlmalloc(b) : mspace_malloc(m, b)
3700#define internal_free(m, mem)\
3701   if (m == gm) dlfree(mem); else mspace_free(m,mem);
3702#else /* MSPACES */
3703#define internal_malloc(m, b) dlmalloc(b)
3704#define internal_free(m, mem) dlfree(mem)
3705#endif /* MSPACES */
3706#endif /* ONLY_MSPACES */
3707
3708/* -----------------------  Direct-mmapping chunks ----------------------- */
3709
3710/*
3711  Directly mmapped chunks are set up with an offset to the start of
3712  the mmapped region stored in the prev_foot field of the chunk. This
3713  allows reconstruction of the required argument to MUNMAP when freed,
3714  and also allows adjustment of the returned chunk to meet alignment
3715  requirements (especially in memalign).  There is also enough space
3716  allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain
3717  the PINUSE bit so frees can be checked.
3718*/
3719
3720/* Malloc using mmap */
3721static void* mmap_alloc(mstate m, size_t nb) {
3722  size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
3723  if (mmsize > nb) {     /* Check for wrap around 0 */
3724    char* mm = (char*)(CALL_DIRECT_MMAP(mmsize));
3725    if (mm != CMFAIL) {
3726      size_t offset = align_offset(chunk2mem(mm));
3727      size_t psize = mmsize - offset - MMAP_FOOT_PAD;
3728      mchunkptr p = (mchunkptr)(mm + offset);
3729      p->prev_foot = offset | IS_MMAPPED_BIT;
3730      (p)->head = (psize|CINUSE_BIT);
3731      mark_inuse_foot(m, p, psize);
3732      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
3733      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
3734
3735      if (mm < m->least_addr)
3736        m->least_addr = mm;
3737      if ((m->footprint += mmsize) > m->max_footprint)
3738        m->max_footprint = m->footprint;
3739      assert(is_aligned(chunk2mem(p)));
3740      check_mmapped_chunk(m, p);
3741      return chunk2mem(p);
3742    }
3743  }
3744  return 0;
3745}
3746
3747/* Realloc using mmap */
3748static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) {
3749  size_t oldsize = chunksize(oldp);
3750  if (is_small(nb)) /* Can't shrink mmap regions below small size */
3751    return 0;
3752  /* Keep old chunk if big enough but not too big */
3753  if (oldsize >= nb + SIZE_T_SIZE &&
3754      (oldsize - nb) <= (mparams.granularity << 1))
3755    return oldp;
3756  else {
3757    size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT;
3758    size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
3759    size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
3760    char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
3761                                  oldmmsize, newmmsize, 1);
3762    if (cp != CMFAIL) {
3763      mchunkptr newp = (mchunkptr)(cp + offset);
3764      size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
3765      newp->head = (psize|CINUSE_BIT);
3766      mark_inuse_foot(m, newp, psize);
3767      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
3768      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
3769
3770      if (cp < m->least_addr)
3771        m->least_addr = cp;
3772      if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
3773        m->max_footprint = m->footprint;
3774      check_mmapped_chunk(m, newp);
3775      return newp;
3776    }
3777  }
3778  return 0;
3779}
3780
3781/* -------------------------- mspace management -------------------------- */
3782
3783/* Initialize top chunk and its size */
3784static void init_top(mstate m, mchunkptr p, size_t psize) {
3785  /* Ensure alignment */
3786  size_t offset = align_offset(chunk2mem(p));
3787  p = (mchunkptr)((char*)p + offset);
3788  psize -= offset;
3789
3790  m->top = p;
3791  m->topsize = psize;
3792  p->head = psize | PINUSE_BIT;
3793  /* set size of fake trailing chunk holding overhead space only once */
3794  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
3795  m->trim_check = mparams.trim_threshold; /* reset on each update */
3796}
3797
3798/* Initialize bins for a new mstate that is otherwise zeroed out */
3799static void init_bins(mstate m) {
3800  /* Establish circular links for smallbins */
3801  bindex_t i;
3802  for (i = 0; i < NSMALLBINS; ++i) {
3803    sbinptr bin = smallbin_at(m,i);
3804    bin->fd = bin->bk = bin;
3805  }
3806}
3807
3808#if PROCEED_ON_ERROR
3809
3810/* default corruption action */
3811static void reset_on_error(mstate m) {
3812  int i;
3813  ++malloc_corruption_error_count;
3814  /* Reinitialize fields to forget about all memory */
3815  m->smallbins = m->treebins = 0;
3816  m->dvsize = m->topsize = 0;
3817  m->seg.base = 0;
3818  m->seg.size = 0;
3819  m->seg.next = 0;
3820  m->top = m->dv = 0;
3821  for (i = 0; i < NTREEBINS; ++i)
3822    *treebin_at(m, i) = 0;
3823  init_bins(m);
3824}
3825#endif /* PROCEED_ON_ERROR */
3826
3827/* Allocate chunk and prepend remainder with chunk in successor base. */
3828static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
3829                           size_t nb) {
3830  mchunkptr p = align_as_chunk(newbase);
3831  mchunkptr oldfirst = align_as_chunk(oldbase);
3832  size_t psize = (char*)oldfirst - (char*)p;
3833  mchunkptr q = chunk_plus_offset(p, nb);
3834  size_t qsize = psize - nb;
3835  set_size_and_pinuse_of_inuse_chunk(m, p, nb);
3836
3837  assert((char*)oldfirst > (char*)q);
3838  assert(pinuse(oldfirst));
3839  assert(qsize >= MIN_CHUNK_SIZE);
3840
3841  /* consolidate remainder with first chunk of old base */
3842  if (oldfirst == m->top) {
3843    size_t tsize = m->topsize += qsize;
3844    m->top = q;
3845    q->head = tsize | PINUSE_BIT;
3846    check_top_chunk(m, q);
3847  }
3848  else if (oldfirst == m->dv) {
3849    size_t dsize = m->dvsize += qsize;
3850    m->dv = q;
3851    set_size_and_pinuse_of_free_chunk(q, dsize);
3852  }
3853  else {
3854    if (!cinuse(oldfirst)) {
3855      size_t nsize = chunksize(oldfirst);
3856      unlink_chunk(m, oldfirst, nsize);
3857      oldfirst = chunk_plus_offset(oldfirst, nsize);
3858      qsize += nsize;
3859    }
3860    set_free_with_pinuse(q, qsize, oldfirst);
3861    insert_chunk(m, q, qsize);
3862    check_free_chunk(m, q);
3863  }
3864
3865  check_malloced_chunk(m, chunk2mem(p), nb);
3866  return chunk2mem(p);
3867}
3868
3869/* Add a segment to hold a new noncontiguous region */
3870static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
3871  /* Determine locations and sizes of segment, fenceposts, old top */
3872  char* old_top = (char*)m->top;
3873  msegmentptr oldsp = segment_holding(m, old_top);
3874  char* old_end = oldsp->base + oldsp->size;
3875  size_t ssize = pad_request(sizeof(struct malloc_segment));
3876  char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
3877  size_t offset = align_offset(chunk2mem(rawsp));
3878  char* asp = rawsp + offset;
3879  char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
3880  mchunkptr sp = (mchunkptr)csp;
3881  msegmentptr ss = (msegmentptr)(chunk2mem(sp));
3882  mchunkptr tnext = chunk_plus_offset(sp, ssize);
3883  mchunkptr p = tnext;
3884  int nfences = 0;
3885
3886  /* reset top to new space */
3887  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
3888
3889  /* Set up segment record */
3890  assert(is_aligned(ss));
3891  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
3892  *ss = m->seg; /* Push current record */
3893  m->seg.base = tbase;
3894  m->seg.size = tsize;
3895  m->seg.sflags = mmapped;
3896  m->seg.next = ss;
3897
3898  /* Insert trailing fenceposts */
3899  for (;;) {
3900    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
3901    p->head = FENCEPOST_HEAD;
3902    ++nfences;
3903    if ((char*)(&(nextp->head)) < old_end)
3904      p = nextp;
3905    else
3906      break;
3907  }
3908  assert(nfences >= 2);
3909
3910  /* Insert the rest of old top into a bin as an ordinary free chunk */
3911  if (csp != old_top) {
3912    mchunkptr q = (mchunkptr)old_top;
3913    size_t psize = csp - old_top;
3914    mchunkptr tn = chunk_plus_offset(q, psize);
3915    set_free_with_pinuse(q, psize, tn);
3916    insert_chunk(m, q, psize);
3917  }
3918
3919  check_top_chunk(m, m->top);
3920}
3921
3922/* -------------------------- System allocation -------------------------- */
3923
3924/* Get memory from system using MORECORE or MMAP */
3925static void* sys_alloc(mstate m, size_t nb) {
3926  char* tbase = CMFAIL;
3927  size_t tsize = 0;
3928  flag_t mmap_flag = 0;
3929
3930  ensure_initialization();
3931
3932  /* Directly map large chunks */
3933  if (use_mmap(m) && nb >= mparams.mmap_threshold) {
3934    void* mem = mmap_alloc(m, nb);
3935    if (mem != 0)
3936      return mem;
3937  }
3938
3939  /*
3940    Try getting memory in any of three ways (in most-preferred to
3941    least-preferred order):
3942    1. A call to MORECORE that can normally contiguously extend memory.
3943       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
3944       or main space is mmapped or a previous contiguous call failed)
3945    2. A call to MMAP new space (disabled if not HAVE_MMAP).
3946       Note that under the default settings, if MORECORE is unable to
3947       fulfill a request, and HAVE_MMAP is true, then mmap is
3948       used as a noncontiguous system allocator. This is a useful backup
3949       strategy for systems with holes in address spaces -- in this case
3950       sbrk cannot contiguously expand the heap, but mmap may be able to
3951       find space.
3952    3. A call to MORECORE that cannot usually contiguously extend memory.
3953       (disabled if not HAVE_MORECORE)
3954
3955   In all cases, we need to request enough bytes from system to ensure
3956   we can malloc nb bytes upon success, so pad with enough space for
3957   top_foot, plus alignment-pad to make sure we don't lose bytes if
3958   not on boundary, and round this up to a granularity unit.
3959  */
3960
3961  if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
3962    char* br = CMFAIL;
3963    msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
3964    size_t asize = 0;
3965    ACQUIRE_MALLOC_GLOBAL_LOCK();
3966
3967    if (ss == 0) {  /* First time through or recovery */
3968      char* base = (char*)CALL_MORECORE(0);
3969      if (base != CMFAIL) {
3970        asize = granularity_align(nb + SYS_ALLOC_PADDING);
3971        /* Adjust to end on a page boundary */
3972        if (!is_page_aligned(base))
3973          asize += (page_align((size_t)base) - (size_t)base);
3974        /* Can't call MORECORE if size is negative when treated as signed */
3975        if (asize < HALF_MAX_SIZE_T &&
3976            (br = (char*)(CALL_MORECORE(asize))) == base) {
3977          tbase = base;
3978          tsize = asize;
3979        }
3980      }
3981    }
3982    else {
3983      /* Subtract out existing available top space from MORECORE request. */
3984      asize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING);
3985      /* Use mem here only if it did continuously extend old space */
3986      if (asize < HALF_MAX_SIZE_T &&
3987          (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
3988        tbase = br;
3989        tsize = asize;
3990      }
3991    }
3992
3993    if (tbase == CMFAIL) {    /* Cope with partial failure */
3994      if (br != CMFAIL) {    /* Try to use/extend the space we did get */
3995        if (asize < HALF_MAX_SIZE_T &&
3996            asize < nb + SYS_ALLOC_PADDING) {
3997          size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - asize);
3998          if (esize < HALF_MAX_SIZE_T) {
3999            char* end = (char*)CALL_MORECORE(esize);
4000            if (end != CMFAIL)
4001              asize += esize;
4002            else {            /* Can't use; try to release */
4003              (void) CALL_MORECORE(-asize);
4004              br = CMFAIL;
4005            }
4006          }
4007        }
4008      }
4009      if (br != CMFAIL) {    /* Use the space we did get */
4010        tbase = br;
4011        tsize = asize;
4012      }
4013      else
4014        disable_contiguous(m); /* Don't try contiguous path in the future */
4015    }
4016
4017    RELEASE_MALLOC_GLOBAL_LOCK();
4018  }
4019
4020  if (HAVE_MMAP && tbase == CMFAIL) {  /* Try MMAP */
4021    size_t rsize = granularity_align(nb + SYS_ALLOC_PADDING);
4022    if (rsize > nb) { /* Fail if wraps around zero */
4023      char* mp = (char*)(CALL_MMAP(rsize));
4024      if (mp != CMFAIL) {
4025        tbase = mp;
4026        tsize = rsize;
4027        mmap_flag = IS_MMAPPED_BIT;
4028      }
4029    }
4030  }
4031
4032  if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
4033    size_t asize = granularity_align(nb + SYS_ALLOC_PADDING);
4034    if (asize < HALF_MAX_SIZE_T) {
4035      char* br = CMFAIL;
4036      char* end = CMFAIL;
4037      ACQUIRE_MALLOC_GLOBAL_LOCK();
4038      br = (char*)(CALL_MORECORE(asize));
4039      end = (char*)(CALL_MORECORE(0));
4040      RELEASE_MALLOC_GLOBAL_LOCK();
4041      if (br != CMFAIL && end != CMFAIL && br < end) {
4042        size_t ssize = end - br;
4043        if (ssize > nb + TOP_FOOT_SIZE) {
4044          tbase = br;
4045          tsize = ssize;
4046        }
4047      }
4048    }
4049  }
4050
4051  if (tbase != CMFAIL) {
4052
4053    if ((m->footprint += tsize) > m->max_footprint)
4054      m->max_footprint = m->footprint;
4055
4056    if (!is_initialized(m)) { /* first-time initialization */
4057      m->seg.base = m->least_addr = tbase;
4058      m->seg.size = tsize;
4059      m->seg.sflags = mmap_flag;
4060      m->magic = mparams.magic;
4061      m->release_checks = MAX_RELEASE_CHECK_RATE;
4062      init_bins(m);
4063#if !ONLY_MSPACES
4064      if (is_global(m))
4065        init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
4066      else
4067#endif
4068      {
4069        /* Offset top by embedded malloc_state */
4070        mchunkptr mn = next_chunk(mem2chunk(m));
4071        init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
4072      }
4073    }
4074
4075    else {
4076      /* Try to merge with an existing segment */
4077      msegmentptr sp = &m->seg;
4078      /* Only consider most recent segment if traversal suppressed */
4079      while (sp != 0 && tbase != sp->base + sp->size)
4080        sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
4081      if (sp != 0 &&
4082          !is_extern_segment(sp) &&
4083          (sp->sflags & IS_MMAPPED_BIT) == mmap_flag &&
4084          segment_holds(sp, m->top)) { /* append */
4085        sp->size += tsize;
4086        init_top(m, m->top, m->topsize + tsize);
4087      }
4088      else {
4089        if (tbase < m->least_addr)
4090          m->least_addr = tbase;
4091        sp = &m->seg;
4092        while (sp != 0 && sp->base != tbase + tsize)
4093          sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
4094        if (sp != 0 &&
4095            !is_extern_segment(sp) &&
4096            (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) {
4097          char* oldbase = sp->base;
4098          sp->base = tbase;
4099          sp->size += tsize;
4100          return prepend_alloc(m, tbase, oldbase, nb);
4101        }
4102        else
4103          add_segment(m, tbase, tsize, mmap_flag);
4104      }
4105    }
4106
4107    if (nb < m->topsize) { /* Allocate from new or extended top space */
4108      size_t rsize = m->topsize -= nb;
4109      mchunkptr p = m->top;
4110      mchunkptr r = m->top = chunk_plus_offset(p, nb);
4111      r->head = rsize | PINUSE_BIT;
4112      set_size_and_pinuse_of_inuse_chunk(m, p, nb);
4113      check_top_chunk(m, m->top);
4114      check_malloced_chunk(m, chunk2mem(p), nb);
4115      return chunk2mem(p);
4116    }
4117  }
4118
4119  MALLOC_FAILURE_ACTION;
4120  return 0;
4121}
4122
4123/* -----------------------  system deallocation -------------------------- */
4124
4125/* Unmap and unlink any mmapped segments that don't contain used chunks */
4126static size_t release_unused_segments(mstate m) {
4127  size_t released = 0;
4128  int nsegs = 0;
4129  msegmentptr pred = &m->seg;
4130  msegmentptr sp = pred->next;
4131  while (sp != 0) {
4132    char* base = sp->base;
4133    size_t size = sp->size;
4134    msegmentptr next = sp->next;
4135    ++nsegs;
4136    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
4137      mchunkptr p = align_as_chunk(base);
4138      size_t psize = chunksize(p);
4139      /* Can unmap if first chunk holds entire segment and not pinned */
4140      if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
4141        tchunkptr tp = (tchunkptr)p;
4142        assert(segment_holds(sp, (char*)sp));
4143        if (p == m->dv) {
4144          m->dv = 0;
4145          m->dvsize = 0;
4146        }
4147        else {
4148          unlink_large_chunk(m, tp);
4149        }
4150        if (CALL_MUNMAP(base, size) == 0) {
4151          released += size;
4152          m->footprint -= size;
4153          /* unlink obsoleted record */
4154          sp = pred;
4155          sp->next = next;
4156        }
4157        else { /* back out if cannot unmap */
4158          insert_large_chunk(m, tp, psize);
4159        }
4160      }
4161    }
4162    if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */
4163      break;
4164    pred = sp;
4165    sp = next;
4166  }
4167  /* Reset check counter */
4168  m->release_checks = ((nsegs > MAX_RELEASE_CHECK_RATE)?
4169                       nsegs : MAX_RELEASE_CHECK_RATE);
4170  return released;
4171}
4172
4173static int sys_trim(mstate m, size_t pad) {
4174  size_t released = 0;
4175  ensure_initialization();
4176  if (pad < MAX_REQUEST && is_initialized(m)) {
4177    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
4178
4179    if (m->topsize > pad) {
4180      /* Shrink top space in granularity-size units, keeping at least one */
4181      size_t unit = mparams.granularity;
4182      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
4183                      SIZE_T_ONE) * unit;
4184      msegmentptr sp = segment_holding(m, (char*)m->top);
4185
4186      if (!is_extern_segment(sp)) {
4187        if (is_mmapped_segment(sp)) {
4188          if (HAVE_MMAP &&
4189              sp->size >= extra &&
4190              !has_segment_link(m, sp)) { /* can't shrink if pinned */
4191            size_t newsize = sp->size - extra;
4192            /* Prefer mremap, fall back to munmap */
4193            if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
4194                (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
4195              released = extra;
4196            }
4197          }
4198        }
4199        else if (HAVE_MORECORE) {
4200          if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
4201            extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
4202          ACQUIRE_MALLOC_GLOBAL_LOCK();
4203          {
4204            /* Make sure end of memory is where we last set it. */
4205            char* old_br = (char*)(CALL_MORECORE(0));
4206            if (old_br == sp->base + sp->size) {
4207              char* rel_br = (char*)(CALL_MORECORE(-extra));
4208              char* new_br = (char*)(CALL_MORECORE(0));
4209              if (rel_br != CMFAIL && new_br < old_br)
4210                released = old_br - new_br;
4211            }
4212          }
4213          RELEASE_MALLOC_GLOBAL_LOCK();
4214        }
4215      }
4216
4217      if (released != 0) {
4218        sp->size -= released;
4219        m->footprint -= released;
4220        init_top(m, m->top, m->topsize - released);
4221        check_top_chunk(m, m->top);
4222      }
4223    }
4224
4225    /* Unmap any unused mmapped segments */
4226    if (HAVE_MMAP)
4227      released += release_unused_segments(m);
4228
4229    /* On failure, disable autotrim to avoid repeated failed future calls */
4230    if (released == 0 && m->topsize > m->trim_check)
4231      m->trim_check = MAX_SIZE_T;
4232  }
4233
4234  return (released != 0)? 1 : 0;
4235}
4236
4237
4238/* ---------------------------- malloc support --------------------------- */
4239
4240/* allocate a large request from the best fitting chunk in a treebin */
4241static void* tmalloc_large(mstate m, size_t nb) {
4242  tchunkptr v = 0;
4243  size_t rsize = -nb; /* Unsigned negation */
4244  tchunkptr t;
4245  bindex_t idx;
4246  compute_tree_index(nb, idx);
4247  if ((t = *treebin_at(m, idx)) != 0) {
4248    /* Traverse tree for this bin looking for node with size == nb */
4249    size_t sizebits = nb << leftshift_for_tree_index(idx);
4250    tchunkptr rst = 0;  /* The deepest untaken right subtree */
4251    for (;;) {
4252      tchunkptr rt;
4253      size_t trem = chunksize(t) - nb;
4254      if (trem < rsize) {
4255        v = t;
4256        if ((rsize = trem) == 0)
4257          break;
4258      }
4259      rt = t->child[1];
4260      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
4261      if (rt != 0 && rt != t)
4262        rst = rt;
4263      if (t == 0) {
4264        t = rst; /* set t to least subtree holding sizes > nb */
4265        break;
4266      }
4267      sizebits <<= 1;
4268    }
4269  }
4270  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
4271    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
4272    if (leftbits != 0) {
4273      bindex_t i;
4274      binmap_t leastbit = least_bit(leftbits);
4275      compute_bit2idx(leastbit, i);
4276      t = *treebin_at(m, i);
4277    }
4278  }
4279
4280  while (t != 0) { /* find smallest of tree or subtree */
4281    size_t trem = chunksize(t) - nb;
4282    if (trem < rsize) {
4283      rsize = trem;
4284      v = t;
4285    }
4286    t = leftmost_child(t);
4287  }
4288
4289  /*  If dv is a better fit, return 0 so malloc will use it */
4290  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
4291    if (RTCHECK(ok_address(m, v))) { /* split */
4292      mchunkptr r = chunk_plus_offset(v, nb);
4293      assert(chunksize(v) == rsize + nb);
4294      if (RTCHECK(ok_next(v, r))) {
4295        unlink_large_chunk(m, v);
4296        if (rsize < MIN_CHUNK_SIZE)
4297          set_inuse_and_pinuse(m, v, (rsize + nb));
4298        else {
4299          set_size_and_pinuse_of_inuse_chunk(m, v, nb);
4300          set_size_and_pinuse_of_free_chunk(r, rsize);
4301          insert_chunk(m, r, rsize);
4302        }
4303        return chunk2mem(v);
4304      }
4305    }
4306    CORRUPTION_ERROR_ACTION(m);
4307  }
4308  return 0;
4309}
4310
4311/* allocate a small request from the best fitting chunk in a treebin */
4312static void* tmalloc_small(mstate m, size_t nb) {
4313  tchunkptr t, v;
4314  size_t rsize;
4315  bindex_t i;
4316  binmap_t leastbit = least_bit(m->treemap);
4317  compute_bit2idx(leastbit, i);
4318  v = t = *treebin_at(m, i);
4319  rsize = chunksize(t) - nb;
4320
4321  while ((t = leftmost_child(t)) != 0) {
4322    size_t trem = chunksize(t) - nb;
4323    if (trem < rsize) {
4324      rsize = trem;
4325      v = t;
4326    }
4327  }
4328
4329  if (RTCHECK(ok_address(m, v))) {
4330    mchunkptr r = chunk_plus_offset(v, nb);
4331    assert(chunksize(v) == rsize + nb);
4332    if (RTCHECK(ok_next(v, r))) {
4333      unlink_large_chunk(m, v);
4334      if (rsize < MIN_CHUNK_SIZE)
4335        set_inuse_and_pinuse(m, v, (rsize + nb));
4336      else {
4337        set_size_and_pinuse_of_inuse_chunk(m, v, nb);
4338        set_size_and_pinuse_of_free_chunk(r, rsize);
4339        replace_dv(m, r, rsize);
4340      }
4341      return chunk2mem(v);
4342    }
4343  }
4344
4345  CORRUPTION_ERROR_ACTION(m);
4346  return 0;
4347}
4348
4349/* --------------------------- realloc support --------------------------- */
4350
4351static void* internal_realloc(mstate m, void* oldmem, size_t bytes) {
4352  if (bytes >= MAX_REQUEST) {
4353    MALLOC_FAILURE_ACTION;
4354    return 0;
4355  }
4356  if (!PREACTION(m)) {
4357    mchunkptr oldp = mem2chunk(oldmem);
4358    size_t oldsize = chunksize(oldp);
4359    mchunkptr next = chunk_plus_offset(oldp, oldsize);
4360    mchunkptr newp = 0;
4361    void* extra = 0;
4362
4363    /* Try to either shrink or extend into top. Else malloc-copy-free */
4364
4365    if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) &&
4366                ok_next(oldp, next) && ok_pinuse(next))) {
4367      size_t nb = request2size(bytes);
4368      if (is_mmapped(oldp))
4369        newp = mmap_resize(m, oldp, nb);
4370      else if (oldsize >= nb) { /* already big enough */
4371        size_t rsize = oldsize - nb;
4372        newp = oldp;
4373        if (rsize >= MIN_CHUNK_SIZE) {
4374          mchunkptr remainder = chunk_plus_offset(newp, nb);
4375          set_inuse(m, newp, nb);
4376          set_inuse(m, remainder, rsize);
4377          extra = chunk2mem(remainder);
4378        }
4379      }
4380      else if (next == m->top && oldsize + m->topsize > nb) {
4381        /* Expand into top */
4382        size_t newsize = oldsize + m->topsize;
4383        size_t newtopsize = newsize - nb;
4384        mchunkptr newtop = chunk_plus_offset(oldp, nb);
4385        set_inuse(m, oldp, nb);
4386        newtop->head = newtopsize |PINUSE_BIT;
4387        m->top = newtop;
4388        m->topsize = newtopsize;
4389        newp = oldp;
4390      }
4391    }
4392    else {
4393      USAGE_ERROR_ACTION(m, oldmem);
4394      POSTACTION(m);
4395      return 0;
4396    }
4397
4398    POSTACTION(m);
4399
4400    if (newp != 0) {
4401      if (extra != 0) {
4402        internal_free(m, extra);
4403      }
4404      check_inuse_chunk(m, newp);
4405      return chunk2mem(newp);
4406    }
4407    else {
4408      void* newmem = internal_malloc(m, bytes);
4409      if (newmem != 0) {
4410        size_t oc = oldsize - overhead_for(oldp);
4411        memcpy(newmem, oldmem, (oc < bytes)? oc : bytes);
4412        internal_free(m, oldmem);
4413      }
4414      return newmem;
4415    }
4416  }
4417  return 0;
4418}
4419
4420/* --------------------------- memalign support -------------------------- */
4421
4422static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
4423  if (alignment <= MALLOC_ALIGNMENT)    /* Can just use malloc */
4424    return internal_malloc(m, bytes);
4425  if (alignment <  MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
4426    alignment = MIN_CHUNK_SIZE;
4427  if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
4428    size_t a = MALLOC_ALIGNMENT << 1;
4429    while (a < alignment) a <<= 1;
4430    alignment = a;
4431  }
4432
4433  if (bytes >= MAX_REQUEST - alignment) {
4434    if (m != 0)  { /* Test isn't needed but avoids compiler warning */
4435      MALLOC_FAILURE_ACTION;
4436    }
4437  }
4438  else {
4439    size_t nb = request2size(bytes);
4440    size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
4441    char* mem = (char*)internal_malloc(m, req);
4442    if (mem != 0) {
4443      void* leader = 0;
4444      void* trailer = 0;
4445      mchunkptr p = mem2chunk(mem);
4446
4447      if (PREACTION(m)) return 0;
4448      if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */
4449        /*
4450          Find an aligned spot inside chunk.  Since we need to give
4451          back leading space in a chunk of at least MIN_CHUNK_SIZE, if
4452          the first calculation places us at a spot with less than
4453          MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
4454          We've allocated enough total room so that this is always
4455          possible.
4456        */
4457        char* br = (char*)mem2chunk((size_t)(((size_t)(mem +
4458                                                       alignment -
4459                                                       SIZE_T_ONE)) &
4460                                             -alignment));
4461        char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
4462          br : br+alignment;
4463        mchunkptr newp = (mchunkptr)pos;
4464        size_t leadsize = pos - (char*)(p);
4465        size_t newsize = chunksize(p) - leadsize;
4466
4467        if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
4468          newp->prev_foot = p->prev_foot + leadsize;
4469          newp->head = (newsize|CINUSE_BIT);
4470        }
4471        else { /* Otherwise, give back leader, use the rest */
4472          set_inuse(m, newp, newsize);
4473          set_inuse(m, p, leadsize);
4474          leader = chunk2mem(p);
4475        }
4476        p = newp;
4477      }
4478
4479      /* Give back spare room at the end */
4480      if (!is_mmapped(p)) {
4481        size_t size = chunksize(p);
4482        if (size > nb + MIN_CHUNK_SIZE) {
4483          size_t remainder_size = size - nb;
4484          mchunkptr remainder = chunk_plus_offset(p, nb);
4485          set_inuse(m, p, nb);
4486          set_inuse(m, remainder, remainder_size);
4487          trailer = chunk2mem(remainder);
4488        }
4489      }
4490
4491      assert (chunksize(p) >= nb);
4492      assert((((size_t)(chunk2mem(p))) % alignment) == 0);
4493      check_inuse_chunk(m, p);
4494      POSTACTION(m);
4495      if (leader != 0) {
4496        internal_free(m, leader);
4497      }
4498      if (trailer != 0) {
4499        internal_free(m, trailer);
4500      }
4501      return chunk2mem(p);
4502    }
4503  }
4504  return 0;
4505}
4506
4507/* ------------------------ comalloc/coalloc support --------------------- */
4508
4509static void** ialloc(mstate m,
4510                     size_t n_elements,
4511                     size_t* sizes,
4512                     int opts,
4513                     void* chunks[]) {
4514  /*
4515    This provides common support for independent_X routines, handling
4516    all of the combinations that can result.
4517
4518    The opts arg has:
4519    bit 0 set if all elements are same size (using sizes[0])
4520    bit 1 set if elements should be zeroed
4521  */
4522
4523  size_t    element_size;   /* chunksize of each element, if all same */
4524  size_t    contents_size;  /* total size of elements */
4525  size_t    array_size;     /* request size of pointer array */
4526  void*     mem;            /* malloced aggregate space */
4527  mchunkptr p;              /* corresponding chunk */
4528  size_t    remainder_size; /* remaining bytes while splitting */
4529  void**    marray;         /* either "chunks" or malloced ptr array */
4530  mchunkptr array_chunk;    /* chunk for malloced ptr array */
4531  flag_t    was_enabled;    /* to disable mmap */
4532  size_t    size;
4533  size_t    i;
4534
4535  ensure_initialization();
4536  /* compute array length, if needed */
4537  if (chunks != 0) {
4538    if (n_elements == 0)
4539      return chunks; /* nothing to do */
4540    marray = chunks;
4541    array_size = 0;
4542  }
4543  else {
4544    /* if empty req, must still return chunk representing empty array */
4545    if (n_elements == 0)
4546      return (void**)internal_malloc(m, 0);
4547    marray = 0;
4548    array_size = request2size(n_elements * (sizeof(void*)));
4549  }
4550
4551  /* compute total element size */
4552  if (opts & 0x1) { /* all-same-size */
4553    element_size = request2size(*sizes);
4554    contents_size = n_elements * element_size;
4555  }
4556  else { /* add up all the sizes */
4557    element_size = 0;
4558    contents_size = 0;
4559    for (i = 0; i != n_elements; ++i)
4560      contents_size += request2size(sizes[i]);
4561  }
4562
4563  size = contents_size + array_size;
4564
4565  /*
4566     Allocate the aggregate chunk.  First disable direct-mmapping so
4567     malloc won't use it, since we would not be able to later
4568     free/realloc space internal to a segregated mmap region.
4569  */
4570  was_enabled = use_mmap(m);
4571  disable_mmap(m);
4572  mem = internal_malloc(m, size - CHUNK_OVERHEAD);
4573  if (was_enabled)
4574    enable_mmap(m);
4575  if (mem == 0)
4576    return 0;
4577
4578  if (PREACTION(m)) return 0;
4579  p = mem2chunk(mem);
4580  remainder_size = chunksize(p);
4581
4582  assert(!is_mmapped(p));
4583
4584  if (opts & 0x2) {       /* optionally clear the elements */
4585    memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
4586  }
4587
4588  /* If not provided, allocate the pointer array as final part of chunk */
4589  if (marray == 0) {
4590    size_t  array_chunk_size;
4591    array_chunk = chunk_plus_offset(p, contents_size);
4592    array_chunk_size = remainder_size - contents_size;
4593    marray = (void**) (chunk2mem(array_chunk));
4594    set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
4595    remainder_size = contents_size;
4596  }
4597
4598  /* split out elements */
4599  for (i = 0; ; ++i) {
4600    marray[i] = chunk2mem(p);
4601    if (i != n_elements-1) {
4602      if (element_size != 0)
4603        size = element_size;
4604      else
4605        size = request2size(sizes[i]);
4606      remainder_size -= size;
4607      set_size_and_pinuse_of_inuse_chunk(m, p, size);
4608      p = chunk_plus_offset(p, size);
4609    }
4610    else { /* the final element absorbs any overallocation slop */
4611      set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
4612      break;
4613    }
4614  }
4615
4616#if DEBUG
4617  if (marray != chunks) {
4618    /* final element must have exactly exhausted chunk */
4619    if (element_size != 0) {
4620      assert(remainder_size == element_size);
4621    }
4622    else {
4623      assert(remainder_size == request2size(sizes[i]));
4624    }
4625    check_inuse_chunk(m, mem2chunk(marray));
4626  }
4627  for (i = 0; i != n_elements; ++i)
4628    check_inuse_chunk(m, mem2chunk(marray[i]));
4629
4630#endif /* DEBUG */
4631
4632  POSTACTION(m);
4633  return marray;
4634}
4635
4636
4637/* -------------------------- public routines ---------------------------- */
4638
4639#if !ONLY_MSPACES
4640
4641void* dlmalloc(size_t bytes) {
4642  /*
4643     Basic algorithm:
4644     If a small request (< 256 bytes minus per-chunk overhead):
4645       1. If one exists, use a remainderless chunk in associated smallbin.
4646          (Remainderless means that there are too few excess bytes to
4647          represent as a chunk.)
4648       2. If it is big enough, use the dv chunk, which is normally the
4649          chunk adjacent to the one used for the most recent small request.
4650       3. If one exists, split the smallest available chunk in a bin,
4651          saving remainder in dv.
4652       4. If it is big enough, use the top chunk.
4653       5. If available, get memory from system and use it
4654     Otherwise, for a large request:
4655       1. Find the smallest available binned chunk that fits, and use it
4656          if it is better fitting than dv chunk, splitting if necessary.
4657       2. If better fitting than any binned chunk, use the dv chunk.
4658       3. If it is big enough, use the top chunk.
4659       4. If request size >= mmap threshold, try to directly mmap this chunk.
4660       5. If available, get memory from system and use it
4661
4662     The ugly goto's here ensure that postaction occurs along all paths.
4663  */
4664
4665#if USE_LOCKS
4666  ensure_initialization(); /* initialize in sys_alloc if not using locks */
4667#endif
4668
4669  if (!PREACTION(gm)) {
4670    void* mem;
4671    size_t nb;
4672    if (bytes <= MAX_SMALL_REQUEST) {
4673      bindex_t idx;
4674      binmap_t smallbits;
4675      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
4676      idx = small_index(nb);
4677      smallbits = gm->smallmap >> idx;
4678
4679      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
4680        mchunkptr b, p;
4681        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
4682        b = smallbin_at(gm, idx);
4683        p = b->fd;
4684        assert(chunksize(p) == small_index2size(idx));
4685        unlink_first_small_chunk(gm, b, p, idx);
4686        set_inuse_and_pinuse(gm, p, small_index2size(idx));
4687        mem = chunk2mem(p);
4688        check_malloced_chunk(gm, mem, nb);
4689        goto postaction;
4690      }
4691
4692      else if (nb > gm->dvsize) {
4693        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
4694          mchunkptr b, p, r;
4695          size_t rsize;
4696          bindex_t i;
4697          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
4698          binmap_t leastbit = least_bit(leftbits);
4699          compute_bit2idx(leastbit, i);
4700          b = smallbin_at(gm, i);
4701          p = b->fd;
4702          assert(chunksize(p) == small_index2size(i));
4703          unlink_first_small_chunk(gm, b, p, i);
4704          rsize = small_index2size(i) - nb;
4705          /* Fit here cannot be remainderless if 4byte sizes */
4706          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
4707            set_inuse_and_pinuse(gm, p, small_index2size(i));
4708          else {
4709            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
4710            r = chunk_plus_offset(p, nb);
4711            set_size_and_pinuse_of_free_chunk(r, rsize);
4712            replace_dv(gm, r, rsize);
4713          }
4714          mem = chunk2mem(p);
4715          check_malloced_chunk(gm, mem, nb);
4716          goto postaction;
4717        }
4718
4719        else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
4720          check_malloced_chunk(gm, mem, nb);
4721          goto postaction;
4722        }
4723      }
4724    }
4725    else if (bytes >= MAX_REQUEST)
4726      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
4727    else {
4728      nb = pad_request(bytes);
4729      if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
4730        check_malloced_chunk(gm, mem, nb);
4731        goto postaction;
4732      }
4733    }
4734
4735    if (nb <= gm->dvsize) {
4736      size_t rsize = gm->dvsize - nb;
4737      mchunkptr p = gm->dv;
4738      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
4739        mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
4740        gm->dvsize = rsize;
4741        set_size_and_pinuse_of_free_chunk(r, rsize);
4742        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
4743      }
4744      else { /* exhaust dv */
4745        size_t dvs = gm->dvsize;
4746        gm->dvsize = 0;
4747        gm->dv = 0;
4748        set_inuse_and_pinuse(gm, p, dvs);
4749      }
4750      mem = chunk2mem(p);
4751      check_malloced_chunk(gm, mem, nb);
4752      goto postaction;
4753    }
4754
4755    else if (nb < gm->topsize) { /* Split top */
4756      size_t rsize = gm->topsize -= nb;
4757      mchunkptr p = gm->top;
4758      mchunkptr r = gm->top = chunk_plus_offset(p, nb);
4759      r->head = rsize | PINUSE_BIT;
4760      set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
4761      mem = chunk2mem(p);
4762      check_top_chunk(gm, gm->top);
4763      check_malloced_chunk(gm, mem, nb);
4764      goto postaction;
4765    }
4766
4767    mem = sys_alloc(gm, nb);
4768
4769  postaction:
4770    POSTACTION(gm);
4771    return mem;
4772  }
4773
4774  return 0;
4775}
4776
4777void dlfree(void* mem) {
4778  /*
4779     Consolidate freed chunks with preceeding or succeeding bordering
4780     free chunks, if they exist, and then place in a bin.  Intermixed
4781     with special cases for top, dv, mmapped chunks, and usage errors.
4782  */
4783
4784  if (mem != 0) {
4785    mchunkptr p  = mem2chunk(mem);
4786#if FOOTERS
4787    mstate fm = get_mstate_for(p);
4788    if (!ok_magic(fm)) {
4789      USAGE_ERROR_ACTION(fm, p);
4790      return;
4791    }
4792#else /* FOOTERS */
4793#define fm gm
4794#endif /* FOOTERS */
4795    if (!PREACTION(fm)) {
4796      check_inuse_chunk(fm, p);
4797      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
4798        size_t psize = chunksize(p);
4799        mchunkptr next = chunk_plus_offset(p, psize);
4800        if (!pinuse(p)) {
4801          size_t prevsize = p->prev_foot;
4802          if ((prevsize & IS_MMAPPED_BIT) != 0) {
4803            prevsize &= ~IS_MMAPPED_BIT;
4804            psize += prevsize + MMAP_FOOT_PAD;
4805            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
4806              fm->footprint -= psize;
4807            goto postaction;
4808          }
4809          else {
4810            mchunkptr prev = chunk_minus_offset(p, prevsize);
4811            psize += prevsize;
4812            p = prev;
4813            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
4814              if (p != fm->dv) {
4815                unlink_chunk(fm, p, prevsize);
4816              }
4817              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
4818                fm->dvsize = psize;
4819                set_free_with_pinuse(p, psize, next);
4820                goto postaction;
4821              }
4822            }
4823            else
4824              goto erroraction;
4825          }
4826        }
4827
4828        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
4829          if (!cinuse(next)) {  /* consolidate forward */
4830            if (next == fm->top) {
4831              size_t tsize = fm->topsize += psize;
4832              fm->top = p;
4833              p->head = tsize | PINUSE_BIT;
4834              if (p == fm->dv) {
4835                fm->dv = 0;
4836                fm->dvsize = 0;
4837              }
4838              if (should_trim(fm, tsize))
4839                sys_trim(fm, 0);
4840              goto postaction;
4841            }
4842            else if (next == fm->dv) {
4843              size_t dsize = fm->dvsize += psize;
4844              fm->dv = p;
4845              set_size_and_pinuse_of_free_chunk(p, dsize);
4846              goto postaction;
4847            }
4848            else {
4849              size_t nsize = chunksize(next);
4850              psize += nsize;
4851              unlink_chunk(fm, next, nsize);
4852              set_size_and_pinuse_of_free_chunk(p, psize);
4853              if (p == fm->dv) {
4854                fm->dvsize = psize;
4855                goto postaction;
4856              }
4857            }
4858          }
4859          else
4860            set_free_with_pinuse(p, psize, next);
4861
4862          if (is_small(psize)) {
4863            insert_small_chunk(fm, p, psize);
4864            check_free_chunk(fm, p);
4865          }
4866          else {
4867            tchunkptr tp = (tchunkptr)p;
4868            insert_large_chunk(fm, tp, psize);
4869            check_free_chunk(fm, p);
4870            if (--fm->release_checks == 0)
4871              release_unused_segments(fm);
4872          }
4873          goto postaction;
4874        }
4875      }
4876    erroraction:
4877      USAGE_ERROR_ACTION(fm, p);
4878    postaction:
4879      POSTACTION(fm);
4880    }
4881  }
4882#if !FOOTERS
4883#undef fm
4884#endif /* FOOTERS */
4885}
4886
4887void* dlcalloc(size_t n_elements, size_t elem_size) {
4888  void* mem;
4889  size_t req = 0;
4890  if (n_elements != 0) {
4891    req = n_elements * elem_size;
4892    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
4893        (req / n_elements != elem_size))
4894      req = MAX_SIZE_T; /* force downstream failure on overflow */
4895  }
4896  mem = dlmalloc(req);
4897  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
4898    memset(mem, 0, req);
4899  return mem;
4900}
4901
4902void* dlrealloc(void* oldmem, size_t bytes) {
4903  if (oldmem == 0)
4904    return dlmalloc(bytes);
4905#ifdef REALLOC_ZERO_BYTES_FREES
4906  if (bytes == 0) {
4907    dlfree(oldmem);
4908    return 0;
4909  }
4910#endif /* REALLOC_ZERO_BYTES_FREES */
4911  else {
4912#if ! FOOTERS
4913    mstate m = gm;
4914#else /* FOOTERS */
4915    mstate m = get_mstate_for(mem2chunk(oldmem));
4916    if (!ok_magic(m)) {
4917      USAGE_ERROR_ACTION(m, oldmem);
4918      return 0;
4919    }
4920#endif /* FOOTERS */
4921    return internal_realloc(m, oldmem, bytes);
4922  }
4923}
4924
4925void* dlmemalign(size_t alignment, size_t bytes) {
4926  return internal_memalign(gm, alignment, bytes);
4927}
4928
4929void** dlindependent_calloc(size_t n_elements, size_t elem_size,
4930                                 void* chunks[]) {
4931  size_t sz = elem_size; /* serves as 1-element array */
4932  return ialloc(gm, n_elements, &sz, 3, chunks);
4933}
4934
4935void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
4936                                   void* chunks[]) {
4937  return ialloc(gm, n_elements, sizes, 0, chunks);
4938}
4939
4940void* dlvalloc(size_t bytes) {
4941  size_t pagesz;
4942  ensure_initialization();
4943  pagesz = mparams.page_size;
4944  return dlmemalign(pagesz, bytes);
4945}
4946
4947void* dlpvalloc(size_t bytes) {
4948  size_t pagesz;
4949  ensure_initialization();
4950  pagesz = mparams.page_size;
4951  return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
4952}
4953
4954int dlmalloc_trim(size_t pad) {
4955  ensure_initialization();
4956  int result = 0;
4957  if (!PREACTION(gm)) {
4958    result = sys_trim(gm, pad);
4959    POSTACTION(gm);
4960  }
4961  return result;
4962}
4963
4964size_t dlmalloc_footprint(void) {
4965  return gm->footprint;
4966}
4967
4968size_t dlmalloc_max_footprint(void) {
4969  return gm->max_footprint;
4970}
4971
4972#if !NO_MALLINFO
4973struct mallinfo dlmallinfo(void) {
4974  return internal_mallinfo(gm);
4975}
4976#endif /* NO_MALLINFO */
4977
4978void dlmalloc_stats() {
4979  internal_malloc_stats(gm);
4980}
4981
4982int dlmallopt(int param_number, int value) {
4983  return change_mparam(param_number, value);
4984}
4985
4986#endif /* !ONLY_MSPACES */
4987
4988size_t dlmalloc_usable_size(void* mem) {
4989  if (mem != 0) {
4990    mchunkptr p = mem2chunk(mem);
4991    if (cinuse(p))
4992      return chunksize(p) - overhead_for(p);
4993  }
4994  return 0;
4995}
4996
4997/* ----------------------------- user mspaces ---------------------------- */
4998
4999#if MSPACES
5000
5001static mstate init_user_mstate(char* tbase, size_t tsize) {
5002  size_t msize = pad_request(sizeof(struct malloc_state));
5003  mchunkptr mn;
5004  mchunkptr msp = align_as_chunk(tbase);
5005  mstate m = (mstate)(chunk2mem(msp));
5006  memset(m, 0, msize);
5007  INITIAL_LOCK(&m->mutex);
5008  msp->head = (msize|PINUSE_BIT|CINUSE_BIT);
5009  m->seg.base = m->least_addr = tbase;
5010  m->seg.size = m->footprint = m->max_footprint = tsize;
5011  m->magic = mparams.magic;
5012  m->release_checks = MAX_RELEASE_CHECK_RATE;
5013  m->mflags = mparams.default_mflags;
5014  m->extp = 0;
5015  m->exts = 0;
5016  disable_contiguous(m);
5017  init_bins(m);
5018  mn = next_chunk(mem2chunk(m));
5019  init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
5020  check_top_chunk(m, m->top);
5021  return m;
5022}
5023
5024mspace create_mspace(size_t capacity, int locked) {
5025  mstate m = 0;
5026  size_t msize;
5027  ensure_initialization();
5028  msize = pad_request(sizeof(struct malloc_state));
5029  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
5030    size_t rs = ((capacity == 0)? mparams.granularity :
5031                 (capacity + TOP_FOOT_SIZE + msize));
5032    size_t tsize = granularity_align(rs);
5033    char* tbase = (char*)(CALL_MMAP(tsize));
5034    if (tbase != CMFAIL) {
5035      m = init_user_mstate(tbase, tsize);
5036      m->seg.sflags = IS_MMAPPED_BIT;
5037      set_lock(m, locked);
5038    }
5039  }
5040  return (mspace)m;
5041}
5042
5043mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
5044  mstate m = 0;
5045  size_t msize;
5046  ensure_initialization();
5047  msize = pad_request(sizeof(struct malloc_state));
5048  if (capacity > msize + TOP_FOOT_SIZE &&
5049      capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
5050    m = init_user_mstate((char*)base, capacity);
5051    m->seg.sflags = EXTERN_BIT;
5052    set_lock(m, locked);
5053  }
5054  return (mspace)m;
5055}
5056
5057int mspace_mmap_large_chunks(mspace msp, int enable) {
5058  int ret = 0;
5059  mstate ms = (mstate)msp;
5060  if (!PREACTION(ms)) {
5061    if (use_mmap(ms))
5062      ret = 1;
5063    if (enable)
5064      enable_mmap(ms);
5065    else
5066      disable_mmap(ms);
5067    POSTACTION(ms);
5068  }
5069  return ret;
5070}
5071
5072size_t destroy_mspace(mspace msp) {
5073  size_t freed = 0;
5074  mstate ms = (mstate)msp;
5075  if (ok_magic(ms)) {
5076    msegmentptr sp = &ms->seg;
5077    while (sp != 0) {
5078      char* base = sp->base;
5079      size_t size = sp->size;
5080      flag_t flag = sp->sflags;
5081      sp = sp->next;
5082      if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) &&
5083          CALL_MUNMAP(base, size) == 0)
5084        freed += size;
5085    }
5086  }
5087  else {
5088    USAGE_ERROR_ACTION(ms,ms);
5089  }
5090  return freed;
5091}
5092
5093/*
5094  mspace versions of routines are near-clones of the global
5095  versions. This is not so nice but better than the alternatives.
5096*/
5097
5098
5099void* mspace_malloc(mspace msp, size_t bytes) {
5100  mstate ms = (mstate)msp;
5101  if (!ok_magic(ms)) {
5102    USAGE_ERROR_ACTION(ms,ms);
5103    return 0;
5104  }
5105  if (!PREACTION(ms)) {
5106    void* mem;
5107    size_t nb;
5108    if (bytes <= MAX_SMALL_REQUEST) {
5109      bindex_t idx;
5110      binmap_t smallbits;
5111      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
5112      idx = small_index(nb);
5113      smallbits = ms->smallmap >> idx;
5114
5115      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
5116        mchunkptr b, p;
5117        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
5118        b = smallbin_at(ms, idx);
5119        p = b->fd;
5120        assert(chunksize(p) == small_index2size(idx));
5121        unlink_first_small_chunk(ms, b, p, idx);
5122        set_inuse_and_pinuse(ms, p, small_index2size(idx));
5123        mem = chunk2mem(p);
5124        check_malloced_chunk(ms, mem, nb);
5125        goto postaction;
5126      }
5127
5128      else if (nb > ms->dvsize) {
5129        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
5130          mchunkptr b, p, r;
5131          size_t rsize;
5132          bindex_t i;
5133          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
5134          binmap_t leastbit = least_bit(leftbits);
5135          compute_bit2idx(leastbit, i);
5136          b = smallbin_at(ms, i);
5137          p = b->fd;
5138          assert(chunksize(p) == small_index2size(i));
5139          unlink_first_small_chunk(ms, b, p, i);
5140          rsize = small_index2size(i) - nb;
5141          /* Fit here cannot be remainderless if 4byte sizes */
5142          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
5143            set_inuse_and_pinuse(ms, p, small_index2size(i));
5144          else {
5145            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
5146            r = chunk_plus_offset(p, nb);
5147            set_size_and_pinuse_of_free_chunk(r, rsize);
5148            replace_dv(ms, r, rsize);
5149          }
5150          mem = chunk2mem(p);
5151          check_malloced_chunk(ms, mem, nb);
5152          goto postaction;
5153        }
5154
5155        else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
5156          check_malloced_chunk(ms, mem, nb);
5157          goto postaction;
5158        }
5159      }
5160    }
5161    else if (bytes >= MAX_REQUEST)
5162      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
5163    else {
5164      nb = pad_request(bytes);
5165      if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
5166        check_malloced_chunk(ms, mem, nb);
5167        goto postaction;
5168      }
5169    }
5170
5171    if (nb <= ms->dvsize) {
5172      size_t rsize = ms->dvsize - nb;
5173      mchunkptr p = ms->dv;
5174      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
5175        mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
5176        ms->dvsize = rsize;
5177        set_size_and_pinuse_of_free_chunk(r, rsize);
5178        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
5179      }
5180      else { /* exhaust dv */
5181        size_t dvs = ms->dvsize;
5182        ms->dvsize = 0;
5183        ms->dv = 0;
5184        set_inuse_and_pinuse(ms, p, dvs);
5185      }
5186      mem = chunk2mem(p);
5187      check_malloced_chunk(ms, mem, nb);
5188      goto postaction;
5189    }
5190
5191    else if (nb < ms->topsize) { /* Split top */
5192      size_t rsize = ms->topsize -= nb;
5193      mchunkptr p = ms->top;
5194      mchunkptr r = ms->top = chunk_plus_offset(p, nb);
5195      r->head = rsize | PINUSE_BIT;
5196      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
5197      mem = chunk2mem(p);
5198      check_top_chunk(ms, ms->top);
5199      check_malloced_chunk(ms, mem, nb);
5200      goto postaction;
5201    }
5202
5203    mem = sys_alloc(ms, nb);
5204
5205  postaction:
5206    POSTACTION(ms);
5207    return mem;
5208  }
5209
5210  return 0;
5211}
5212
5213void mspace_free(mspace msp, void* mem) {
5214  if (mem != 0) {
5215    mchunkptr p  = mem2chunk(mem);
5216#if FOOTERS
5217    mstate fm = get_mstate_for(p);
5218#else /* FOOTERS */
5219    mstate fm = (mstate)msp;
5220#endif /* FOOTERS */
5221    if (!ok_magic(fm)) {
5222      USAGE_ERROR_ACTION(fm, p);
5223      return;
5224    }
5225    if (!PREACTION(fm)) {
5226      check_inuse_chunk(fm, p);
5227      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
5228        size_t psize = chunksize(p);
5229        mchunkptr next = chunk_plus_offset(p, psize);
5230        if (!pinuse(p)) {
5231          size_t prevsize = p->prev_foot;
5232          if ((prevsize & IS_MMAPPED_BIT) != 0) {
5233            prevsize &= ~IS_MMAPPED_BIT;
5234            psize += prevsize + MMAP_FOOT_PAD;
5235            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
5236              fm->footprint -= psize;
5237            goto postaction;
5238          }
5239          else {
5240            mchunkptr prev = chunk_minus_offset(p, prevsize);
5241            psize += prevsize;
5242            p = prev;
5243            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
5244              if (p != fm->dv) {
5245                unlink_chunk(fm, p, prevsize);
5246              }
5247              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
5248                fm->dvsize = psize;
5249                set_free_with_pinuse(p, psize, next);
5250                goto postaction;
5251              }
5252            }
5253            else
5254              goto erroraction;
5255          }
5256        }
5257
5258        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
5259          if (!cinuse(next)) {  /* consolidate forward */
5260            if (next == fm->top) {
5261              size_t tsize = fm->topsize += psize;
5262              fm->top = p;
5263              p->head = tsize | PINUSE_BIT;
5264              if (p == fm->dv) {
5265                fm->dv = 0;
5266                fm->dvsize = 0;
5267              }
5268              if (should_trim(fm, tsize))
5269                sys_trim(fm, 0);
5270              goto postaction;
5271            }
5272            else if (next == fm->dv) {
5273              size_t dsize = fm->dvsize += psize;
5274              fm->dv = p;
5275              set_size_and_pinuse_of_free_chunk(p, dsize);
5276              goto postaction;
5277            }
5278            else {
5279              size_t nsize = chunksize(next);
5280              psize += nsize;
5281              unlink_chunk(fm, next, nsize);
5282              set_size_and_pinuse_of_free_chunk(p, psize);
5283              if (p == fm->dv) {
5284                fm->dvsize = psize;
5285                goto postaction;
5286              }
5287            }
5288          }
5289          else
5290            set_free_with_pinuse(p, psize, next);
5291
5292          if (is_small(psize)) {
5293            insert_small_chunk(fm, p, psize);
5294            check_free_chunk(fm, p);
5295          }
5296          else {
5297            tchunkptr tp = (tchunkptr)p;
5298            insert_large_chunk(fm, tp, psize);
5299            check_free_chunk(fm, p);
5300            if (--fm->release_checks == 0)
5301              release_unused_segments(fm);
5302          }
5303          goto postaction;
5304        }
5305      }
5306    erroraction:
5307      USAGE_ERROR_ACTION(fm, p);
5308    postaction:
5309      POSTACTION(fm);
5310    }
5311  }
5312}
5313
5314void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
5315  void* mem;
5316  size_t req = 0;
5317  mstate ms = (mstate)msp;
5318  if (!ok_magic(ms)) {
5319    USAGE_ERROR_ACTION(ms,ms);
5320    return 0;
5321  }
5322  if (n_elements != 0) {
5323    req = n_elements * elem_size;
5324    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
5325        (req / n_elements != elem_size))
5326      req = MAX_SIZE_T; /* force downstream failure on overflow */
5327  }
5328  mem = internal_malloc(ms, req);
5329  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
5330    memset(mem, 0, req);
5331  return mem;
5332}
5333
5334void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
5335  if (oldmem == 0)
5336    return mspace_malloc(msp, bytes);
5337#ifdef REALLOC_ZERO_BYTES_FREES
5338  if (bytes == 0) {
5339    mspace_free(msp, oldmem);
5340    return 0;
5341  }
5342#endif /* REALLOC_ZERO_BYTES_FREES */
5343  else {
5344#if FOOTERS
5345    mchunkptr p  = mem2chunk(oldmem);
5346    mstate ms = get_mstate_for(p);
5347#else /* FOOTERS */
5348    mstate ms = (mstate)msp;
5349#endif /* FOOTERS */
5350    if (!ok_magic(ms)) {
5351      USAGE_ERROR_ACTION(ms,ms);
5352      return 0;
5353    }
5354    return internal_realloc(ms, oldmem, bytes);
5355  }
5356}
5357
5358void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
5359  mstate ms = (mstate)msp;
5360  if (!ok_magic(ms)) {
5361    USAGE_ERROR_ACTION(ms,ms);
5362    return 0;
5363  }
5364  return internal_memalign(ms, alignment, bytes);
5365}
5366
5367void** mspace_independent_calloc(mspace msp, size_t n_elements,
5368                                 size_t elem_size, void* chunks[]) {
5369  size_t sz = elem_size; /* serves as 1-element array */
5370  mstate ms = (mstate)msp;
5371  if (!ok_magic(ms)) {
5372    USAGE_ERROR_ACTION(ms,ms);
5373    return 0;
5374  }
5375  return ialloc(ms, n_elements, &sz, 3, chunks);
5376}
5377
5378void** mspace_independent_comalloc(mspace msp, size_t n_elements,
5379                                   size_t sizes[], void* chunks[]) {
5380  mstate ms = (mstate)msp;
5381  if (!ok_magic(ms)) {
5382    USAGE_ERROR_ACTION(ms,ms);
5383    return 0;
5384  }
5385  return ialloc(ms, n_elements, sizes, 0, chunks);
5386}
5387
5388int mspace_trim(mspace msp, size_t pad) {
5389  int result = 0;
5390  mstate ms = (mstate)msp;
5391  if (ok_magic(ms)) {
5392    if (!PREACTION(ms)) {
5393      result = sys_trim(ms, pad);
5394      POSTACTION(ms);
5395    }
5396  }
5397  else {
5398    USAGE_ERROR_ACTION(ms,ms);
5399  }
5400  return result;
5401}
5402
5403void mspace_malloc_stats(mspace msp) {
5404  mstate ms = (mstate)msp;
5405  if (ok_magic(ms)) {
5406    internal_malloc_stats(ms);
5407  }
5408  else {
5409    USAGE_ERROR_ACTION(ms,ms);
5410  }
5411}
5412
5413size_t mspace_footprint(mspace msp) {
5414  size_t result = 0;
5415  mstate ms = (mstate)msp;
5416  if (ok_magic(ms)) {
5417    result = ms->footprint;
5418  }
5419  else {
5420    USAGE_ERROR_ACTION(ms,ms);
5421  }
5422  return result;
5423}
5424
5425
5426size_t mspace_max_footprint(mspace msp) {
5427  size_t result = 0;
5428  mstate ms = (mstate)msp;
5429  if (ok_magic(ms)) {
5430    result = ms->max_footprint;
5431  }
5432  else {
5433    USAGE_ERROR_ACTION(ms,ms);
5434  }
5435  return result;
5436}
5437
5438
5439#if !NO_MALLINFO
5440struct mallinfo mspace_mallinfo(mspace msp) {
5441  mstate ms = (mstate)msp;
5442  if (!ok_magic(ms)) {
5443    USAGE_ERROR_ACTION(ms,ms);
5444  }
5445  return internal_mallinfo(ms);
5446}
5447#endif /* NO_MALLINFO */
5448
5449size_t mspace_usable_size(void* mem) {
5450  if (mem != 0) {
5451    mchunkptr p = mem2chunk(mem);
5452    if (cinuse(p))
5453      return chunksize(p) - overhead_for(p);
5454  }
5455  return 0;
5456}
5457
5458int mspace_mallopt(int param_number, int value) {
5459  return change_mparam(param_number, value);
5460}
5461
5462#endif /* MSPACES */
5463
5464/* -------------------- Alternative MORECORE functions ------------------- */
5465
5466/*
5467  Guidelines for creating a custom version of MORECORE:
5468
5469  * For best performance, MORECORE should allocate in multiples of pagesize.
5470  * MORECORE may allocate more memory than requested. (Or even less,
5471      but this will usually result in a malloc failure.)
5472  * MORECORE must not allocate memory when given argument zero, but
5473      instead return one past the end address of memory from previous
5474      nonzero call.
5475  * For best performance, consecutive calls to MORECORE with positive
5476      arguments should return increasing addresses, indicating that
5477      space has been contiguously extended.
5478  * Even though consecutive calls to MORECORE need not return contiguous
5479      addresses, it must be OK for malloc'ed chunks to span multiple
5480      regions in those cases where they do happen to be contiguous.
5481  * MORECORE need not handle negative arguments -- it may instead
5482      just return MFAIL when given negative arguments.
5483      Negative arguments are always multiples of pagesize. MORECORE
5484      must not misinterpret negative args as large positive unsigned
5485      args. You can suppress all such calls from even occurring by defining
5486      MORECORE_CANNOT_TRIM,
5487
5488  As an example alternative MORECORE, here is a custom allocator
5489  kindly contributed for pre-OSX macOS.  It uses virtually but not
5490  necessarily physically contiguous non-paged memory (locked in,
5491  present and won't get swapped out).  You can use it by uncommenting
5492  this section, adding some #includes, and setting up the appropriate
5493  defines above:
5494
5495      #define MORECORE osMoreCore
5496
5497  There is also a shutdown routine that should somehow be called for
5498  cleanup upon program exit.
5499
5500  #define MAX_POOL_ENTRIES 100
5501  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)
5502  static int next_os_pool;
5503  void *our_os_pools[MAX_POOL_ENTRIES];
5504
5505  void *osMoreCore(int size)
5506  {
5507    void *ptr = 0;
5508    static void *sbrk_top = 0;
5509
5510    if (size > 0)
5511    {
5512      if (size < MINIMUM_MORECORE_SIZE)
5513         size = MINIMUM_MORECORE_SIZE;
5514      if (CurrentExecutionLevel() == kTaskLevel)
5515         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
5516      if (ptr == 0)
5517      {
5518        return (void *) MFAIL;
5519      }
5520      // save ptrs so they can be freed during cleanup
5521      our_os_pools[next_os_pool] = ptr;
5522      next_os_pool++;
5523      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
5524      sbrk_top = (char *) ptr + size;
5525      return ptr;
5526    }
5527    else if (size < 0)
5528    {
5529      // we don't currently support shrink behavior
5530      return (void *) MFAIL;
5531    }
5532    else
5533    {
5534      return sbrk_top;
5535    }
5536  }
5537
5538  // cleanup any allocated memory pools
5539  // called as last thing before shutting down driver
5540
5541  void osCleanupMem(void)
5542  {
5543    void **ptr;
5544
5545    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
5546      if (*ptr)
5547      {
5548         PoolDeallocate(*ptr);
5549         *ptr = 0;
5550      }
5551  }
5552
5553*/
5554
5555
5556/* -----------------------------------------------------------------------
5557History:
5558    V2.8.4 (not yet released)
5559      * Add mspace_mmap_large_chunks; thanks to Jean Brouwers
5560      * Fix insufficient sys_alloc padding when using 16byte alignment
5561      * Fix bad error check in mspace_footprint
5562      * Adaptations for ptmalloc, courtesy of Wolfram Gloger.
5563      * Reentrant spin locks, courtesy of Earl Chew and others
5564      * Win32 improvements, courtesy of Niall Douglas and Earl Chew
5565      * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options
5566      * Extension hook in malloc_state
5567      * Various small adjustments to reduce warnings on some compilers
5568      * Various configuration extensions/changes for more platforms. Thanks
5569         to all who contributed these.
5570
5571    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)
5572      * Add max_footprint functions
5573      * Ensure all appropriate literals are size_t
5574      * Fix conditional compilation problem for some #define settings
5575      * Avoid concatenating segments with the one provided
5576        in create_mspace_with_base
5577      * Rename some variables to avoid compiler shadowing warnings
5578      * Use explicit lock initialization.
5579      * Better handling of sbrk interference.
5580      * Simplify and fix segment insertion, trimming and mspace_destroy
5581      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
5582      * Thanks especially to Dennis Flanagan for help on these.
5583
5584    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)
5585      * Fix memalign brace error.
5586
5587    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)
5588      * Fix improper #endif nesting in C++
5589      * Add explicit casts needed for C++
5590
5591    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)
5592      * Use trees for large bins
5593      * Support mspaces
5594      * Use segments to unify sbrk-based and mmap-based system allocation,
5595        removing need for emulation on most platforms without sbrk.
5596      * Default safety checks
5597      * Optional footer checks. Thanks to William Robertson for the idea.
5598      * Internal code refactoring
5599      * Incorporate suggestions and platform-specific changes.
5600        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
5601        Aaron Bachmann,  Emery Berger, and others.
5602      * Speed up non-fastbin processing enough to remove fastbins.
5603      * Remove useless cfree() to avoid conflicts with other apps.
5604      * Remove internal memcpy, memset. Compilers handle builtins better.
5605      * Remove some options that no one ever used and rename others.
5606
5607    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)
5608      * Fix malloc_state bitmap array misdeclaration
5609
5610    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)
5611      * Allow tuning of FIRST_SORTED_BIN_SIZE
5612      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
5613      * Better detection and support for non-contiguousness of MORECORE.
5614        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
5615      * Bypass most of malloc if no frees. Thanks To Emery Berger.
5616      * Fix freeing of old top non-contiguous chunk im sysmalloc.
5617      * Raised default trim and map thresholds to 256K.
5618      * Fix mmap-related #defines. Thanks to Lubos Lunak.
5619      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
5620      * Branch-free bin calculation
5621      * Default trim and mmap thresholds now 256K.
5622
5623    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)
5624      * Introduce independent_comalloc and independent_calloc.
5625        Thanks to Michael Pachos for motivation and help.
5626      * Make optional .h file available
5627      * Allow > 2GB requests on 32bit systems.
5628      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
5629        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
5630        and Anonymous.
5631      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
5632        helping test this.)
5633      * memalign: check alignment arg
5634      * realloc: don't try to shift chunks backwards, since this
5635        leads to  more fragmentation in some programs and doesn't
5636        seem to help in any others.
5637      * Collect all cases in malloc requiring system memory into sysmalloc
5638      * Use mmap as backup to sbrk
5639      * Place all internal state in malloc_state
5640      * Introduce fastbins (although similar to 2.5.1)
5641      * Many minor tunings and cosmetic improvements
5642      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
5643      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
5644        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
5645      * Include errno.h to support default failure action.
5646
5647    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
5648      * return null for negative arguments
5649      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
5650         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
5651          (e.g. WIN32 platforms)
5652         * Cleanup header file inclusion for WIN32 platforms
5653         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
5654         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
5655           memory allocation routines
5656         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
5657         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
5658           usage of 'assert' in non-WIN32 code
5659         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
5660           avoid infinite loop
5661      * Always call 'fREe()' rather than 'free()'
5662
5663    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
5664      * Fixed ordering problem with boundary-stamping
5665
5666    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
5667      * Added pvalloc, as recommended by H.J. Liu
5668      * Added 64bit pointer support mainly from Wolfram Gloger
5669      * Added anonymously donated WIN32 sbrk emulation
5670      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
5671      * malloc_extend_top: fix mask error that caused wastage after
5672        foreign sbrks
5673      * Add linux mremap support code from HJ Liu
5674
5675    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
5676      * Integrated most documentation with the code.
5677      * Add support for mmap, with help from
5678        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
5679      * Use last_remainder in more cases.
5680      * Pack bins using idea from  colin@nyx10.cs.du.edu
5681      * Use ordered bins instead of best-fit threshhold
5682      * Eliminate block-local decls to simplify tracing and debugging.
5683      * Support another case of realloc via move into top
5684      * Fix error occuring when initial sbrk_base not word-aligned.
5685      * Rely on page size for units instead of SBRK_UNIT to
5686        avoid surprises about sbrk alignment conventions.
5687      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
5688        (raymond@es.ele.tue.nl) for the suggestion.
5689      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
5690      * More precautions for cases where other routines call sbrk,
5691        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
5692      * Added macros etc., allowing use in linux libc from
5693        H.J. Lu (hjl@gnu.ai.mit.edu)
5694      * Inverted this history list
5695
5696    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
5697      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
5698      * Removed all preallocation code since under current scheme
5699        the work required to undo bad preallocations exceeds
5700        the work saved in good cases for most test programs.
5701      * No longer use return list or unconsolidated bins since
5702        no scheme using them consistently outperforms those that don't
5703        given above changes.
5704      * Use best fit for very large chunks to prevent some worst-cases.
5705      * Added some support for debugging
5706
5707    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
5708      * Removed footers when chunks are in use. Thanks to
5709        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
5710
5711    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
5712      * Added malloc_trim, with help from Wolfram Gloger
5713        (wmglo@Dent.MED.Uni-Muenchen.DE).
5714
5715    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
5716
5717    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
5718      * realloc: try to expand in both directions
5719      * malloc: swap order of clean-bin strategy;
5720      * realloc: only conditionally expand backwards
5721      * Try not to scavenge used bins
5722      * Use bin counts as a guide to preallocation
5723      * Occasionally bin return list chunks in first scan
5724      * Add a few optimizations from colin@nyx10.cs.du.edu
5725
5726    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
5727      * faster bin computation & slightly different binning
5728      * merged all consolidations to one part of malloc proper
5729         (eliminating old malloc_find_space & malloc_clean_bin)
5730      * Scan 2 returns chunks (not just 1)
5731      * Propagate failure in realloc if malloc returns 0
5732      * Add stuff to allow compilation on non-ANSI compilers
5733          from kpv@research.att.com
5734
5735    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
5736      * removed potential for odd address access in prev_chunk
5737      * removed dependency on getpagesize.h
5738      * misc cosmetics and a bit more internal documentation
5739      * anticosmetics: mangled names in macros to evade debugger strangeness
5740      * tested on sparc, hp-700, dec-mips, rs6000
5741          with gcc & native cc (hp, dec only) allowing
5742          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
5743
5744    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
5745      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
5746         structure of old version,  but most details differ.)
5747
5748*/
5749
5750