Home | History | Annotate | Line # | Download | only in stdlib
jemalloc.c revision 1.28.2.1
      1 /*	$NetBSD: jemalloc.c,v 1.28.2.1 2014/08/20 00:02:16 tls Exp $	*/
      2 
      3 /*-
      4  * Copyright (C) 2006,2007 Jason Evans <jasone (at) FreeBSD.org>.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice(s), this list of conditions and the following disclaimer as
     12  *    the first lines of this file unmodified other than the possible
     13  *    addition of one or more copyright notices.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice(s), this list of conditions and the following disclaimer in
     16  *    the documentation and/or other materials provided with the
     17  *    distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
     20  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
     23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     26  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     28  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     29  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  *
     31  *******************************************************************************
     32  *
     33  * This allocator implementation is designed to provide scalable performance
     34  * for multi-threaded programs on multi-processor systems.  The following
     35  * features are included for this purpose:
     36  *
     37  *   + Multiple arenas are used if there are multiple CPUs, which reduces lock
     38  *     contention and cache sloshing.
     39  *
     40  *   + Cache line sharing between arenas is avoided for internal data
     41  *     structures.
     42  *
     43  *   + Memory is managed in chunks and runs (chunks can be split into runs),
     44  *     rather than as individual pages.  This provides a constant-time
     45  *     mechanism for associating allocations with particular arenas.
     46  *
     47  * Allocation requests are rounded up to the nearest size class, and no record
     48  * of the original request size is maintained.  Allocations are broken into
     49  * categories according to size class.  Assuming runtime defaults, 4 kB pages
     50  * and a 16 byte quantum, the size classes in each category are as follows:
     51  *
     52  *   |=====================================|
     53  *   | Category | Subcategory    |    Size |
     54  *   |=====================================|
     55  *   | Small    | Tiny           |       2 |
     56  *   |          |                |       4 |
     57  *   |          |                |       8 |
     58  *   |          |----------------+---------|
     59  *   |          | Quantum-spaced |      16 |
     60  *   |          |                |      32 |
     61  *   |          |                |      48 |
     62  *   |          |                |     ... |
     63  *   |          |                |     480 |
     64  *   |          |                |     496 |
     65  *   |          |                |     512 |
     66  *   |          |----------------+---------|
     67  *   |          | Sub-page       |    1 kB |
     68  *   |          |                |    2 kB |
     69  *   |=====================================|
     70  *   | Large                     |    4 kB |
     71  *   |                           |    8 kB |
     72  *   |                           |   12 kB |
     73  *   |                           |     ... |
     74  *   |                           | 1012 kB |
     75  *   |                           | 1016 kB |
     76  *   |                           | 1020 kB |
     77  *   |=====================================|
     78  *   | Huge                      |    1 MB |
     79  *   |                           |    2 MB |
     80  *   |                           |    3 MB |
     81  *   |                           |     ... |
     82  *   |=====================================|
     83  *
     84  * A different mechanism is used for each category:
     85  *
     86  *   Small : Each size class is segregated into its own set of runs.  Each run
     87  *           maintains a bitmap of which regions are free/allocated.
     88  *
     89  *   Large : Each allocation is backed by a dedicated run.  Metadata are stored
     90  *           in the associated arena chunk header maps.
     91  *
     92  *   Huge : Each allocation is backed by a dedicated contiguous set of chunks.
     93  *          Metadata are stored in a separate red-black tree.
     94  *
     95  *******************************************************************************
     96  */
     97 
     98 /* LINTLIBRARY */
     99 
    100 #ifdef __NetBSD__
    101 #  define xutrace(a, b)		utrace("malloc", (a), (b))
    102 #  define __DECONST(x, y)	((x)__UNCONST(y))
    103 #  define NO_TLS
    104 #else
    105 #  define xutrace(a, b)		utrace((a), (b))
    106 #endif	/* __NetBSD__ */
    107 
    108 /*
    109  * MALLOC_PRODUCTION disables assertions and statistics gathering.  It also
    110  * defaults the A and J runtime options to off.  These settings are appropriate
    111  * for production systems.
    112  */
    113 #define MALLOC_PRODUCTION
    114 
    115 #ifndef MALLOC_PRODUCTION
    116 #  define MALLOC_DEBUG
    117 #endif
    118 
    119 #include <sys/cdefs.h>
    120 /* __FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.147 2007/06/15 22:00:16 jasone Exp $"); */
    121 __RCSID("$NetBSD: jemalloc.c,v 1.28.2.1 2014/08/20 00:02:16 tls Exp $");
    122 
    123 #ifdef __FreeBSD__
    124 #include "libc_private.h"
    125 #ifdef MALLOC_DEBUG
    126 #  define _LOCK_DEBUG
    127 #endif
    128 #include "spinlock.h"
    129 #endif
    130 #include "namespace.h"
    131 #include <sys/mman.h>
    132 #include <sys/param.h>
    133 #ifdef __FreeBSD__
    134 #include <sys/stddef.h>
    135 #endif
    136 #include <sys/time.h>
    137 #include <sys/types.h>
    138 #include <sys/sysctl.h>
    139 #include <sys/tree.h>
    140 #include <sys/uio.h>
    141 #include <sys/ktrace.h> /* Must come after several other sys/ includes. */
    142 
    143 #ifdef __FreeBSD__
    144 #include <machine/atomic.h>
    145 #include <machine/cpufunc.h>
    146 #endif
    147 #include <machine/vmparam.h>
    148 
    149 #include <errno.h>
    150 #include <limits.h>
    151 #include <pthread.h>
    152 #include <sched.h>
    153 #include <stdarg.h>
    154 #include <stdbool.h>
    155 #include <stdio.h>
    156 #include <stdint.h>
    157 #include <stdlib.h>
    158 #include <string.h>
    159 #include <strings.h>
    160 #include <unistd.h>
    161 
    162 #ifdef __NetBSD__
    163 #  include <reentrant.h>
    164 #  include "extern.h"
    165 
    166 #define STRERROR_R(a, b, c)	__strerror_r(a, b, c);
    167 /*
    168  * A non localized version of strerror, that avoids bringing in
    169  * stdio and the locale code. All the malloc messages are in English
    170  * so why bother?
    171  */
    172 static int
    173 __strerror_r(int e, char *s, size_t l)
    174 {
    175 	int rval;
    176 	size_t slen;
    177 
    178 	if (e >= 0 && e < sys_nerr) {
    179 		slen = strlcpy(s, sys_errlist[e], l);
    180 		rval = 0;
    181 	} else {
    182 		slen = snprintf_ss(s, l, "Unknown error %u", e);
    183 		rval = EINVAL;
    184 	}
    185 	return slen >= l ? ERANGE : rval;
    186 }
    187 #endif
    188 
    189 #ifdef __FreeBSD__
    190 #define STRERROR_R(a, b, c)	strerror_r(a, b, c);
    191 #include "un-namespace.h"
    192 #endif
    193 
    194 /* MALLOC_STATS enables statistics calculation. */
    195 #ifndef MALLOC_PRODUCTION
    196 #  define MALLOC_STATS
    197 #endif
    198 
    199 #ifdef MALLOC_DEBUG
    200 #  ifdef NDEBUG
    201 #    undef NDEBUG
    202 #  endif
    203 #else
    204 #  ifndef NDEBUG
    205 #    define NDEBUG
    206 #  endif
    207 #endif
    208 #include <assert.h>
    209 
    210 #ifdef MALLOC_DEBUG
    211    /* Disable inlining to make debugging easier. */
    212 #  define inline
    213 #endif
    214 
    215 /* Size of stack-allocated buffer passed to strerror_r(). */
    216 #define	STRERROR_BUF		64
    217 
    218 /* Minimum alignment of allocations is 2^QUANTUM_2POW_MIN bytes. */
    219 
    220 /*
    221  * If you touch the TINY_MIN_2POW definition for any architecture, please
    222  * make sure to adjust the corresponding definition for JEMALLOC_TINY_MIN_2POW
    223  * in the gcc 4.8 tree in dist/gcc/tree-ssa-ccp.c and verify that a native
    224  * gcc is still buildable!
    225  */
    226 
    227 #ifdef __i386__
    228 #  define QUANTUM_2POW_MIN	4
    229 #  define SIZEOF_PTR_2POW	2
    230 #  define USE_BRK
    231 #endif
    232 #ifdef __ia64__
    233 #  define QUANTUM_2POW_MIN	4
    234 #  define SIZEOF_PTR_2POW	3
    235 #endif
    236 #ifdef __aarch64__
    237 #  define QUANTUM_2POW_MIN	4
    238 #  define SIZEOF_PTR_2POW	3
    239 #  define NO_TLS
    240 #endif
    241 #ifdef __alpha__
    242 #  define QUANTUM_2POW_MIN	4
    243 #  define SIZEOF_PTR_2POW	3
    244 #  define TINY_MIN_2POW		3
    245 #  define NO_TLS
    246 #endif
    247 #ifdef __sparc64__
    248 #  define QUANTUM_2POW_MIN	4
    249 #  define SIZEOF_PTR_2POW	3
    250 #  define TINY_MIN_2POW		3
    251 #  define NO_TLS
    252 #endif
    253 #ifdef __amd64__
    254 #  define QUANTUM_2POW_MIN	4
    255 #  define SIZEOF_PTR_2POW	3
    256 #  define TINY_MIN_2POW		3
    257 #endif
    258 #ifdef __arm__
    259 #  define QUANTUM_2POW_MIN	3
    260 #  define SIZEOF_PTR_2POW	2
    261 #  define USE_BRK
    262 #  ifdef __ARM_EABI__
    263 #    define TINY_MIN_2POW	3
    264 #  endif
    265 #  define NO_TLS
    266 #endif
    267 #ifdef __powerpc__
    268 #  define QUANTUM_2POW_MIN	4
    269 #  define SIZEOF_PTR_2POW	2
    270 #  define USE_BRK
    271 #  define TINY_MIN_2POW		3
    272 #endif
    273 #if defined(__sparc__) && !defined(__sparc64__)
    274 #  define QUANTUM_2POW_MIN	4
    275 #  define SIZEOF_PTR_2POW	2
    276 #  define USE_BRK
    277 #endif
    278 #ifdef __vax__
    279 #  define QUANTUM_2POW_MIN	4
    280 #  define SIZEOF_PTR_2POW	2
    281 #  define USE_BRK
    282 #endif
    283 #ifdef __sh__
    284 #  define QUANTUM_2POW_MIN	4
    285 #  define SIZEOF_PTR_2POW	2
    286 #  define USE_BRK
    287 #endif
    288 #ifdef __m68k__
    289 #  define QUANTUM_2POW_MIN	4
    290 #  define SIZEOF_PTR_2POW	2
    291 #  define USE_BRK
    292 #endif
    293 #ifdef __mips__
    294 #  define QUANTUM_2POW_MIN	4
    295 #  define SIZEOF_PTR_2POW	2
    296 #  define USE_BRK
    297 #endif
    298 #ifdef __hppa__
    299 #  define QUANTUM_2POW_MIN     4
    300 #  define SIZEOF_PTR_2POW      2
    301 #  define USE_BRK
    302 #endif
    303 
    304 #define	SIZEOF_PTR		(1 << SIZEOF_PTR_2POW)
    305 
    306 /* sizeof(int) == (1 << SIZEOF_INT_2POW). */
    307 #ifndef SIZEOF_INT_2POW
    308 #  define SIZEOF_INT_2POW	2
    309 #endif
    310 
    311 /*
    312  * Size and alignment of memory chunks that are allocated by the OS's virtual
    313  * memory system.
    314  */
    315 #define	CHUNK_2POW_DEFAULT	20
    316 
    317 /*
    318  * Maximum size of L1 cache line.  This is used to avoid cache line aliasing,
    319  * so over-estimates are okay (up to a point), but under-estimates will
    320  * negatively affect performance.
    321  */
    322 #define	CACHELINE_2POW		6
    323 #define	CACHELINE		((size_t)(1 << CACHELINE_2POW))
    324 
    325 /* Smallest size class to support. */
    326 #ifndef TINY_MIN_2POW
    327 #define	TINY_MIN_2POW		2
    328 #endif
    329 
    330 /*
    331  * Maximum size class that is a multiple of the quantum, but not (necessarily)
    332  * a power of 2.  Above this size, allocations are rounded up to the nearest
    333  * power of 2.
    334  */
    335 #define	SMALL_MAX_2POW_DEFAULT	9
    336 #define	SMALL_MAX_DEFAULT	(1 << SMALL_MAX_2POW_DEFAULT)
    337 
    338 /*
    339  * RUN_MAX_OVRHD indicates maximum desired run header overhead.  Runs are sized
    340  * as small as possible such that this setting is still honored, without
    341  * violating other constraints.  The goal is to make runs as small as possible
    342  * without exceeding a per run external fragmentation threshold.
    343  *
    344  * We use binary fixed point math for overhead computations, where the binary
    345  * point is implicitly RUN_BFP bits to the left.
    346  *
    347  * Note that it is possible to set RUN_MAX_OVRHD low enough that it cannot be
    348  * honored for some/all object sizes, since there is one bit of header overhead
    349  * per object (plus a constant).  This constraint is relaxed (ignored) for runs
    350  * that are so small that the per-region overhead is greater than:
    351  *
    352  *   (RUN_MAX_OVRHD / (reg_size << (3+RUN_BFP))
    353  */
    354 #define RUN_BFP			12
    355 /*                              \/   Implicit binary fixed point. */
    356 #define RUN_MAX_OVRHD		0x0000003dU
    357 #define RUN_MAX_OVRHD_RELAX	0x00001800U
    358 
    359 /* Put a cap on small object run size.  This overrides RUN_MAX_OVRHD. */
    360 #define RUN_MAX_SMALL_2POW	15
    361 #define RUN_MAX_SMALL		(1 << RUN_MAX_SMALL_2POW)
    362 
    363 /******************************************************************************/
    364 
    365 #ifdef __FreeBSD__
    366 /*
    367  * Mutexes based on spinlocks.  We can't use normal pthread mutexes, because
    368  * they require malloc()ed memory.
    369  */
    370 typedef struct {
    371 	spinlock_t	lock;
    372 } malloc_mutex_t;
    373 
    374 /* Set to true once the allocator has been initialized. */
    375 static bool malloc_initialized = false;
    376 
    377 /* Used to avoid initialization races. */
    378 static malloc_mutex_t init_lock = {_SPINLOCK_INITIALIZER};
    379 #else
    380 #define	malloc_mutex_t	mutex_t
    381 
    382 /* Set to true once the allocator has been initialized. */
    383 static bool malloc_initialized = false;
    384 
    385 /* Used to avoid initialization races. */
    386 static mutex_t init_lock = MUTEX_INITIALIZER;
    387 #endif
    388 
    389 /******************************************************************************/
    390 /*
    391  * Statistics data structures.
    392  */
    393 
    394 #ifdef MALLOC_STATS
    395 
    396 typedef struct malloc_bin_stats_s malloc_bin_stats_t;
    397 struct malloc_bin_stats_s {
    398 	/*
    399 	 * Number of allocation requests that corresponded to the size of this
    400 	 * bin.
    401 	 */
    402 	uint64_t	nrequests;
    403 
    404 	/* Total number of runs created for this bin's size class. */
    405 	uint64_t	nruns;
    406 
    407 	/*
    408 	 * Total number of runs reused by extracting them from the runs tree for
    409 	 * this bin's size class.
    410 	 */
    411 	uint64_t	reruns;
    412 
    413 	/* High-water mark for this bin. */
    414 	unsigned long	highruns;
    415 
    416 	/* Current number of runs in this bin. */
    417 	unsigned long	curruns;
    418 };
    419 
    420 typedef struct arena_stats_s arena_stats_t;
    421 struct arena_stats_s {
    422 	/* Number of bytes currently mapped. */
    423 	size_t		mapped;
    424 
    425 	/* Per-size-category statistics. */
    426 	size_t		allocated_small;
    427 	uint64_t	nmalloc_small;
    428 	uint64_t	ndalloc_small;
    429 
    430 	size_t		allocated_large;
    431 	uint64_t	nmalloc_large;
    432 	uint64_t	ndalloc_large;
    433 };
    434 
    435 typedef struct chunk_stats_s chunk_stats_t;
    436 struct chunk_stats_s {
    437 	/* Number of chunks that were allocated. */
    438 	uint64_t	nchunks;
    439 
    440 	/* High-water mark for number of chunks allocated. */
    441 	unsigned long	highchunks;
    442 
    443 	/*
    444 	 * Current number of chunks allocated.  This value isn't maintained for
    445 	 * any other purpose, so keep track of it in order to be able to set
    446 	 * highchunks.
    447 	 */
    448 	unsigned long	curchunks;
    449 };
    450 
    451 #endif /* #ifdef MALLOC_STATS */
    452 
    453 /******************************************************************************/
    454 /*
    455  * Chunk data structures.
    456  */
    457 
    458 /* Tree of chunks. */
    459 typedef struct chunk_node_s chunk_node_t;
    460 struct chunk_node_s {
    461 	/* Linkage for the chunk tree. */
    462 	RB_ENTRY(chunk_node_s) link;
    463 
    464 	/*
    465 	 * Pointer to the chunk that this tree node is responsible for.  In some
    466 	 * (but certainly not all) cases, this data structure is placed at the
    467 	 * beginning of the corresponding chunk, so this field may point to this
    468 	 * node.
    469 	 */
    470 	void	*chunk;
    471 
    472 	/* Total chunk size. */
    473 	size_t	size;
    474 };
    475 typedef struct chunk_tree_s chunk_tree_t;
    476 RB_HEAD(chunk_tree_s, chunk_node_s);
    477 
    478 /******************************************************************************/
    479 /*
    480  * Arena data structures.
    481  */
    482 
    483 typedef struct arena_s arena_t;
    484 typedef struct arena_bin_s arena_bin_t;
    485 
    486 typedef struct arena_chunk_map_s arena_chunk_map_t;
    487 struct arena_chunk_map_s {
    488 	/* Number of pages in run. */
    489 	uint32_t	npages;
    490 	/*
    491 	 * Position within run.  For a free run, this is POS_FREE for the first
    492 	 * and last pages.  The POS_FREE special value makes it possible to
    493 	 * quickly coalesce free runs.
    494 	 *
    495 	 * This is the limiting factor for chunksize; there can be at most 2^31
    496 	 * pages in a run.
    497 	 */
    498 #define POS_FREE ((uint32_t)0xffffffffU)
    499 	uint32_t	pos;
    500 };
    501 
    502 /* Arena chunk header. */
    503 typedef struct arena_chunk_s arena_chunk_t;
    504 struct arena_chunk_s {
    505 	/* Arena that owns the chunk. */
    506 	arena_t *arena;
    507 
    508 	/* Linkage for the arena's chunk tree. */
    509 	RB_ENTRY(arena_chunk_s) link;
    510 
    511 	/*
    512 	 * Number of pages in use.  This is maintained in order to make
    513 	 * detection of empty chunks fast.
    514 	 */
    515 	uint32_t pages_used;
    516 
    517 	/*
    518 	 * Every time a free run larger than this value is created/coalesced,
    519 	 * this value is increased.  The only way that the value decreases is if
    520 	 * arena_run_alloc() fails to find a free run as large as advertised by
    521 	 * this value.
    522 	 */
    523 	uint32_t max_frun_npages;
    524 
    525 	/*
    526 	 * Every time a free run that starts at an earlier page than this value
    527 	 * is created/coalesced, this value is decreased.  It is reset in a
    528 	 * similar fashion to max_frun_npages.
    529 	 */
    530 	uint32_t min_frun_ind;
    531 
    532 	/*
    533 	 * Map of pages within chunk that keeps track of free/large/small.  For
    534 	 * free runs, only the map entries for the first and last pages are
    535 	 * kept up to date, so that free runs can be quickly coalesced.
    536 	 */
    537 	arena_chunk_map_t map[1]; /* Dynamically sized. */
    538 };
    539 typedef struct arena_chunk_tree_s arena_chunk_tree_t;
    540 RB_HEAD(arena_chunk_tree_s, arena_chunk_s);
    541 
    542 typedef struct arena_run_s arena_run_t;
    543 struct arena_run_s {
    544 	/* Linkage for run trees. */
    545 	RB_ENTRY(arena_run_s) link;
    546 
    547 #ifdef MALLOC_DEBUG
    548 	uint32_t	magic;
    549 #  define ARENA_RUN_MAGIC 0x384adf93
    550 #endif
    551 
    552 	/* Bin this run is associated with. */
    553 	arena_bin_t	*bin;
    554 
    555 	/* Index of first element that might have a free region. */
    556 	unsigned	regs_minelm;
    557 
    558 	/* Number of free regions in run. */
    559 	unsigned	nfree;
    560 
    561 	/* Bitmask of in-use regions (0: in use, 1: free). */
    562 	unsigned	regs_mask[1]; /* Dynamically sized. */
    563 };
    564 typedef struct arena_run_tree_s arena_run_tree_t;
    565 RB_HEAD(arena_run_tree_s, arena_run_s);
    566 
    567 struct arena_bin_s {
    568 	/*
    569 	 * Current run being used to service allocations of this bin's size
    570 	 * class.
    571 	 */
    572 	arena_run_t	*runcur;
    573 
    574 	/*
    575 	 * Tree of non-full runs.  This tree is used when looking for an
    576 	 * existing run when runcur is no longer usable.  We choose the
    577 	 * non-full run that is lowest in memory; this policy tends to keep
    578 	 * objects packed well, and it can also help reduce the number of
    579 	 * almost-empty chunks.
    580 	 */
    581 	arena_run_tree_t runs;
    582 
    583 	/* Size of regions in a run for this bin's size class. */
    584 	size_t		reg_size;
    585 
    586 	/* Total size of a run for this bin's size class. */
    587 	size_t		run_size;
    588 
    589 	/* Total number of regions in a run for this bin's size class. */
    590 	uint32_t	nregs;
    591 
    592 	/* Number of elements in a run's regs_mask for this bin's size class. */
    593 	uint32_t	regs_mask_nelms;
    594 
    595 	/* Offset of first region in a run for this bin's size class. */
    596 	uint32_t	reg0_offset;
    597 
    598 #ifdef MALLOC_STATS
    599 	/* Bin statistics. */
    600 	malloc_bin_stats_t stats;
    601 #endif
    602 };
    603 
    604 struct arena_s {
    605 #ifdef MALLOC_DEBUG
    606 	uint32_t		magic;
    607 #  define ARENA_MAGIC 0x947d3d24
    608 #endif
    609 
    610 	/* All operations on this arena require that mtx be locked. */
    611 	malloc_mutex_t		mtx;
    612 
    613 #ifdef MALLOC_STATS
    614 	arena_stats_t		stats;
    615 #endif
    616 
    617 	/*
    618 	 * Tree of chunks this arena manages.
    619 	 */
    620 	arena_chunk_tree_t	chunks;
    621 
    622 	/*
    623 	 * In order to avoid rapid chunk allocation/deallocation when an arena
    624 	 * oscillates right on the cusp of needing a new chunk, cache the most
    625 	 * recently freed chunk.  This caching is disabled by opt_hint.
    626 	 *
    627 	 * There is one spare chunk per arena, rather than one spare total, in
    628 	 * order to avoid interactions between multiple threads that could make
    629 	 * a single spare inadequate.
    630 	 */
    631 	arena_chunk_t *spare;
    632 
    633 	/*
    634 	 * bins is used to store rings of free regions of the following sizes,
    635 	 * assuming a 16-byte quantum, 4kB pagesize, and default MALLOC_OPTIONS.
    636 	 *
    637 	 *   bins[i] | size |
    638 	 *   --------+------+
    639 	 *        0  |    2 |
    640 	 *        1  |    4 |
    641 	 *        2  |    8 |
    642 	 *   --------+------+
    643 	 *        3  |   16 |
    644 	 *        4  |   32 |
    645 	 *        5  |   48 |
    646 	 *        6  |   64 |
    647 	 *           :      :
    648 	 *           :      :
    649 	 *       33  |  496 |
    650 	 *       34  |  512 |
    651 	 *   --------+------+
    652 	 *       35  | 1024 |
    653 	 *       36  | 2048 |
    654 	 *   --------+------+
    655 	 */
    656 	arena_bin_t		bins[1]; /* Dynamically sized. */
    657 };
    658 
    659 /******************************************************************************/
    660 /*
    661  * Data.
    662  */
    663 
    664 /* Number of CPUs. */
    665 static unsigned		ncpus;
    666 
    667 /* VM page size. */
    668 static size_t		pagesize;
    669 static size_t		pagesize_mask;
    670 static int		pagesize_2pow;
    671 
    672 /* Various bin-related settings. */
    673 static size_t		bin_maxclass; /* Max size class for bins. */
    674 static unsigned		ntbins; /* Number of (2^n)-spaced tiny bins. */
    675 static unsigned		nqbins; /* Number of quantum-spaced bins. */
    676 static unsigned		nsbins; /* Number of (2^n)-spaced sub-page bins. */
    677 static size_t		small_min;
    678 static size_t		small_max;
    679 
    680 /* Various quantum-related settings. */
    681 static size_t		quantum;
    682 static size_t		quantum_mask; /* (quantum - 1). */
    683 
    684 /* Various chunk-related settings. */
    685 static size_t		chunksize;
    686 static size_t		chunksize_mask; /* (chunksize - 1). */
    687 static int		chunksize_2pow;
    688 static unsigned		chunk_npages;
    689 static unsigned		arena_chunk_header_npages;
    690 static size_t		arena_maxclass; /* Max size class for arenas. */
    691 
    692 /********/
    693 /*
    694  * Chunks.
    695  */
    696 
    697 /* Protects chunk-related data structures. */
    698 static malloc_mutex_t	chunks_mtx;
    699 
    700 /* Tree of chunks that are stand-alone huge allocations. */
    701 static chunk_tree_t	huge;
    702 
    703 #ifdef USE_BRK
    704 /*
    705  * Try to use brk for chunk-size allocations, due to address space constraints.
    706  */
    707 /*
    708  * Protects sbrk() calls.  This must be separate from chunks_mtx, since
    709  * base_pages_alloc() also uses sbrk(), but cannot lock chunks_mtx (doing so
    710  * could cause recursive lock acquisition).
    711  */
    712 static malloc_mutex_t	brk_mtx;
    713 /* Result of first sbrk(0) call. */
    714 static void		*brk_base;
    715 /* Current end of brk, or ((void *)-1) if brk is exhausted. */
    716 static void		*brk_prev;
    717 /* Current upper limit on brk addresses. */
    718 static void		*brk_max;
    719 #endif
    720 
    721 #ifdef MALLOC_STATS
    722 /* Huge allocation statistics. */
    723 static uint64_t		huge_nmalloc;
    724 static uint64_t		huge_ndalloc;
    725 static uint64_t		huge_nralloc;
    726 static size_t		huge_allocated;
    727 #endif
    728 
    729 /*
    730  * Tree of chunks that were previously allocated.  This is used when allocating
    731  * chunks, in an attempt to re-use address space.
    732  */
    733 static chunk_tree_t	old_chunks;
    734 
    735 /****************************/
    736 /*
    737  * base (internal allocation).
    738  */
    739 
    740 /*
    741  * Current pages that are being used for internal memory allocations.  These
    742  * pages are carved up in cacheline-size quanta, so that there is no chance of
    743  * false cache line sharing.
    744  */
    745 static void		*base_pages;
    746 static void		*base_next_addr;
    747 static void		*base_past_addr; /* Addr immediately past base_pages. */
    748 static chunk_node_t	*base_chunk_nodes; /* LIFO cache of chunk nodes. */
    749 static malloc_mutex_t	base_mtx;
    750 #ifdef MALLOC_STATS
    751 static size_t		base_mapped;
    752 #endif
    753 
    754 /********/
    755 /*
    756  * Arenas.
    757  */
    758 
    759 /*
    760  * Arenas that are used to service external requests.  Not all elements of the
    761  * arenas array are necessarily used; arenas are created lazily as needed.
    762  */
    763 static arena_t		**arenas;
    764 static unsigned		narenas;
    765 static unsigned		next_arena;
    766 static malloc_mutex_t	arenas_mtx; /* Protects arenas initialization. */
    767 
    768 #ifndef NO_TLS
    769 /*
    770  * Map of pthread_self() --> arenas[???], used for selecting an arena to use
    771  * for allocations.
    772  */
    773 static __thread arena_t	*arenas_map;
    774 #define	get_arenas_map()	(arenas_map)
    775 #define	set_arenas_map(x)	(arenas_map = x)
    776 #else
    777 static thread_key_t arenas_map_key;
    778 #define	get_arenas_map()	thr_getspecific(arenas_map_key)
    779 #define	set_arenas_map(x)	thr_setspecific(arenas_map_key, x)
    780 #endif
    781 
    782 #ifdef MALLOC_STATS
    783 /* Chunk statistics. */
    784 static chunk_stats_t	stats_chunks;
    785 #endif
    786 
    787 /*******************************/
    788 /*
    789  * Runtime configuration options.
    790  */
    791 const char	*_malloc_options;
    792 
    793 #ifndef MALLOC_PRODUCTION
    794 static bool	opt_abort = true;
    795 static bool	opt_junk = true;
    796 #else
    797 static bool	opt_abort = false;
    798 static bool	opt_junk = false;
    799 #endif
    800 static bool	opt_hint = false;
    801 static bool	opt_print_stats = false;
    802 static int	opt_quantum_2pow = QUANTUM_2POW_MIN;
    803 static int	opt_small_max_2pow = SMALL_MAX_2POW_DEFAULT;
    804 static int	opt_chunk_2pow = CHUNK_2POW_DEFAULT;
    805 static bool	opt_utrace = false;
    806 static bool	opt_sysv = false;
    807 static bool	opt_xmalloc = false;
    808 static bool	opt_zero = false;
    809 static int32_t	opt_narenas_lshift = 0;
    810 
    811 typedef struct {
    812 	void	*p;
    813 	size_t	s;
    814 	void	*r;
    815 } malloc_utrace_t;
    816 
    817 #define	UTRACE(a, b, c)							\
    818 	if (opt_utrace) {						\
    819 		malloc_utrace_t ut;					\
    820 		ut.p = a;						\
    821 		ut.s = b;						\
    822 		ut.r = c;						\
    823 		xutrace(&ut, sizeof(ut));				\
    824 	}
    825 
    826 /******************************************************************************/
    827 /*
    828  * Begin function prototypes for non-inline static functions.
    829  */
    830 
    831 static void	wrtmessage(const char *p1, const char *p2, const char *p3,
    832 		const char *p4);
    833 #ifdef MALLOC_STATS
    834 static void	malloc_printf(const char *format, ...);
    835 #endif
    836 static char	*size_t2s(size_t x, char *s);
    837 static bool	base_pages_alloc(size_t minsize);
    838 static void	*base_alloc(size_t size);
    839 static chunk_node_t *base_chunk_node_alloc(void);
    840 static void	base_chunk_node_dealloc(chunk_node_t *node);
    841 #ifdef MALLOC_STATS
    842 static void	stats_print(arena_t *arena);
    843 #endif
    844 static void	*pages_map(void *addr, size_t size);
    845 static void	*pages_map_align(void *addr, size_t size, int align);
    846 static void	pages_unmap(void *addr, size_t size);
    847 static void	*chunk_alloc(size_t size);
    848 static void	chunk_dealloc(void *chunk, size_t size);
    849 static void	arena_run_split(arena_t *arena, arena_run_t *run, size_t size);
    850 static arena_chunk_t *arena_chunk_alloc(arena_t *arena);
    851 static void	arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk);
    852 static arena_run_t *arena_run_alloc(arena_t *arena, size_t size);
    853 static void	arena_run_dalloc(arena_t *arena, arena_run_t *run, size_t size);
    854 static arena_run_t *arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin);
    855 static void *arena_bin_malloc_hard(arena_t *arena, arena_bin_t *bin);
    856 static size_t arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size);
    857 static void	*arena_malloc(arena_t *arena, size_t size);
    858 static void	*arena_palloc(arena_t *arena, size_t alignment, size_t size,
    859     size_t alloc_size);
    860 static size_t	arena_salloc(const void *ptr);
    861 static void	*arena_ralloc(void *ptr, size_t size, size_t oldsize);
    862 static void	arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr);
    863 static bool	arena_new(arena_t *arena);
    864 static arena_t	*arenas_extend(unsigned ind);
    865 static void	*huge_malloc(size_t size);
    866 static void	*huge_palloc(size_t alignment, size_t size);
    867 static void	*huge_ralloc(void *ptr, size_t size, size_t oldsize);
    868 static void	huge_dalloc(void *ptr);
    869 static void	*imalloc(size_t size);
    870 static void	*ipalloc(size_t alignment, size_t size);
    871 static void	*icalloc(size_t size);
    872 static size_t	isalloc(const void *ptr);
    873 static void	*iralloc(void *ptr, size_t size);
    874 static void	idalloc(void *ptr);
    875 static void	malloc_print_stats(void);
    876 static bool	malloc_init_hard(void);
    877 
    878 /*
    879  * End function prototypes.
    880  */
    881 /******************************************************************************/
    882 /*
    883  * Begin mutex.
    884  */
    885 
    886 #ifdef __NetBSD__
    887 #define	malloc_mutex_init(m)	mutex_init(m, NULL)
    888 #define	malloc_mutex_lock(m)	mutex_lock(m)
    889 #define	malloc_mutex_unlock(m)	mutex_unlock(m)
    890 #else	/* __NetBSD__ */
    891 static inline void
    892 malloc_mutex_init(malloc_mutex_t *a_mutex)
    893 {
    894 	static const spinlock_t lock = _SPINLOCK_INITIALIZER;
    895 
    896 	a_mutex->lock = lock;
    897 }
    898 
    899 static inline void
    900 malloc_mutex_lock(malloc_mutex_t *a_mutex)
    901 {
    902 
    903 	if (__isthreaded)
    904 		_SPINLOCK(&a_mutex->lock);
    905 }
    906 
    907 static inline void
    908 malloc_mutex_unlock(malloc_mutex_t *a_mutex)
    909 {
    910 
    911 	if (__isthreaded)
    912 		_SPINUNLOCK(&a_mutex->lock);
    913 }
    914 #endif	/* __NetBSD__ */
    915 
    916 /*
    917  * End mutex.
    918  */
    919 /******************************************************************************/
    920 /*
    921  * Begin Utility functions/macros.
    922  */
    923 
    924 /* Return the chunk address for allocation address a. */
    925 #define	CHUNK_ADDR2BASE(a)						\
    926 	((void *)((uintptr_t)(a) & ~chunksize_mask))
    927 
    928 /* Return the chunk offset of address a. */
    929 #define	CHUNK_ADDR2OFFSET(a)						\
    930 	((size_t)((uintptr_t)(a) & chunksize_mask))
    931 
    932 /* Return the smallest chunk multiple that is >= s. */
    933 #define	CHUNK_CEILING(s)						\
    934 	(((s) + chunksize_mask) & ~chunksize_mask)
    935 
    936 /* Return the smallest cacheline multiple that is >= s. */
    937 #define	CACHELINE_CEILING(s)						\
    938 	(((s) + (CACHELINE - 1)) & ~(CACHELINE - 1))
    939 
    940 /* Return the smallest quantum multiple that is >= a. */
    941 #define	QUANTUM_CEILING(a)						\
    942 	(((a) + quantum_mask) & ~quantum_mask)
    943 
    944 /* Return the smallest pagesize multiple that is >= s. */
    945 #define	PAGE_CEILING(s)							\
    946 	(((s) + pagesize_mask) & ~pagesize_mask)
    947 
    948 /* Compute the smallest power of 2 that is >= x. */
    949 static inline size_t
    950 pow2_ceil(size_t x)
    951 {
    952 
    953 	x--;
    954 	x |= x >> 1;
    955 	x |= x >> 2;
    956 	x |= x >> 4;
    957 	x |= x >> 8;
    958 	x |= x >> 16;
    959 #if (SIZEOF_PTR == 8)
    960 	x |= x >> 32;
    961 #endif
    962 	x++;
    963 	return (x);
    964 }
    965 
    966 static void
    967 wrtmessage(const char *p1, const char *p2, const char *p3, const char *p4)
    968 {
    969 
    970 	write(STDERR_FILENO, p1, strlen(p1));
    971 	write(STDERR_FILENO, p2, strlen(p2));
    972 	write(STDERR_FILENO, p3, strlen(p3));
    973 	write(STDERR_FILENO, p4, strlen(p4));
    974 }
    975 
    976 void	(*_malloc_message)(const char *p1, const char *p2, const char *p3,
    977 	    const char *p4) = wrtmessage;
    978 
    979 #ifdef MALLOC_STATS
    980 /*
    981  * Print to stderr in such a way as to (hopefully) avoid memory allocation.
    982  */
    983 static void
    984 malloc_printf(const char *format, ...)
    985 {
    986 	char buf[4096];
    987 	va_list ap;
    988 
    989 	va_start(ap, format);
    990 	vsnprintf(buf, sizeof(buf), format, ap);
    991 	va_end(ap);
    992 	_malloc_message(buf, "", "", "");
    993 }
    994 #endif
    995 
    996 /*
    997  * We don't want to depend on vsnprintf() for production builds, since that can
    998  * cause unnecessary bloat for static binaries.  size_t2s() provides minimal
    999  * integer printing functionality, so that malloc_printf() use can be limited to
   1000  * MALLOC_STATS code.
   1001  */
   1002 #define UMAX2S_BUFSIZE	21
   1003 static char *
   1004 size_t2s(size_t x, char *s)
   1005 {
   1006 	unsigned i;
   1007 
   1008 	/* Make sure UMAX2S_BUFSIZE is large enough. */
   1009 	/* LINTED */
   1010 	assert(sizeof(size_t) <= 8);
   1011 
   1012 	i = UMAX2S_BUFSIZE - 1;
   1013 	s[i] = '\0';
   1014 	do {
   1015 		i--;
   1016 		s[i] = "0123456789"[(int)x % 10];
   1017 		x /= (uintmax_t)10LL;
   1018 	} while (x > 0);
   1019 
   1020 	return (&s[i]);
   1021 }
   1022 
   1023 /******************************************************************************/
   1024 
   1025 static bool
   1026 base_pages_alloc(size_t minsize)
   1027 {
   1028 	size_t csize = 0;
   1029 
   1030 #ifdef USE_BRK
   1031 	/*
   1032 	 * Do special brk allocation here, since base allocations don't need to
   1033 	 * be chunk-aligned.
   1034 	 */
   1035 	if (brk_prev != (void *)-1) {
   1036 		void *brk_cur;
   1037 		intptr_t incr;
   1038 
   1039 		if (minsize != 0)
   1040 			csize = CHUNK_CEILING(minsize);
   1041 
   1042 		malloc_mutex_lock(&brk_mtx);
   1043 		do {
   1044 			/* Get the current end of brk. */
   1045 			brk_cur = sbrk(0);
   1046 
   1047 			/*
   1048 			 * Calculate how much padding is necessary to
   1049 			 * chunk-align the end of brk.  Don't worry about
   1050 			 * brk_cur not being chunk-aligned though.
   1051 			 */
   1052 			incr = (intptr_t)chunksize
   1053 			    - (intptr_t)CHUNK_ADDR2OFFSET(brk_cur);
   1054 			assert(incr >= 0);
   1055 			if ((size_t)incr < minsize)
   1056 				incr += csize;
   1057 
   1058 			brk_prev = sbrk(incr);
   1059 			if (brk_prev == brk_cur) {
   1060 				/* Success. */
   1061 				malloc_mutex_unlock(&brk_mtx);
   1062 				base_pages = brk_cur;
   1063 				base_next_addr = base_pages;
   1064 				base_past_addr = (void *)((uintptr_t)base_pages
   1065 				    + incr);
   1066 #ifdef MALLOC_STATS
   1067 				base_mapped += incr;
   1068 #endif
   1069 				return (false);
   1070 			}
   1071 		} while (brk_prev != (void *)-1);
   1072 		malloc_mutex_unlock(&brk_mtx);
   1073 	}
   1074 	if (minsize == 0) {
   1075 		/*
   1076 		 * Failure during initialization doesn't matter, so avoid
   1077 		 * falling through to the mmap-based page mapping code.
   1078 		 */
   1079 		return (true);
   1080 	}
   1081 #endif
   1082 	assert(minsize != 0);
   1083 	csize = PAGE_CEILING(minsize);
   1084 	base_pages = pages_map(NULL, csize);
   1085 	if (base_pages == NULL)
   1086 		return (true);
   1087 	base_next_addr = base_pages;
   1088 	base_past_addr = (void *)((uintptr_t)base_pages + csize);
   1089 #ifdef MALLOC_STATS
   1090 	base_mapped += csize;
   1091 #endif
   1092 	return (false);
   1093 }
   1094 
   1095 static void *
   1096 base_alloc(size_t size)
   1097 {
   1098 	void *ret;
   1099 	size_t csize;
   1100 
   1101 	/* Round size up to nearest multiple of the cacheline size. */
   1102 	csize = CACHELINE_CEILING(size);
   1103 
   1104 	malloc_mutex_lock(&base_mtx);
   1105 
   1106 	/* Make sure there's enough space for the allocation. */
   1107 	if ((uintptr_t)base_next_addr + csize > (uintptr_t)base_past_addr) {
   1108 		if (base_pages_alloc(csize)) {
   1109 			ret = NULL;
   1110 			goto RETURN;
   1111 		}
   1112 	}
   1113 
   1114 	/* Allocate. */
   1115 	ret = base_next_addr;
   1116 	base_next_addr = (void *)((uintptr_t)base_next_addr + csize);
   1117 
   1118 RETURN:
   1119 	malloc_mutex_unlock(&base_mtx);
   1120 	return (ret);
   1121 }
   1122 
   1123 static chunk_node_t *
   1124 base_chunk_node_alloc(void)
   1125 {
   1126 	chunk_node_t *ret;
   1127 
   1128 	malloc_mutex_lock(&base_mtx);
   1129 	if (base_chunk_nodes != NULL) {
   1130 		ret = base_chunk_nodes;
   1131 		/* LINTED */
   1132 		base_chunk_nodes = *(chunk_node_t **)ret;
   1133 		malloc_mutex_unlock(&base_mtx);
   1134 	} else {
   1135 		malloc_mutex_unlock(&base_mtx);
   1136 		ret = (chunk_node_t *)base_alloc(sizeof(chunk_node_t));
   1137 	}
   1138 
   1139 	return (ret);
   1140 }
   1141 
   1142 static void
   1143 base_chunk_node_dealloc(chunk_node_t *node)
   1144 {
   1145 
   1146 	malloc_mutex_lock(&base_mtx);
   1147 	/* LINTED */
   1148 	*(chunk_node_t **)node = base_chunk_nodes;
   1149 	base_chunk_nodes = node;
   1150 	malloc_mutex_unlock(&base_mtx);
   1151 }
   1152 
   1153 /******************************************************************************/
   1154 
   1155 #ifdef MALLOC_STATS
   1156 static void
   1157 stats_print(arena_t *arena)
   1158 {
   1159 	unsigned i;
   1160 	int gap_start;
   1161 
   1162 	malloc_printf(
   1163 	    "          allocated/mapped            nmalloc      ndalloc\n");
   1164 
   1165 	malloc_printf("small: %12zu %-12s %12llu %12llu\n",
   1166 	    arena->stats.allocated_small, "", arena->stats.nmalloc_small,
   1167 	    arena->stats.ndalloc_small);
   1168 	malloc_printf("large: %12zu %-12s %12llu %12llu\n",
   1169 	    arena->stats.allocated_large, "", arena->stats.nmalloc_large,
   1170 	    arena->stats.ndalloc_large);
   1171 	malloc_printf("total: %12zu/%-12zu %12llu %12llu\n",
   1172 	    arena->stats.allocated_small + arena->stats.allocated_large,
   1173 	    arena->stats.mapped,
   1174 	    arena->stats.nmalloc_small + arena->stats.nmalloc_large,
   1175 	    arena->stats.ndalloc_small + arena->stats.ndalloc_large);
   1176 
   1177 	malloc_printf("bins:     bin   size regs pgs  requests   newruns"
   1178 	    "    reruns maxruns curruns\n");
   1179 	for (i = 0, gap_start = -1; i < ntbins + nqbins + nsbins; i++) {
   1180 		if (arena->bins[i].stats.nrequests == 0) {
   1181 			if (gap_start == -1)
   1182 				gap_start = i;
   1183 		} else {
   1184 			if (gap_start != -1) {
   1185 				if (i > gap_start + 1) {
   1186 					/* Gap of more than one size class. */
   1187 					malloc_printf("[%u..%u]\n",
   1188 					    gap_start, i - 1);
   1189 				} else {
   1190 					/* Gap of one size class. */
   1191 					malloc_printf("[%u]\n", gap_start);
   1192 				}
   1193 				gap_start = -1;
   1194 			}
   1195 			malloc_printf(
   1196 			    "%13u %1s %4u %4u %3u %9llu %9llu"
   1197 			    " %9llu %7lu %7lu\n",
   1198 			    i,
   1199 			    i < ntbins ? "T" : i < ntbins + nqbins ? "Q" : "S",
   1200 			    arena->bins[i].reg_size,
   1201 			    arena->bins[i].nregs,
   1202 			    arena->bins[i].run_size >> pagesize_2pow,
   1203 			    arena->bins[i].stats.nrequests,
   1204 			    arena->bins[i].stats.nruns,
   1205 			    arena->bins[i].stats.reruns,
   1206 			    arena->bins[i].stats.highruns,
   1207 			    arena->bins[i].stats.curruns);
   1208 		}
   1209 	}
   1210 	if (gap_start != -1) {
   1211 		if (i > gap_start + 1) {
   1212 			/* Gap of more than one size class. */
   1213 			malloc_printf("[%u..%u]\n", gap_start, i - 1);
   1214 		} else {
   1215 			/* Gap of one size class. */
   1216 			malloc_printf("[%u]\n", gap_start);
   1217 		}
   1218 	}
   1219 }
   1220 #endif
   1221 
   1222 /*
   1223  * End Utility functions/macros.
   1224  */
   1225 /******************************************************************************/
   1226 /*
   1227  * Begin chunk management functions.
   1228  */
   1229 
   1230 #ifndef lint
   1231 static inline int
   1232 chunk_comp(chunk_node_t *a, chunk_node_t *b)
   1233 {
   1234 
   1235 	assert(a != NULL);
   1236 	assert(b != NULL);
   1237 
   1238 	if ((uintptr_t)a->chunk < (uintptr_t)b->chunk)
   1239 		return (-1);
   1240 	else if (a->chunk == b->chunk)
   1241 		return (0);
   1242 	else
   1243 		return (1);
   1244 }
   1245 
   1246 /* Generate red-black tree code for chunks. */
   1247 RB_GENERATE_STATIC(chunk_tree_s, chunk_node_s, link, chunk_comp);
   1248 #endif
   1249 
   1250 static void *
   1251 pages_map_align(void *addr, size_t size, int align)
   1252 {
   1253 	void *ret;
   1254 
   1255 	/*
   1256 	 * We don't use MAP_FIXED here, because it can cause the *replacement*
   1257 	 * of existing mappings, and we only want to create new mappings.
   1258 	 */
   1259 	ret = mmap(addr, size, PROT_READ | PROT_WRITE,
   1260 	    MAP_PRIVATE | MAP_ANON | MAP_ALIGNED(align), -1, 0);
   1261 	assert(ret != NULL);
   1262 
   1263 	if (ret == MAP_FAILED)
   1264 		ret = NULL;
   1265 	else if (addr != NULL && ret != addr) {
   1266 		/*
   1267 		 * We succeeded in mapping memory, but not in the right place.
   1268 		 */
   1269 		if (munmap(ret, size) == -1) {
   1270 			char buf[STRERROR_BUF];
   1271 
   1272 			STRERROR_R(errno, buf, sizeof(buf));
   1273 			_malloc_message(getprogname(),
   1274 			    ": (malloc) Error in munmap(): ", buf, "\n");
   1275 			if (opt_abort)
   1276 				abort();
   1277 		}
   1278 		ret = NULL;
   1279 	}
   1280 
   1281 	assert(ret == NULL || (addr == NULL && ret != addr)
   1282 	    || (addr != NULL && ret == addr));
   1283 	return (ret);
   1284 }
   1285 
   1286 static void *
   1287 pages_map(void *addr, size_t size)
   1288 {
   1289 
   1290 	return pages_map_align(addr, size, 0);
   1291 }
   1292 
   1293 static void
   1294 pages_unmap(void *addr, size_t size)
   1295 {
   1296 
   1297 	if (munmap(addr, size) == -1) {
   1298 		char buf[STRERROR_BUF];
   1299 
   1300 		STRERROR_R(errno, buf, sizeof(buf));
   1301 		_malloc_message(getprogname(),
   1302 		    ": (malloc) Error in munmap(): ", buf, "\n");
   1303 		if (opt_abort)
   1304 			abort();
   1305 	}
   1306 }
   1307 
   1308 static void *
   1309 chunk_alloc(size_t size)
   1310 {
   1311 	void *ret, *chunk;
   1312 	chunk_node_t *tchunk, *delchunk;
   1313 
   1314 	assert(size != 0);
   1315 	assert((size & chunksize_mask) == 0);
   1316 
   1317 	malloc_mutex_lock(&chunks_mtx);
   1318 
   1319 	if (size == chunksize) {
   1320 		/*
   1321 		 * Check for address ranges that were previously chunks and try
   1322 		 * to use them.
   1323 		 */
   1324 
   1325 		/* LINTED */
   1326 		tchunk = RB_MIN(chunk_tree_s, &old_chunks);
   1327 		while (tchunk != NULL) {
   1328 			/* Found an address range.  Try to recycle it. */
   1329 
   1330 			chunk = tchunk->chunk;
   1331 			delchunk = tchunk;
   1332 			/* LINTED */
   1333 			tchunk = RB_NEXT(chunk_tree_s, &old_chunks, delchunk);
   1334 
   1335 			/* Remove delchunk from the tree. */
   1336 			/* LINTED */
   1337 			RB_REMOVE(chunk_tree_s, &old_chunks, delchunk);
   1338 			base_chunk_node_dealloc(delchunk);
   1339 
   1340 #ifdef USE_BRK
   1341 			if ((uintptr_t)chunk >= (uintptr_t)brk_base
   1342 			    && (uintptr_t)chunk < (uintptr_t)brk_max) {
   1343 				/* Re-use a previously freed brk chunk. */
   1344 				ret = chunk;
   1345 				goto RETURN;
   1346 			}
   1347 #endif
   1348 			if ((ret = pages_map(chunk, size)) != NULL) {
   1349 				/* Success. */
   1350 				goto RETURN;
   1351 			}
   1352 		}
   1353 	}
   1354 
   1355 	/*
   1356 	 * Try to over-allocate, but allow the OS to place the allocation
   1357 	 * anywhere.  Beware of size_t wrap-around.
   1358 	 */
   1359 	if (size + chunksize > size) {
   1360 		if ((ret = pages_map_align(NULL, size, chunksize_2pow))
   1361 		    != NULL) {
   1362 			goto RETURN;
   1363 		}
   1364 	}
   1365 
   1366 #ifdef USE_BRK
   1367 	/*
   1368 	 * Try to create allocations in brk, in order to make full use of
   1369 	 * limited address space.
   1370 	 */
   1371 	if (brk_prev != (void *)-1) {
   1372 		void *brk_cur;
   1373 		intptr_t incr;
   1374 
   1375 		/*
   1376 		 * The loop is necessary to recover from races with other
   1377 		 * threads that are using brk for something other than malloc.
   1378 		 */
   1379 		malloc_mutex_lock(&brk_mtx);
   1380 		do {
   1381 			/* Get the current end of brk. */
   1382 			brk_cur = sbrk(0);
   1383 
   1384 			/*
   1385 			 * Calculate how much padding is necessary to
   1386 			 * chunk-align the end of brk.
   1387 			 */
   1388 			incr = (intptr_t)size
   1389 			    - (intptr_t)CHUNK_ADDR2OFFSET(brk_cur);
   1390 			if (incr == (intptr_t)size) {
   1391 				ret = brk_cur;
   1392 			} else {
   1393 				ret = (void *)((intptr_t)brk_cur + incr);
   1394 				incr += size;
   1395 			}
   1396 
   1397 			brk_prev = sbrk(incr);
   1398 			if (brk_prev == brk_cur) {
   1399 				/* Success. */
   1400 				malloc_mutex_unlock(&brk_mtx);
   1401 				brk_max = (void *)((intptr_t)ret + size);
   1402 				goto RETURN;
   1403 			}
   1404 		} while (brk_prev != (void *)-1);
   1405 		malloc_mutex_unlock(&brk_mtx);
   1406 	}
   1407 #endif
   1408 
   1409 	/* All strategies for allocation failed. */
   1410 	ret = NULL;
   1411 RETURN:
   1412 	if (ret != NULL) {
   1413 		chunk_node_t key;
   1414 		/*
   1415 		 * Clean out any entries in old_chunks that overlap with the
   1416 		 * memory we just allocated.
   1417 		 */
   1418 		key.chunk = ret;
   1419 		/* LINTED */
   1420 		tchunk = RB_NFIND(chunk_tree_s, &old_chunks, &key);
   1421 		while (tchunk != NULL
   1422 		    && (uintptr_t)tchunk->chunk >= (uintptr_t)ret
   1423 		    && (uintptr_t)tchunk->chunk < (uintptr_t)ret + size) {
   1424 			delchunk = tchunk;
   1425 			/* LINTED */
   1426 			tchunk = RB_NEXT(chunk_tree_s, &old_chunks, delchunk);
   1427 			/* LINTED */
   1428 			RB_REMOVE(chunk_tree_s, &old_chunks, delchunk);
   1429 			base_chunk_node_dealloc(delchunk);
   1430 		}
   1431 
   1432 	}
   1433 #ifdef MALLOC_STATS
   1434 	if (ret != NULL) {
   1435 		stats_chunks.nchunks += (size / chunksize);
   1436 		stats_chunks.curchunks += (size / chunksize);
   1437 	}
   1438 	if (stats_chunks.curchunks > stats_chunks.highchunks)
   1439 		stats_chunks.highchunks = stats_chunks.curchunks;
   1440 #endif
   1441 	malloc_mutex_unlock(&chunks_mtx);
   1442 
   1443 	assert(CHUNK_ADDR2BASE(ret) == ret);
   1444 	return (ret);
   1445 }
   1446 
   1447 static void
   1448 chunk_dealloc(void *chunk, size_t size)
   1449 {
   1450 	chunk_node_t *node;
   1451 
   1452 	assert(chunk != NULL);
   1453 	assert(CHUNK_ADDR2BASE(chunk) == chunk);
   1454 	assert(size != 0);
   1455 	assert((size & chunksize_mask) == 0);
   1456 
   1457 	malloc_mutex_lock(&chunks_mtx);
   1458 
   1459 #ifdef USE_BRK
   1460 	if ((uintptr_t)chunk >= (uintptr_t)brk_base
   1461 	    && (uintptr_t)chunk < (uintptr_t)brk_max) {
   1462 		void *brk_cur;
   1463 
   1464 		malloc_mutex_lock(&brk_mtx);
   1465 		/* Get the current end of brk. */
   1466 		brk_cur = sbrk(0);
   1467 
   1468 		/*
   1469 		 * Try to shrink the data segment if this chunk is at the end
   1470 		 * of the data segment.  The sbrk() call here is subject to a
   1471 		 * race condition with threads that use brk(2) or sbrk(2)
   1472 		 * directly, but the alternative would be to leak memory for
   1473 		 * the sake of poorly designed multi-threaded programs.
   1474 		 */
   1475 		if (brk_cur == brk_max
   1476 		    && (void *)((uintptr_t)chunk + size) == brk_max
   1477 		    && sbrk(-(intptr_t)size) == brk_max) {
   1478 			malloc_mutex_unlock(&brk_mtx);
   1479 			if (brk_prev == brk_max) {
   1480 				/* Success. */
   1481 				brk_prev = (void *)((intptr_t)brk_max
   1482 				    - (intptr_t)size);
   1483 				brk_max = brk_prev;
   1484 			}
   1485 		} else {
   1486 			size_t offset;
   1487 
   1488 			malloc_mutex_unlock(&brk_mtx);
   1489 			madvise(chunk, size, MADV_FREE);
   1490 
   1491 			/*
   1492 			 * Iteratively create records of each chunk-sized
   1493 			 * memory region that 'chunk' is comprised of, so that
   1494 			 * the address range can be recycled if memory usage
   1495 			 * increases later on.
   1496 			 */
   1497 			for (offset = 0; offset < size; offset += chunksize) {
   1498 				node = base_chunk_node_alloc();
   1499 				if (node == NULL)
   1500 					break;
   1501 
   1502 				node->chunk = (void *)((uintptr_t)chunk
   1503 				    + (uintptr_t)offset);
   1504 				node->size = chunksize;
   1505 				/* LINTED */
   1506 				RB_INSERT(chunk_tree_s, &old_chunks, node);
   1507 			}
   1508 		}
   1509 	} else {
   1510 #endif
   1511 		pages_unmap(chunk, size);
   1512 
   1513 		/*
   1514 		 * Make a record of the chunk's address, so that the address
   1515 		 * range can be recycled if memory usage increases later on.
   1516 		 * Don't bother to create entries if (size > chunksize), since
   1517 		 * doing so could cause scalability issues for truly gargantuan
   1518 		 * objects (many gigabytes or larger).
   1519 		 */
   1520 		if (size == chunksize) {
   1521 			node = base_chunk_node_alloc();
   1522 			if (node != NULL) {
   1523 				node->chunk = (void *)(uintptr_t)chunk;
   1524 				node->size = chunksize;
   1525 				/* LINTED */
   1526 				RB_INSERT(chunk_tree_s, &old_chunks, node);
   1527 			}
   1528 		}
   1529 #ifdef USE_BRK
   1530 	}
   1531 #endif
   1532 
   1533 #ifdef MALLOC_STATS
   1534 	stats_chunks.curchunks -= (size / chunksize);
   1535 #endif
   1536 	malloc_mutex_unlock(&chunks_mtx);
   1537 }
   1538 
   1539 /*
   1540  * End chunk management functions.
   1541  */
   1542 /******************************************************************************/
   1543 /*
   1544  * Begin arena.
   1545  */
   1546 
   1547 /*
   1548  * Choose an arena based on a per-thread and (optimistically) per-CPU value.
   1549  *
   1550  * We maintain at least one block of arenas.  Usually there are more.
   1551  * The blocks are $ncpu arenas in size.  Whole blocks are 'hashed'
   1552  * amongst threads.  To accomplish this, next_arena advances only in
   1553  * ncpu steps.
   1554  */
   1555 static __noinline arena_t *
   1556 choose_arena_hard(void)
   1557 {
   1558 	unsigned i, curcpu;
   1559 	arena_t **map;
   1560 
   1561 	/* Initialize the current block of arenas and advance to next. */
   1562 	malloc_mutex_lock(&arenas_mtx);
   1563 	assert(next_arena % ncpus == 0);
   1564 	assert(narenas % ncpus == 0);
   1565 	map = &arenas[next_arena];
   1566 	set_arenas_map(map);
   1567 	for (i = 0; i < ncpus; i++) {
   1568 		if (arenas[next_arena] == NULL)
   1569 			arenas_extend(next_arena);
   1570 		next_arena = (next_arena + 1) % narenas;
   1571 	}
   1572 	malloc_mutex_unlock(&arenas_mtx);
   1573 
   1574 	/*
   1575 	 * If we were unable to allocate an arena above, then default to
   1576 	 * the first arena, which is always present.
   1577 	 */
   1578 	curcpu = thr_curcpu();
   1579 	if (map[curcpu] != NULL)
   1580 		return map[curcpu];
   1581 	return arenas[0];
   1582 }
   1583 
   1584 static inline arena_t *
   1585 choose_arena(void)
   1586 {
   1587 	unsigned curcpu;
   1588 	arena_t **map;
   1589 
   1590 	map = get_arenas_map();
   1591 	curcpu = thr_curcpu();
   1592 	if (__predict_true(map != NULL && map[curcpu] != NULL))
   1593 		return map[curcpu];
   1594 
   1595         return choose_arena_hard();
   1596 }
   1597 
   1598 #ifndef lint
   1599 static inline int
   1600 arena_chunk_comp(arena_chunk_t *a, arena_chunk_t *b)
   1601 {
   1602 
   1603 	assert(a != NULL);
   1604 	assert(b != NULL);
   1605 
   1606 	if ((uintptr_t)a < (uintptr_t)b)
   1607 		return (-1);
   1608 	else if (a == b)
   1609 		return (0);
   1610 	else
   1611 		return (1);
   1612 }
   1613 
   1614 /* Generate red-black tree code for arena chunks. */
   1615 RB_GENERATE_STATIC(arena_chunk_tree_s, arena_chunk_s, link, arena_chunk_comp);
   1616 #endif
   1617 
   1618 #ifndef lint
   1619 static inline int
   1620 arena_run_comp(arena_run_t *a, arena_run_t *b)
   1621 {
   1622 
   1623 	assert(a != NULL);
   1624 	assert(b != NULL);
   1625 
   1626 	if ((uintptr_t)a < (uintptr_t)b)
   1627 		return (-1);
   1628 	else if (a == b)
   1629 		return (0);
   1630 	else
   1631 		return (1);
   1632 }
   1633 
   1634 /* Generate red-black tree code for arena runs. */
   1635 RB_GENERATE_STATIC(arena_run_tree_s, arena_run_s, link, arena_run_comp);
   1636 #endif
   1637 
   1638 static inline void *
   1639 arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
   1640 {
   1641 	void *ret;
   1642 	unsigned i, mask, bit, regind;
   1643 
   1644 	assert(run->magic == ARENA_RUN_MAGIC);
   1645 	assert(run->regs_minelm < bin->regs_mask_nelms);
   1646 
   1647 	/*
   1648 	 * Move the first check outside the loop, so that run->regs_minelm can
   1649 	 * be updated unconditionally, without the possibility of updating it
   1650 	 * multiple times.
   1651 	 */
   1652 	i = run->regs_minelm;
   1653 	mask = run->regs_mask[i];
   1654 	if (mask != 0) {
   1655 		/* Usable allocation found. */
   1656 		bit = ffs((int)mask) - 1;
   1657 
   1658 		regind = ((i << (SIZEOF_INT_2POW + 3)) + bit);
   1659 		ret = (void *)(((uintptr_t)run) + bin->reg0_offset
   1660 		    + (bin->reg_size * regind));
   1661 
   1662 		/* Clear bit. */
   1663 		mask ^= (1 << bit);
   1664 		run->regs_mask[i] = mask;
   1665 
   1666 		return (ret);
   1667 	}
   1668 
   1669 	for (i++; i < bin->regs_mask_nelms; i++) {
   1670 		mask = run->regs_mask[i];
   1671 		if (mask != 0) {
   1672 			/* Usable allocation found. */
   1673 			bit = ffs((int)mask) - 1;
   1674 
   1675 			regind = ((i << (SIZEOF_INT_2POW + 3)) + bit);
   1676 			ret = (void *)(((uintptr_t)run) + bin->reg0_offset
   1677 			    + (bin->reg_size * regind));
   1678 
   1679 			/* Clear bit. */
   1680 			mask ^= (1 << bit);
   1681 			run->regs_mask[i] = mask;
   1682 
   1683 			/*
   1684 			 * Make a note that nothing before this element
   1685 			 * contains a free region.
   1686 			 */
   1687 			run->regs_minelm = i; /* Low payoff: + (mask == 0); */
   1688 
   1689 			return (ret);
   1690 		}
   1691 	}
   1692 	/* Not reached. */
   1693 	/* LINTED */
   1694 	assert(0);
   1695 	return (NULL);
   1696 }
   1697 
   1698 static inline void
   1699 arena_run_reg_dalloc(arena_run_t *run, arena_bin_t *bin, void *ptr, size_t size)
   1700 {
   1701 	/*
   1702 	 * To divide by a number D that is not a power of two we multiply
   1703 	 * by (2^21 / D) and then right shift by 21 positions.
   1704 	 *
   1705 	 *   X / D
   1706 	 *
   1707 	 * becomes
   1708 	 *
   1709 	 *   (X * size_invs[(D >> QUANTUM_2POW_MIN) - 3]) >> SIZE_INV_SHIFT
   1710 	 */
   1711 #define SIZE_INV_SHIFT 21
   1712 #define SIZE_INV(s) (((1 << SIZE_INV_SHIFT) / (s << QUANTUM_2POW_MIN)) + 1)
   1713 	static const unsigned size_invs[] = {
   1714 	    SIZE_INV(3),
   1715 	    SIZE_INV(4), SIZE_INV(5), SIZE_INV(6), SIZE_INV(7),
   1716 	    SIZE_INV(8), SIZE_INV(9), SIZE_INV(10), SIZE_INV(11),
   1717 	    SIZE_INV(12),SIZE_INV(13), SIZE_INV(14), SIZE_INV(15),
   1718 	    SIZE_INV(16),SIZE_INV(17), SIZE_INV(18), SIZE_INV(19),
   1719 	    SIZE_INV(20),SIZE_INV(21), SIZE_INV(22), SIZE_INV(23),
   1720 	    SIZE_INV(24),SIZE_INV(25), SIZE_INV(26), SIZE_INV(27),
   1721 	    SIZE_INV(28),SIZE_INV(29), SIZE_INV(30), SIZE_INV(31)
   1722 #if (QUANTUM_2POW_MIN < 4)
   1723 	    ,
   1724 	    SIZE_INV(32), SIZE_INV(33), SIZE_INV(34), SIZE_INV(35),
   1725 	    SIZE_INV(36), SIZE_INV(37), SIZE_INV(38), SIZE_INV(39),
   1726 	    SIZE_INV(40), SIZE_INV(41), SIZE_INV(42), SIZE_INV(43),
   1727 	    SIZE_INV(44), SIZE_INV(45), SIZE_INV(46), SIZE_INV(47),
   1728 	    SIZE_INV(48), SIZE_INV(49), SIZE_INV(50), SIZE_INV(51),
   1729 	    SIZE_INV(52), SIZE_INV(53), SIZE_INV(54), SIZE_INV(55),
   1730 	    SIZE_INV(56), SIZE_INV(57), SIZE_INV(58), SIZE_INV(59),
   1731 	    SIZE_INV(60), SIZE_INV(61), SIZE_INV(62), SIZE_INV(63)
   1732 #endif
   1733 	};
   1734 	unsigned diff, regind, elm, bit;
   1735 
   1736 	/* LINTED */
   1737 	assert(run->magic == ARENA_RUN_MAGIC);
   1738 	assert(((sizeof(size_invs)) / sizeof(unsigned)) + 3
   1739 	    >= (SMALL_MAX_DEFAULT >> QUANTUM_2POW_MIN));
   1740 
   1741 	/*
   1742 	 * Avoid doing division with a variable divisor if possible.  Using
   1743 	 * actual division here can reduce allocator throughput by over 20%!
   1744 	 */
   1745 	diff = (unsigned)((uintptr_t)ptr - (uintptr_t)run - bin->reg0_offset);
   1746 	if ((size & (size - 1)) == 0) {
   1747 		/*
   1748 		 * log2_table allows fast division of a power of two in the
   1749 		 * [1..128] range.
   1750 		 *
   1751 		 * (x / divisor) becomes (x >> log2_table[divisor - 1]).
   1752 		 */
   1753 		static const unsigned char log2_table[] = {
   1754 		    0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,
   1755 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
   1756 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1757 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
   1758 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1759 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1760 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1761 		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7
   1762 		};
   1763 
   1764 		if (size <= 128)
   1765 			regind = (diff >> log2_table[size - 1]);
   1766 		else if (size <= 32768)
   1767 			regind = diff >> (8 + log2_table[(size >> 8) - 1]);
   1768 		else {
   1769 			/*
   1770 			 * The page size is too large for us to use the lookup
   1771 			 * table.  Use real division.
   1772 			 */
   1773 			regind = (unsigned)(diff / size);
   1774 		}
   1775 	} else if (size <= ((sizeof(size_invs) / sizeof(unsigned))
   1776 	    << QUANTUM_2POW_MIN) + 2) {
   1777 		regind = size_invs[(size >> QUANTUM_2POW_MIN) - 3] * diff;
   1778 		regind >>= SIZE_INV_SHIFT;
   1779 	} else {
   1780 		/*
   1781 		 * size_invs isn't large enough to handle this size class, so
   1782 		 * calculate regind using actual division.  This only happens
   1783 		 * if the user increases small_max via the 'S' runtime
   1784 		 * configuration option.
   1785 		 */
   1786 		regind = (unsigned)(diff / size);
   1787 	};
   1788 	assert(diff == regind * size);
   1789 	assert(regind < bin->nregs);
   1790 
   1791 	elm = regind >> (SIZEOF_INT_2POW + 3);
   1792 	if (elm < run->regs_minelm)
   1793 		run->regs_minelm = elm;
   1794 	bit = regind - (elm << (SIZEOF_INT_2POW + 3));
   1795 	assert((run->regs_mask[elm] & (1 << bit)) == 0);
   1796 	run->regs_mask[elm] |= (1 << bit);
   1797 #undef SIZE_INV
   1798 #undef SIZE_INV_SHIFT
   1799 }
   1800 
   1801 static void
   1802 arena_run_split(arena_t *arena, arena_run_t *run, size_t size)
   1803 {
   1804 	arena_chunk_t *chunk;
   1805 	unsigned run_ind, map_offset, total_pages, need_pages, rem_pages;
   1806 	unsigned i;
   1807 
   1808 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run);
   1809 	run_ind = (unsigned)(((uintptr_t)run - (uintptr_t)chunk)
   1810 	    >> pagesize_2pow);
   1811 	total_pages = chunk->map[run_ind].npages;
   1812 	need_pages = (unsigned)(size >> pagesize_2pow);
   1813 	assert(need_pages <= total_pages);
   1814 	rem_pages = total_pages - need_pages;
   1815 
   1816 	/* Split enough pages from the front of run to fit allocation size. */
   1817 	map_offset = run_ind;
   1818 	for (i = 0; i < need_pages; i++) {
   1819 		chunk->map[map_offset + i].npages = need_pages;
   1820 		chunk->map[map_offset + i].pos = i;
   1821 	}
   1822 
   1823 	/* Keep track of trailing unused pages for later use. */
   1824 	if (rem_pages > 0) {
   1825 		/* Update map for trailing pages. */
   1826 		map_offset += need_pages;
   1827 		chunk->map[map_offset].npages = rem_pages;
   1828 		chunk->map[map_offset].pos = POS_FREE;
   1829 		chunk->map[map_offset + rem_pages - 1].npages = rem_pages;
   1830 		chunk->map[map_offset + rem_pages - 1].pos = POS_FREE;
   1831 	}
   1832 
   1833 	chunk->pages_used += need_pages;
   1834 }
   1835 
   1836 static arena_chunk_t *
   1837 arena_chunk_alloc(arena_t *arena)
   1838 {
   1839 	arena_chunk_t *chunk;
   1840 
   1841 	if (arena->spare != NULL) {
   1842 		chunk = arena->spare;
   1843 		arena->spare = NULL;
   1844 
   1845 		/* LINTED */
   1846 		RB_INSERT(arena_chunk_tree_s, &arena->chunks, chunk);
   1847 	} else {
   1848 		chunk = (arena_chunk_t *)chunk_alloc(chunksize);
   1849 		if (chunk == NULL)
   1850 			return (NULL);
   1851 #ifdef MALLOC_STATS
   1852 		arena->stats.mapped += chunksize;
   1853 #endif
   1854 
   1855 		chunk->arena = arena;
   1856 
   1857 		/* LINTED */
   1858 		RB_INSERT(arena_chunk_tree_s, &arena->chunks, chunk);
   1859 
   1860 		/*
   1861 		 * Claim that no pages are in use, since the header is merely
   1862 		 * overhead.
   1863 		 */
   1864 		chunk->pages_used = 0;
   1865 
   1866 		chunk->max_frun_npages = chunk_npages -
   1867 		    arena_chunk_header_npages;
   1868 		chunk->min_frun_ind = arena_chunk_header_npages;
   1869 
   1870 		/*
   1871 		 * Initialize enough of the map to support one maximal free run.
   1872 		 */
   1873 		chunk->map[arena_chunk_header_npages].npages = chunk_npages -
   1874 		    arena_chunk_header_npages;
   1875 		chunk->map[arena_chunk_header_npages].pos = POS_FREE;
   1876 		chunk->map[chunk_npages - 1].npages = chunk_npages -
   1877 		    arena_chunk_header_npages;
   1878 		chunk->map[chunk_npages - 1].pos = POS_FREE;
   1879 	}
   1880 
   1881 	return (chunk);
   1882 }
   1883 
   1884 static void
   1885 arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk)
   1886 {
   1887 
   1888 	/*
   1889 	 * Remove chunk from the chunk tree, regardless of whether this chunk
   1890 	 * will be cached, so that the arena does not use it.
   1891 	 */
   1892 	/* LINTED */
   1893 	RB_REMOVE(arena_chunk_tree_s, &chunk->arena->chunks, chunk);
   1894 
   1895 	if (opt_hint == false) {
   1896 		if (arena->spare != NULL) {
   1897 			chunk_dealloc((void *)arena->spare, chunksize);
   1898 #ifdef MALLOC_STATS
   1899 			arena->stats.mapped -= chunksize;
   1900 #endif
   1901 		}
   1902 		arena->spare = chunk;
   1903 	} else {
   1904 		assert(arena->spare == NULL);
   1905 		chunk_dealloc((void *)chunk, chunksize);
   1906 #ifdef MALLOC_STATS
   1907 		arena->stats.mapped -= chunksize;
   1908 #endif
   1909 	}
   1910 }
   1911 
   1912 static arena_run_t *
   1913 arena_run_alloc(arena_t *arena, size_t size)
   1914 {
   1915 	arena_chunk_t *chunk;
   1916 	arena_run_t *run;
   1917 	unsigned need_npages, limit_pages, compl_need_npages;
   1918 
   1919 	assert(size <= (chunksize - (arena_chunk_header_npages <<
   1920 	    pagesize_2pow)));
   1921 	assert((size & pagesize_mask) == 0);
   1922 
   1923 	/*
   1924 	 * Search through arena's chunks in address order for a free run that is
   1925 	 * large enough.  Look for the first fit.
   1926 	 */
   1927 	need_npages = (unsigned)(size >> pagesize_2pow);
   1928 	limit_pages = chunk_npages - arena_chunk_header_npages;
   1929 	compl_need_npages = limit_pages - need_npages;
   1930 	/* LINTED */
   1931 	RB_FOREACH(chunk, arena_chunk_tree_s, &arena->chunks) {
   1932 		/*
   1933 		 * Avoid searching this chunk if there are not enough
   1934 		 * contiguous free pages for there to possibly be a large
   1935 		 * enough free run.
   1936 		 */
   1937 		if (chunk->pages_used <= compl_need_npages &&
   1938 		    need_npages <= chunk->max_frun_npages) {
   1939 			arena_chunk_map_t *mapelm;
   1940 			unsigned i;
   1941 			unsigned max_frun_npages = 0;
   1942 			unsigned min_frun_ind = chunk_npages;
   1943 
   1944 			assert(chunk->min_frun_ind >=
   1945 			    arena_chunk_header_npages);
   1946 			for (i = chunk->min_frun_ind; i < chunk_npages;) {
   1947 				mapelm = &chunk->map[i];
   1948 				if (mapelm->pos == POS_FREE) {
   1949 					if (mapelm->npages >= need_npages) {
   1950 						run = (arena_run_t *)
   1951 						    ((uintptr_t)chunk + (i <<
   1952 						    pagesize_2pow));
   1953 						/* Update page map. */
   1954 						arena_run_split(arena, run,
   1955 						    size);
   1956 						return (run);
   1957 					}
   1958 					if (mapelm->npages >
   1959 					    max_frun_npages) {
   1960 						max_frun_npages =
   1961 						    mapelm->npages;
   1962 					}
   1963 					if (i < min_frun_ind) {
   1964 						min_frun_ind = i;
   1965 						if (i < chunk->min_frun_ind)
   1966 							chunk->min_frun_ind = i;
   1967 					}
   1968 				}
   1969 				i += mapelm->npages;
   1970 			}
   1971 			/*
   1972 			 * Search failure.  Reset cached chunk->max_frun_npages.
   1973 			 * chunk->min_frun_ind was already reset above (if
   1974 			 * necessary).
   1975 			 */
   1976 			chunk->max_frun_npages = max_frun_npages;
   1977 		}
   1978 	}
   1979 
   1980 	/*
   1981 	 * No usable runs.  Create a new chunk from which to allocate the run.
   1982 	 */
   1983 	chunk = arena_chunk_alloc(arena);
   1984 	if (chunk == NULL)
   1985 		return (NULL);
   1986 	run = (arena_run_t *)((uintptr_t)chunk + (arena_chunk_header_npages <<
   1987 	    pagesize_2pow));
   1988 	/* Update page map. */
   1989 	arena_run_split(arena, run, size);
   1990 	return (run);
   1991 }
   1992 
   1993 static void
   1994 arena_run_dalloc(arena_t *arena, arena_run_t *run, size_t size)
   1995 {
   1996 	arena_chunk_t *chunk;
   1997 	unsigned run_ind, run_pages;
   1998 
   1999 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run);
   2000 
   2001 	run_ind = (unsigned)(((uintptr_t)run - (uintptr_t)chunk)
   2002 	    >> pagesize_2pow);
   2003 	assert(run_ind >= arena_chunk_header_npages);
   2004 	assert(run_ind < (chunksize >> pagesize_2pow));
   2005 	run_pages = (unsigned)(size >> pagesize_2pow);
   2006 	assert(run_pages == chunk->map[run_ind].npages);
   2007 
   2008 	/* Subtract pages from count of pages used in chunk. */
   2009 	chunk->pages_used -= run_pages;
   2010 
   2011 	/* Mark run as deallocated. */
   2012 	assert(chunk->map[run_ind].npages == run_pages);
   2013 	chunk->map[run_ind].pos = POS_FREE;
   2014 	assert(chunk->map[run_ind + run_pages - 1].npages == run_pages);
   2015 	chunk->map[run_ind + run_pages - 1].pos = POS_FREE;
   2016 
   2017 	/*
   2018 	 * Tell the kernel that we don't need the data in this run, but only if
   2019 	 * requested via runtime configuration.
   2020 	 */
   2021 	if (opt_hint)
   2022 		madvise(run, size, MADV_FREE);
   2023 
   2024 	/* Try to coalesce with neighboring runs. */
   2025 	if (run_ind > arena_chunk_header_npages &&
   2026 	    chunk->map[run_ind - 1].pos == POS_FREE) {
   2027 		unsigned prev_npages;
   2028 
   2029 		/* Coalesce with previous run. */
   2030 		prev_npages = chunk->map[run_ind - 1].npages;
   2031 		run_ind -= prev_npages;
   2032 		assert(chunk->map[run_ind].npages == prev_npages);
   2033 		assert(chunk->map[run_ind].pos == POS_FREE);
   2034 		run_pages += prev_npages;
   2035 
   2036 		chunk->map[run_ind].npages = run_pages;
   2037 		assert(chunk->map[run_ind].pos == POS_FREE);
   2038 		chunk->map[run_ind + run_pages - 1].npages = run_pages;
   2039 		assert(chunk->map[run_ind + run_pages - 1].pos == POS_FREE);
   2040 	}
   2041 
   2042 	if (run_ind + run_pages < chunk_npages &&
   2043 	    chunk->map[run_ind + run_pages].pos == POS_FREE) {
   2044 		unsigned next_npages;
   2045 
   2046 		/* Coalesce with next run. */
   2047 		next_npages = chunk->map[run_ind + run_pages].npages;
   2048 		run_pages += next_npages;
   2049 		assert(chunk->map[run_ind + run_pages - 1].npages ==
   2050 		    next_npages);
   2051 		assert(chunk->map[run_ind + run_pages - 1].pos == POS_FREE);
   2052 
   2053 		chunk->map[run_ind].npages = run_pages;
   2054 		chunk->map[run_ind].pos = POS_FREE;
   2055 		chunk->map[run_ind + run_pages - 1].npages = run_pages;
   2056 		assert(chunk->map[run_ind + run_pages - 1].pos == POS_FREE);
   2057 	}
   2058 
   2059 	if (chunk->map[run_ind].npages > chunk->max_frun_npages)
   2060 		chunk->max_frun_npages = chunk->map[run_ind].npages;
   2061 	if (run_ind < chunk->min_frun_ind)
   2062 		chunk->min_frun_ind = run_ind;
   2063 
   2064 	/* Deallocate chunk if it is now completely unused. */
   2065 	if (chunk->pages_used == 0)
   2066 		arena_chunk_dealloc(arena, chunk);
   2067 }
   2068 
   2069 static arena_run_t *
   2070 arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin)
   2071 {
   2072 	arena_run_t *run;
   2073 	unsigned i, remainder;
   2074 
   2075 	/* Look for a usable run. */
   2076 	/* LINTED */
   2077 	if ((run = RB_MIN(arena_run_tree_s, &bin->runs)) != NULL) {
   2078 		/* run is guaranteed to have available space. */
   2079 		/* LINTED */
   2080 		RB_REMOVE(arena_run_tree_s, &bin->runs, run);
   2081 #ifdef MALLOC_STATS
   2082 		bin->stats.reruns++;
   2083 #endif
   2084 		return (run);
   2085 	}
   2086 	/* No existing runs have any space available. */
   2087 
   2088 	/* Allocate a new run. */
   2089 	run = arena_run_alloc(arena, bin->run_size);
   2090 	if (run == NULL)
   2091 		return (NULL);
   2092 
   2093 	/* Initialize run internals. */
   2094 	run->bin = bin;
   2095 
   2096 	for (i = 0; i < bin->regs_mask_nelms; i++)
   2097 		run->regs_mask[i] = UINT_MAX;
   2098 	remainder = bin->nregs & ((1 << (SIZEOF_INT_2POW + 3)) - 1);
   2099 	if (remainder != 0) {
   2100 		/* The last element has spare bits that need to be unset. */
   2101 		run->regs_mask[i] = (UINT_MAX >> ((1 << (SIZEOF_INT_2POW + 3))
   2102 		    - remainder));
   2103 	}
   2104 
   2105 	run->regs_minelm = 0;
   2106 
   2107 	run->nfree = bin->nregs;
   2108 #ifdef MALLOC_DEBUG
   2109 	run->magic = ARENA_RUN_MAGIC;
   2110 #endif
   2111 
   2112 #ifdef MALLOC_STATS
   2113 	bin->stats.nruns++;
   2114 	bin->stats.curruns++;
   2115 	if (bin->stats.curruns > bin->stats.highruns)
   2116 		bin->stats.highruns = bin->stats.curruns;
   2117 #endif
   2118 	return (run);
   2119 }
   2120 
   2121 /* bin->runcur must have space available before this function is called. */
   2122 static inline void *
   2123 arena_bin_malloc_easy(arena_t *arena, arena_bin_t *bin, arena_run_t *run)
   2124 {
   2125 	void *ret;
   2126 
   2127 	assert(run->magic == ARENA_RUN_MAGIC);
   2128 	assert(run->nfree > 0);
   2129 
   2130 	ret = arena_run_reg_alloc(run, bin);
   2131 	assert(ret != NULL);
   2132 	run->nfree--;
   2133 
   2134 	return (ret);
   2135 }
   2136 
   2137 /* Re-fill bin->runcur, then call arena_bin_malloc_easy(). */
   2138 static void *
   2139 arena_bin_malloc_hard(arena_t *arena, arena_bin_t *bin)
   2140 {
   2141 
   2142 	bin->runcur = arena_bin_nonfull_run_get(arena, bin);
   2143 	if (bin->runcur == NULL)
   2144 		return (NULL);
   2145 	assert(bin->runcur->magic == ARENA_RUN_MAGIC);
   2146 	assert(bin->runcur->nfree > 0);
   2147 
   2148 	return (arena_bin_malloc_easy(arena, bin, bin->runcur));
   2149 }
   2150 
   2151 /*
   2152  * Calculate bin->run_size such that it meets the following constraints:
   2153  *
   2154  *   *) bin->run_size >= min_run_size
   2155  *   *) bin->run_size <= arena_maxclass
   2156  *   *) bin->run_size <= RUN_MAX_SMALL
   2157  *   *) run header overhead <= RUN_MAX_OVRHD (or header overhead relaxed).
   2158  *
   2159  * bin->nregs, bin->regs_mask_nelms, and bin->reg0_offset are
   2160  * also calculated here, since these settings are all interdependent.
   2161  */
   2162 static size_t
   2163 arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size)
   2164 {
   2165 	size_t try_run_size, good_run_size;
   2166 	unsigned good_nregs, good_mask_nelms, good_reg0_offset;
   2167 	unsigned try_nregs, try_mask_nelms, try_reg0_offset;
   2168 
   2169 	assert(min_run_size >= pagesize);
   2170 	assert(min_run_size <= arena_maxclass);
   2171 	assert(min_run_size <= RUN_MAX_SMALL);
   2172 
   2173 	/*
   2174 	 * Calculate known-valid settings before entering the run_size
   2175 	 * expansion loop, so that the first part of the loop always copies
   2176 	 * valid settings.
   2177 	 *
   2178 	 * The do..while loop iteratively reduces the number of regions until
   2179 	 * the run header and the regions no longer overlap.  A closed formula
   2180 	 * would be quite messy, since there is an interdependency between the
   2181 	 * header's mask length and the number of regions.
   2182 	 */
   2183 	try_run_size = min_run_size;
   2184 	try_nregs = (unsigned)(((try_run_size - sizeof(arena_run_t)) /
   2185 	    bin->reg_size) + 1); /* Counter-act try_nregs-- in loop. */
   2186 	do {
   2187 		try_nregs--;
   2188 		try_mask_nelms = (try_nregs >> (SIZEOF_INT_2POW + 3)) +
   2189 		    ((try_nregs & ((1 << (SIZEOF_INT_2POW + 3)) - 1)) ? 1 : 0);
   2190 		try_reg0_offset = (unsigned)(try_run_size -
   2191 		    (try_nregs * bin->reg_size));
   2192 	} while (sizeof(arena_run_t) + (sizeof(unsigned) * (try_mask_nelms - 1))
   2193 	    > try_reg0_offset);
   2194 
   2195 	/* run_size expansion loop. */
   2196 	do {
   2197 		/*
   2198 		 * Copy valid settings before trying more aggressive settings.
   2199 		 */
   2200 		good_run_size = try_run_size;
   2201 		good_nregs = try_nregs;
   2202 		good_mask_nelms = try_mask_nelms;
   2203 		good_reg0_offset = try_reg0_offset;
   2204 
   2205 		/* Try more aggressive settings. */
   2206 		try_run_size += pagesize;
   2207 		try_nregs = (unsigned)(((try_run_size - sizeof(arena_run_t)) /
   2208 		    bin->reg_size) + 1); /* Counter-act try_nregs-- in loop. */
   2209 		do {
   2210 			try_nregs--;
   2211 			try_mask_nelms = (try_nregs >> (SIZEOF_INT_2POW + 3)) +
   2212 			    ((try_nregs & ((1 << (SIZEOF_INT_2POW + 3)) - 1)) ?
   2213 			    1 : 0);
   2214 			try_reg0_offset = (unsigned)(try_run_size - (try_nregs *
   2215 			    bin->reg_size));
   2216 		} while (sizeof(arena_run_t) + (sizeof(unsigned) *
   2217 		    (try_mask_nelms - 1)) > try_reg0_offset);
   2218 	} while (try_run_size <= arena_maxclass && try_run_size <= RUN_MAX_SMALL
   2219 	    && RUN_MAX_OVRHD * (bin->reg_size << 3) > RUN_MAX_OVRHD_RELAX
   2220 	    && (try_reg0_offset << RUN_BFP) > RUN_MAX_OVRHD * try_run_size);
   2221 
   2222 	assert(sizeof(arena_run_t) + (sizeof(unsigned) * (good_mask_nelms - 1))
   2223 	    <= good_reg0_offset);
   2224 	assert((good_mask_nelms << (SIZEOF_INT_2POW + 3)) >= good_nregs);
   2225 
   2226 	/* Copy final settings. */
   2227 	bin->run_size = good_run_size;
   2228 	bin->nregs = good_nregs;
   2229 	bin->regs_mask_nelms = good_mask_nelms;
   2230 	bin->reg0_offset = good_reg0_offset;
   2231 
   2232 	return (good_run_size);
   2233 }
   2234 
   2235 static void *
   2236 arena_malloc(arena_t *arena, size_t size)
   2237 {
   2238 	void *ret;
   2239 
   2240 	assert(arena != NULL);
   2241 	assert(arena->magic == ARENA_MAGIC);
   2242 	assert(size != 0);
   2243 	assert(QUANTUM_CEILING(size) <= arena_maxclass);
   2244 
   2245 	if (size <= bin_maxclass) {
   2246 		arena_bin_t *bin;
   2247 		arena_run_t *run;
   2248 
   2249 		/* Small allocation. */
   2250 
   2251 		if (size < small_min) {
   2252 			/* Tiny. */
   2253 			size = pow2_ceil(size);
   2254 			bin = &arena->bins[ffs((int)(size >> (TINY_MIN_2POW +
   2255 			    1)))];
   2256 #if (!defined(NDEBUG) || defined(MALLOC_STATS))
   2257 			/*
   2258 			 * Bin calculation is always correct, but we may need
   2259 			 * to fix size for the purposes of assertions and/or
   2260 			 * stats accuracy.
   2261 			 */
   2262 			if (size < (1 << TINY_MIN_2POW))
   2263 				size = (1 << TINY_MIN_2POW);
   2264 #endif
   2265 		} else if (size <= small_max) {
   2266 			/* Quantum-spaced. */
   2267 			size = QUANTUM_CEILING(size);
   2268 			bin = &arena->bins[ntbins + (size >> opt_quantum_2pow)
   2269 			    - 1];
   2270 		} else {
   2271 			/* Sub-page. */
   2272 			size = pow2_ceil(size);
   2273 			bin = &arena->bins[ntbins + nqbins
   2274 			    + (ffs((int)(size >> opt_small_max_2pow)) - 2)];
   2275 		}
   2276 		assert(size == bin->reg_size);
   2277 
   2278 		malloc_mutex_lock(&arena->mtx);
   2279 		if ((run = bin->runcur) != NULL && run->nfree > 0)
   2280 			ret = arena_bin_malloc_easy(arena, bin, run);
   2281 		else
   2282 			ret = arena_bin_malloc_hard(arena, bin);
   2283 
   2284 		if (ret == NULL) {
   2285 			malloc_mutex_unlock(&arena->mtx);
   2286 			return (NULL);
   2287 		}
   2288 
   2289 #ifdef MALLOC_STATS
   2290 		bin->stats.nrequests++;
   2291 		arena->stats.nmalloc_small++;
   2292 		arena->stats.allocated_small += size;
   2293 #endif
   2294 	} else {
   2295 		/* Large allocation. */
   2296 		size = PAGE_CEILING(size);
   2297 		malloc_mutex_lock(&arena->mtx);
   2298 		ret = (void *)arena_run_alloc(arena, size);
   2299 		if (ret == NULL) {
   2300 			malloc_mutex_unlock(&arena->mtx);
   2301 			return (NULL);
   2302 		}
   2303 #ifdef MALLOC_STATS
   2304 		arena->stats.nmalloc_large++;
   2305 		arena->stats.allocated_large += size;
   2306 #endif
   2307 	}
   2308 
   2309 	malloc_mutex_unlock(&arena->mtx);
   2310 
   2311 	if (opt_junk)
   2312 		memset(ret, 0xa5, size);
   2313 	else if (opt_zero)
   2314 		memset(ret, 0, size);
   2315 	return (ret);
   2316 }
   2317 
   2318 static inline void
   2319 arena_palloc_trim(arena_t *arena, arena_chunk_t *chunk, unsigned pageind,
   2320     unsigned npages)
   2321 {
   2322 	unsigned i;
   2323 
   2324 	assert(npages > 0);
   2325 
   2326 	/*
   2327 	 * Modifiy the map such that arena_run_dalloc() sees the run as
   2328 	 * separately allocated.
   2329 	 */
   2330 	for (i = 0; i < npages; i++) {
   2331 		chunk->map[pageind + i].npages = npages;
   2332 		chunk->map[pageind + i].pos = i;
   2333 	}
   2334 	arena_run_dalloc(arena, (arena_run_t *)((uintptr_t)chunk + (pageind <<
   2335 	    pagesize_2pow)), npages << pagesize_2pow);
   2336 }
   2337 
   2338 /* Only handles large allocations that require more than page alignment. */
   2339 static void *
   2340 arena_palloc(arena_t *arena, size_t alignment, size_t size, size_t alloc_size)
   2341 {
   2342 	void *ret;
   2343 	size_t offset;
   2344 	arena_chunk_t *chunk;
   2345 	unsigned pageind, i, npages;
   2346 
   2347 	assert((size & pagesize_mask) == 0);
   2348 	assert((alignment & pagesize_mask) == 0);
   2349 
   2350 	npages = (unsigned)(size >> pagesize_2pow);
   2351 
   2352 	malloc_mutex_lock(&arena->mtx);
   2353 	ret = (void *)arena_run_alloc(arena, alloc_size);
   2354 	if (ret == NULL) {
   2355 		malloc_mutex_unlock(&arena->mtx);
   2356 		return (NULL);
   2357 	}
   2358 
   2359 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ret);
   2360 
   2361 	offset = (uintptr_t)ret & (alignment - 1);
   2362 	assert((offset & pagesize_mask) == 0);
   2363 	assert(offset < alloc_size);
   2364 	if (offset == 0) {
   2365 		pageind = (unsigned)(((uintptr_t)ret - (uintptr_t)chunk) >>
   2366 		    pagesize_2pow);
   2367 
   2368 		/* Update the map for the run to be kept. */
   2369 		for (i = 0; i < npages; i++) {
   2370 			chunk->map[pageind + i].npages = npages;
   2371 			assert(chunk->map[pageind + i].pos == i);
   2372 		}
   2373 
   2374 		/* Trim trailing space. */
   2375 		arena_palloc_trim(arena, chunk, pageind + npages,
   2376 		    (unsigned)((alloc_size - size) >> pagesize_2pow));
   2377 	} else {
   2378 		size_t leadsize, trailsize;
   2379 
   2380 		leadsize = alignment - offset;
   2381 		ret = (void *)((uintptr_t)ret + leadsize);
   2382 		pageind = (unsigned)(((uintptr_t)ret - (uintptr_t)chunk) >>
   2383 		    pagesize_2pow);
   2384 
   2385 		/* Update the map for the run to be kept. */
   2386 		for (i = 0; i < npages; i++) {
   2387 			chunk->map[pageind + i].npages = npages;
   2388 			chunk->map[pageind + i].pos = i;
   2389 		}
   2390 
   2391 		/* Trim leading space. */
   2392 		arena_palloc_trim(arena, chunk,
   2393 		    (unsigned)(pageind - (leadsize >> pagesize_2pow)),
   2394 		    (unsigned)(leadsize >> pagesize_2pow));
   2395 
   2396 		trailsize = alloc_size - leadsize - size;
   2397 		if (trailsize != 0) {
   2398 			/* Trim trailing space. */
   2399 			assert(trailsize < alloc_size);
   2400 			arena_palloc_trim(arena, chunk, pageind + npages,
   2401 			    (unsigned)(trailsize >> pagesize_2pow));
   2402 		}
   2403 	}
   2404 
   2405 #ifdef MALLOC_STATS
   2406 	arena->stats.nmalloc_large++;
   2407 	arena->stats.allocated_large += size;
   2408 #endif
   2409 	malloc_mutex_unlock(&arena->mtx);
   2410 
   2411 	if (opt_junk)
   2412 		memset(ret, 0xa5, size);
   2413 	else if (opt_zero)
   2414 		memset(ret, 0, size);
   2415 	return (ret);
   2416 }
   2417 
   2418 /* Return the size of the allocation pointed to by ptr. */
   2419 static size_t
   2420 arena_salloc(const void *ptr)
   2421 {
   2422 	size_t ret;
   2423 	arena_chunk_t *chunk;
   2424 	arena_chunk_map_t *mapelm;
   2425 	unsigned pageind;
   2426 
   2427 	assert(ptr != NULL);
   2428 	assert(CHUNK_ADDR2BASE(ptr) != ptr);
   2429 
   2430 	/*
   2431 	 * No arena data structures that we query here can change in a way that
   2432 	 * affects this function, so we don't need to lock.
   2433 	 */
   2434 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
   2435 	pageind = (unsigned)(((uintptr_t)ptr - (uintptr_t)chunk) >>
   2436 	    pagesize_2pow);
   2437 	mapelm = &chunk->map[pageind];
   2438 	if (mapelm->pos != 0 || ptr != (char *)((uintptr_t)chunk) + (pageind <<
   2439 	    pagesize_2pow)) {
   2440 		arena_run_t *run;
   2441 
   2442 		pageind -= mapelm->pos;
   2443 
   2444 		run = (arena_run_t *)((uintptr_t)chunk + (pageind <<
   2445 		    pagesize_2pow));
   2446 		assert(run->magic == ARENA_RUN_MAGIC);
   2447 		ret = run->bin->reg_size;
   2448 	} else
   2449 		ret = mapelm->npages << pagesize_2pow;
   2450 
   2451 	return (ret);
   2452 }
   2453 
   2454 static void *
   2455 arena_ralloc(void *ptr, size_t size, size_t oldsize)
   2456 {
   2457 	void *ret;
   2458 
   2459 	/* Avoid moving the allocation if the size class would not change. */
   2460 	if (size < small_min) {
   2461 		if (oldsize < small_min &&
   2462 		    ffs((int)(pow2_ceil(size) >> (TINY_MIN_2POW + 1)))
   2463 		    == ffs((int)(pow2_ceil(oldsize) >> (TINY_MIN_2POW + 1))))
   2464 			goto IN_PLACE;
   2465 	} else if (size <= small_max) {
   2466 		if (oldsize >= small_min && oldsize <= small_max &&
   2467 		    (QUANTUM_CEILING(size) >> opt_quantum_2pow)
   2468 		    == (QUANTUM_CEILING(oldsize) >> opt_quantum_2pow))
   2469 			goto IN_PLACE;
   2470 	} else {
   2471 		/*
   2472 		 * We make no attempt to resize runs here, though it would be
   2473 		 * possible to do so.
   2474 		 */
   2475 		if (oldsize > small_max && PAGE_CEILING(size) == oldsize)
   2476 			goto IN_PLACE;
   2477 	}
   2478 
   2479 	/*
   2480 	 * If we get here, then size and oldsize are different enough that we
   2481 	 * need to use a different size class.  In that case, fall back to
   2482 	 * allocating new space and copying.
   2483 	 */
   2484 	ret = arena_malloc(choose_arena(), size);
   2485 	if (ret == NULL)
   2486 		return (NULL);
   2487 
   2488 	/* Junk/zero-filling were already done by arena_malloc(). */
   2489 	if (size < oldsize)
   2490 		memcpy(ret, ptr, size);
   2491 	else
   2492 		memcpy(ret, ptr, oldsize);
   2493 	idalloc(ptr);
   2494 	return (ret);
   2495 IN_PLACE:
   2496 	if (opt_junk && size < oldsize)
   2497 		memset((void *)((uintptr_t)ptr + size), 0x5a, oldsize - size);
   2498 	else if (opt_zero && size > oldsize)
   2499 		memset((void *)((uintptr_t)ptr + oldsize), 0, size - oldsize);
   2500 	return (ptr);
   2501 }
   2502 
   2503 static void
   2504 arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr)
   2505 {
   2506 	unsigned pageind;
   2507 	arena_chunk_map_t *mapelm;
   2508 	size_t size;
   2509 
   2510 	assert(arena != NULL);
   2511 	assert(arena->magic == ARENA_MAGIC);
   2512 	assert(chunk->arena == arena);
   2513 	assert(ptr != NULL);
   2514 	assert(CHUNK_ADDR2BASE(ptr) != ptr);
   2515 
   2516 	pageind = (unsigned)(((uintptr_t)ptr - (uintptr_t)chunk) >>
   2517 	    pagesize_2pow);
   2518 	mapelm = &chunk->map[pageind];
   2519 	if (mapelm->pos != 0 || ptr != (char *)((uintptr_t)chunk) + (pageind <<
   2520 	    pagesize_2pow)) {
   2521 		arena_run_t *run;
   2522 		arena_bin_t *bin;
   2523 
   2524 		/* Small allocation. */
   2525 
   2526 		pageind -= mapelm->pos;
   2527 
   2528 		run = (arena_run_t *)((uintptr_t)chunk + (pageind <<
   2529 		    pagesize_2pow));
   2530 		assert(run->magic == ARENA_RUN_MAGIC);
   2531 		bin = run->bin;
   2532 		size = bin->reg_size;
   2533 
   2534 		if (opt_junk)
   2535 			memset(ptr, 0x5a, size);
   2536 
   2537 		malloc_mutex_lock(&arena->mtx);
   2538 		arena_run_reg_dalloc(run, bin, ptr, size);
   2539 		run->nfree++;
   2540 
   2541 		if (run->nfree == bin->nregs) {
   2542 			/* Deallocate run. */
   2543 			if (run == bin->runcur)
   2544 				bin->runcur = NULL;
   2545 			else if (bin->nregs != 1) {
   2546 				/*
   2547 				 * This block's conditional is necessary because
   2548 				 * if the run only contains one region, then it
   2549 				 * never gets inserted into the non-full runs
   2550 				 * tree.
   2551 				 */
   2552 				/* LINTED */
   2553 				RB_REMOVE(arena_run_tree_s, &bin->runs, run);
   2554 			}
   2555 #ifdef MALLOC_DEBUG
   2556 			run->magic = 0;
   2557 #endif
   2558 			arena_run_dalloc(arena, run, bin->run_size);
   2559 #ifdef MALLOC_STATS
   2560 			bin->stats.curruns--;
   2561 #endif
   2562 		} else if (run->nfree == 1 && run != bin->runcur) {
   2563 			/*
   2564 			 * Make sure that bin->runcur always refers to the
   2565 			 * lowest non-full run, if one exists.
   2566 			 */
   2567 			if (bin->runcur == NULL)
   2568 				bin->runcur = run;
   2569 			else if ((uintptr_t)run < (uintptr_t)bin->runcur) {
   2570 				/* Switch runcur. */
   2571 				if (bin->runcur->nfree > 0) {
   2572 					/* Insert runcur. */
   2573 					/* LINTED */
   2574 					RB_INSERT(arena_run_tree_s, &bin->runs,
   2575 					    bin->runcur);
   2576 				}
   2577 				bin->runcur = run;
   2578 			} else {
   2579 				/* LINTED */
   2580 				RB_INSERT(arena_run_tree_s, &bin->runs, run);
   2581 			}
   2582 		}
   2583 #ifdef MALLOC_STATS
   2584 		arena->stats.allocated_small -= size;
   2585 		arena->stats.ndalloc_small++;
   2586 #endif
   2587 	} else {
   2588 		/* Large allocation. */
   2589 
   2590 		size = mapelm->npages << pagesize_2pow;
   2591 		assert((((uintptr_t)ptr) & pagesize_mask) == 0);
   2592 
   2593 		if (opt_junk)
   2594 			memset(ptr, 0x5a, size);
   2595 
   2596 		malloc_mutex_lock(&arena->mtx);
   2597 		arena_run_dalloc(arena, (arena_run_t *)ptr, size);
   2598 #ifdef MALLOC_STATS
   2599 		arena->stats.allocated_large -= size;
   2600 		arena->stats.ndalloc_large++;
   2601 #endif
   2602 	}
   2603 
   2604 	malloc_mutex_unlock(&arena->mtx);
   2605 }
   2606 
   2607 static bool
   2608 arena_new(arena_t *arena)
   2609 {
   2610 	unsigned i;
   2611 	arena_bin_t *bin;
   2612 	size_t prev_run_size;
   2613 
   2614 	malloc_mutex_init(&arena->mtx);
   2615 
   2616 #ifdef MALLOC_STATS
   2617 	memset(&arena->stats, 0, sizeof(arena_stats_t));
   2618 #endif
   2619 
   2620 	/* Initialize chunks. */
   2621 	RB_INIT(&arena->chunks);
   2622 	arena->spare = NULL;
   2623 
   2624 	/* Initialize bins. */
   2625 	prev_run_size = pagesize;
   2626 
   2627 	/* (2^n)-spaced tiny bins. */
   2628 	for (i = 0; i < ntbins; i++) {
   2629 		bin = &arena->bins[i];
   2630 		bin->runcur = NULL;
   2631 		RB_INIT(&bin->runs);
   2632 
   2633 		bin->reg_size = (1 << (TINY_MIN_2POW + i));
   2634 		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
   2635 
   2636 #ifdef MALLOC_STATS
   2637 		memset(&bin->stats, 0, sizeof(malloc_bin_stats_t));
   2638 #endif
   2639 	}
   2640 
   2641 	/* Quantum-spaced bins. */
   2642 	for (; i < ntbins + nqbins; i++) {
   2643 		bin = &arena->bins[i];
   2644 		bin->runcur = NULL;
   2645 		RB_INIT(&bin->runs);
   2646 
   2647 		bin->reg_size = quantum * (i - ntbins + 1);
   2648 /*
   2649 		pow2_size = pow2_ceil(quantum * (i - ntbins + 1));
   2650 */
   2651 		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
   2652 
   2653 #ifdef MALLOC_STATS
   2654 		memset(&bin->stats, 0, sizeof(malloc_bin_stats_t));
   2655 #endif
   2656 	}
   2657 
   2658 	/* (2^n)-spaced sub-page bins. */
   2659 	for (; i < ntbins + nqbins + nsbins; i++) {
   2660 		bin = &arena->bins[i];
   2661 		bin->runcur = NULL;
   2662 		RB_INIT(&bin->runs);
   2663 
   2664 		bin->reg_size = (small_max << (i - (ntbins + nqbins) + 1));
   2665 
   2666 		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
   2667 
   2668 #ifdef MALLOC_STATS
   2669 		memset(&bin->stats, 0, sizeof(malloc_bin_stats_t));
   2670 #endif
   2671 	}
   2672 
   2673 #ifdef MALLOC_DEBUG
   2674 	arena->magic = ARENA_MAGIC;
   2675 #endif
   2676 
   2677 	return (false);
   2678 }
   2679 
   2680 /* Create a new arena and insert it into the arenas array at index ind. */
   2681 static arena_t *
   2682 arenas_extend(unsigned ind)
   2683 {
   2684 	arena_t *ret;
   2685 
   2686 	/* Allocate enough space for trailing bins. */
   2687 	ret = (arena_t *)base_alloc(sizeof(arena_t)
   2688 	    + (sizeof(arena_bin_t) * (ntbins + nqbins + nsbins - 1)));
   2689 	if (ret != NULL && arena_new(ret) == false) {
   2690 		arenas[ind] = ret;
   2691 		return (ret);
   2692 	}
   2693 	/* Only reached if there is an OOM error. */
   2694 
   2695 	/*
   2696 	 * OOM here is quite inconvenient to propagate, since dealing with it
   2697 	 * would require a check for failure in the fast path.  Instead, punt
   2698 	 * by using arenas[0].  In practice, this is an extremely unlikely
   2699 	 * failure.
   2700 	 */
   2701 	_malloc_message(getprogname(),
   2702 	    ": (malloc) Error initializing arena\n", "", "");
   2703 	if (opt_abort)
   2704 		abort();
   2705 
   2706 	return (arenas[0]);
   2707 }
   2708 
   2709 /*
   2710  * End arena.
   2711  */
   2712 /******************************************************************************/
   2713 /*
   2714  * Begin general internal functions.
   2715  */
   2716 
   2717 static void *
   2718 huge_malloc(size_t size)
   2719 {
   2720 	void *ret;
   2721 	size_t csize;
   2722 	chunk_node_t *node;
   2723 
   2724 	/* Allocate one or more contiguous chunks for this request. */
   2725 
   2726 	csize = CHUNK_CEILING(size);
   2727 	if (csize == 0) {
   2728 		/* size is large enough to cause size_t wrap-around. */
   2729 		return (NULL);
   2730 	}
   2731 
   2732 	/* Allocate a chunk node with which to track the chunk. */
   2733 	node = base_chunk_node_alloc();
   2734 	if (node == NULL)
   2735 		return (NULL);
   2736 
   2737 	ret = chunk_alloc(csize);
   2738 	if (ret == NULL) {
   2739 		base_chunk_node_dealloc(node);
   2740 		return (NULL);
   2741 	}
   2742 
   2743 	/* Insert node into huge. */
   2744 	node->chunk = ret;
   2745 	node->size = csize;
   2746 
   2747 	malloc_mutex_lock(&chunks_mtx);
   2748 	RB_INSERT(chunk_tree_s, &huge, node);
   2749 #ifdef MALLOC_STATS
   2750 	huge_nmalloc++;
   2751 	huge_allocated += csize;
   2752 #endif
   2753 	malloc_mutex_unlock(&chunks_mtx);
   2754 
   2755 	if (opt_junk)
   2756 		memset(ret, 0xa5, csize);
   2757 	else if (opt_zero)
   2758 		memset(ret, 0, csize);
   2759 
   2760 	return (ret);
   2761 }
   2762 
   2763 /* Only handles large allocations that require more than chunk alignment. */
   2764 static void *
   2765 huge_palloc(size_t alignment, size_t size)
   2766 {
   2767 	void *ret;
   2768 	size_t alloc_size, chunk_size, offset;
   2769 	chunk_node_t *node;
   2770 
   2771 	/*
   2772 	 * This allocation requires alignment that is even larger than chunk
   2773 	 * alignment.  This means that huge_malloc() isn't good enough.
   2774 	 *
   2775 	 * Allocate almost twice as many chunks as are demanded by the size or
   2776 	 * alignment, in order to assure the alignment can be achieved, then
   2777 	 * unmap leading and trailing chunks.
   2778 	 */
   2779 	assert(alignment >= chunksize);
   2780 
   2781 	chunk_size = CHUNK_CEILING(size);
   2782 
   2783 	if (size >= alignment)
   2784 		alloc_size = chunk_size + alignment - chunksize;
   2785 	else
   2786 		alloc_size = (alignment << 1) - chunksize;
   2787 
   2788 	/* Allocate a chunk node with which to track the chunk. */
   2789 	node = base_chunk_node_alloc();
   2790 	if (node == NULL)
   2791 		return (NULL);
   2792 
   2793 	ret = chunk_alloc(alloc_size);
   2794 	if (ret == NULL) {
   2795 		base_chunk_node_dealloc(node);
   2796 		return (NULL);
   2797 	}
   2798 
   2799 	offset = (uintptr_t)ret & (alignment - 1);
   2800 	assert((offset & chunksize_mask) == 0);
   2801 	assert(offset < alloc_size);
   2802 	if (offset == 0) {
   2803 		/* Trim trailing space. */
   2804 		chunk_dealloc((void *)((uintptr_t)ret + chunk_size), alloc_size
   2805 		    - chunk_size);
   2806 	} else {
   2807 		size_t trailsize;
   2808 
   2809 		/* Trim leading space. */
   2810 		chunk_dealloc(ret, alignment - offset);
   2811 
   2812 		ret = (void *)((uintptr_t)ret + (alignment - offset));
   2813 
   2814 		trailsize = alloc_size - (alignment - offset) - chunk_size;
   2815 		if (trailsize != 0) {
   2816 		    /* Trim trailing space. */
   2817 		    assert(trailsize < alloc_size);
   2818 		    chunk_dealloc((void *)((uintptr_t)ret + chunk_size),
   2819 			trailsize);
   2820 		}
   2821 	}
   2822 
   2823 	/* Insert node into huge. */
   2824 	node->chunk = ret;
   2825 	node->size = chunk_size;
   2826 
   2827 	malloc_mutex_lock(&chunks_mtx);
   2828 	RB_INSERT(chunk_tree_s, &huge, node);
   2829 #ifdef MALLOC_STATS
   2830 	huge_nmalloc++;
   2831 	huge_allocated += chunk_size;
   2832 #endif
   2833 	malloc_mutex_unlock(&chunks_mtx);
   2834 
   2835 	if (opt_junk)
   2836 		memset(ret, 0xa5, chunk_size);
   2837 	else if (opt_zero)
   2838 		memset(ret, 0, chunk_size);
   2839 
   2840 	return (ret);
   2841 }
   2842 
   2843 static void *
   2844 huge_ralloc(void *ptr, size_t size, size_t oldsize)
   2845 {
   2846 	void *ret;
   2847 
   2848 	/* Avoid moving the allocation if the size class would not change. */
   2849 	if (oldsize > arena_maxclass &&
   2850 	    CHUNK_CEILING(size) == CHUNK_CEILING(oldsize)) {
   2851 		if (opt_junk && size < oldsize) {
   2852 			memset((void *)((uintptr_t)ptr + size), 0x5a, oldsize
   2853 			    - size);
   2854 		} else if (opt_zero && size > oldsize) {
   2855 			memset((void *)((uintptr_t)ptr + oldsize), 0, size
   2856 			    - oldsize);
   2857 		}
   2858 		return (ptr);
   2859 	}
   2860 
   2861 	if (CHUNK_ADDR2BASE(ptr) == ptr
   2862 #ifdef USE_BRK
   2863 	    && ((uintptr_t)ptr < (uintptr_t)brk_base
   2864 	    || (uintptr_t)ptr >= (uintptr_t)brk_max)
   2865 #endif
   2866 	    ) {
   2867 		chunk_node_t *node, key;
   2868 		void *newptr;
   2869 		size_t oldcsize;
   2870 		size_t newcsize;
   2871 
   2872 		newcsize = CHUNK_CEILING(size);
   2873 		oldcsize = CHUNK_CEILING(oldsize);
   2874 		assert(oldcsize != newcsize);
   2875 		if (newcsize == 0) {
   2876 			/* size_t wrap-around */
   2877 			return (NULL);
   2878 		}
   2879 
   2880 		/*
   2881 		 * Remove the old region from the tree now.  If mremap()
   2882 		 * returns the region to the system, other thread may
   2883 		 * map it for same huge allocation and insert it to the
   2884 		 * tree before we acquire the mutex lock again.
   2885 		 */
   2886 		malloc_mutex_lock(&chunks_mtx);
   2887 		key.chunk = __DECONST(void *, ptr);
   2888 		/* LINTED */
   2889 		node = RB_FIND(chunk_tree_s, &huge, &key);
   2890 		assert(node != NULL);
   2891 		assert(node->chunk == ptr);
   2892 		assert(node->size == oldcsize);
   2893 		RB_REMOVE(chunk_tree_s, &huge, node);
   2894 		malloc_mutex_unlock(&chunks_mtx);
   2895 
   2896 		newptr = mremap(ptr, oldcsize, NULL, newcsize,
   2897 		    MAP_ALIGNED(chunksize_2pow));
   2898 		if (newptr == MAP_FAILED) {
   2899 			/* We still own the old region. */
   2900 			malloc_mutex_lock(&chunks_mtx);
   2901 			RB_INSERT(chunk_tree_s, &huge, node);
   2902 			malloc_mutex_unlock(&chunks_mtx);
   2903 		} else {
   2904 			assert(CHUNK_ADDR2BASE(newptr) == newptr);
   2905 
   2906 			/* Insert new or resized old region. */
   2907 			malloc_mutex_lock(&chunks_mtx);
   2908 			node->size = newcsize;
   2909 			node->chunk = newptr;
   2910 			RB_INSERT(chunk_tree_s, &huge, node);
   2911 #ifdef MALLOC_STATS
   2912 			huge_nralloc++;
   2913 			huge_allocated += newcsize - oldcsize;
   2914 			if (newcsize > oldcsize) {
   2915 				stats_chunks.curchunks +=
   2916 				    (newcsize - oldcsize) / chunksize;
   2917 				if (stats_chunks.curchunks >
   2918 				    stats_chunks.highchunks)
   2919 					stats_chunks.highchunks =
   2920 					    stats_chunks.curchunks;
   2921 			} else {
   2922 				stats_chunks.curchunks -=
   2923 				    (oldcsize - newcsize) / chunksize;
   2924 			}
   2925 #endif
   2926 			malloc_mutex_unlock(&chunks_mtx);
   2927 
   2928 			if (opt_junk && size < oldsize) {
   2929 				memset((void *)((uintptr_t)newptr + size), 0x5a,
   2930 				    newcsize - size);
   2931 			} else if (opt_zero && size > oldsize) {
   2932 				memset((void *)((uintptr_t)newptr + oldsize), 0,
   2933 				    size - oldsize);
   2934 			}
   2935 			return (newptr);
   2936 		}
   2937 	}
   2938 
   2939 	/*
   2940 	 * If we get here, then size and oldsize are different enough that we
   2941 	 * need to use a different size class.  In that case, fall back to
   2942 	 * allocating new space and copying.
   2943 	 */
   2944 	ret = huge_malloc(size);
   2945 	if (ret == NULL)
   2946 		return (NULL);
   2947 
   2948 	if (CHUNK_ADDR2BASE(ptr) == ptr) {
   2949 		/* The old allocation is a chunk. */
   2950 		if (size < oldsize)
   2951 			memcpy(ret, ptr, size);
   2952 		else
   2953 			memcpy(ret, ptr, oldsize);
   2954 	} else {
   2955 		/* The old allocation is a region. */
   2956 		assert(oldsize < size);
   2957 		memcpy(ret, ptr, oldsize);
   2958 	}
   2959 	idalloc(ptr);
   2960 	return (ret);
   2961 }
   2962 
   2963 static void
   2964 huge_dalloc(void *ptr)
   2965 {
   2966 	chunk_node_t key;
   2967 	chunk_node_t *node;
   2968 
   2969 	malloc_mutex_lock(&chunks_mtx);
   2970 
   2971 	/* Extract from tree of huge allocations. */
   2972 	key.chunk = ptr;
   2973 	/* LINTED */
   2974 	node = RB_FIND(chunk_tree_s, &huge, &key);
   2975 	assert(node != NULL);
   2976 	assert(node->chunk == ptr);
   2977 	/* LINTED */
   2978 	RB_REMOVE(chunk_tree_s, &huge, node);
   2979 
   2980 #ifdef MALLOC_STATS
   2981 	huge_ndalloc++;
   2982 	huge_allocated -= node->size;
   2983 #endif
   2984 
   2985 	malloc_mutex_unlock(&chunks_mtx);
   2986 
   2987 	/* Unmap chunk. */
   2988 #ifdef USE_BRK
   2989 	if (opt_junk)
   2990 		memset(node->chunk, 0x5a, node->size);
   2991 #endif
   2992 	chunk_dealloc(node->chunk, node->size);
   2993 
   2994 	base_chunk_node_dealloc(node);
   2995 }
   2996 
   2997 static void *
   2998 imalloc(size_t size)
   2999 {
   3000 	void *ret;
   3001 
   3002 	assert(size != 0);
   3003 
   3004 	if (size <= arena_maxclass)
   3005 		ret = arena_malloc(choose_arena(), size);
   3006 	else
   3007 		ret = huge_malloc(size);
   3008 
   3009 	return (ret);
   3010 }
   3011 
   3012 static void *
   3013 ipalloc(size_t alignment, size_t size)
   3014 {
   3015 	void *ret;
   3016 	size_t ceil_size;
   3017 
   3018 	/*
   3019 	 * Round size up to the nearest multiple of alignment.
   3020 	 *
   3021 	 * This done, we can take advantage of the fact that for each small
   3022 	 * size class, every object is aligned at the smallest power of two
   3023 	 * that is non-zero in the base two representation of the size.  For
   3024 	 * example:
   3025 	 *
   3026 	 *   Size |   Base 2 | Minimum alignment
   3027 	 *   -----+----------+------------------
   3028 	 *     96 |  1100000 |  32
   3029 	 *    144 | 10100000 |  32
   3030 	 *    192 | 11000000 |  64
   3031 	 *
   3032 	 * Depending on runtime settings, it is possible that arena_malloc()
   3033 	 * will further round up to a power of two, but that never causes
   3034 	 * correctness issues.
   3035 	 */
   3036 	ceil_size = (size + (alignment - 1)) & (-alignment);
   3037 	/*
   3038 	 * (ceil_size < size) protects against the combination of maximal
   3039 	 * alignment and size greater than maximal alignment.
   3040 	 */
   3041 	if (ceil_size < size) {
   3042 		/* size_t overflow. */
   3043 		return (NULL);
   3044 	}
   3045 
   3046 	if (ceil_size <= pagesize || (alignment <= pagesize
   3047 	    && ceil_size <= arena_maxclass))
   3048 		ret = arena_malloc(choose_arena(), ceil_size);
   3049 	else {
   3050 		size_t run_size;
   3051 
   3052 		/*
   3053 		 * We can't achieve sub-page alignment, so round up alignment
   3054 		 * permanently; it makes later calculations simpler.
   3055 		 */
   3056 		alignment = PAGE_CEILING(alignment);
   3057 		ceil_size = PAGE_CEILING(size);
   3058 		/*
   3059 		 * (ceil_size < size) protects against very large sizes within
   3060 		 * pagesize of SIZE_T_MAX.
   3061 		 *
   3062 		 * (ceil_size + alignment < ceil_size) protects against the
   3063 		 * combination of maximal alignment and ceil_size large enough
   3064 		 * to cause overflow.  This is similar to the first overflow
   3065 		 * check above, but it needs to be repeated due to the new
   3066 		 * ceil_size value, which may now be *equal* to maximal
   3067 		 * alignment, whereas before we only detected overflow if the
   3068 		 * original size was *greater* than maximal alignment.
   3069 		 */
   3070 		if (ceil_size < size || ceil_size + alignment < ceil_size) {
   3071 			/* size_t overflow. */
   3072 			return (NULL);
   3073 		}
   3074 
   3075 		/*
   3076 		 * Calculate the size of the over-size run that arena_palloc()
   3077 		 * would need to allocate in order to guarantee the alignment.
   3078 		 */
   3079 		if (ceil_size >= alignment)
   3080 			run_size = ceil_size + alignment - pagesize;
   3081 		else {
   3082 			/*
   3083 			 * It is possible that (alignment << 1) will cause
   3084 			 * overflow, but it doesn't matter because we also
   3085 			 * subtract pagesize, which in the case of overflow
   3086 			 * leaves us with a very large run_size.  That causes
   3087 			 * the first conditional below to fail, which means
   3088 			 * that the bogus run_size value never gets used for
   3089 			 * anything important.
   3090 			 */
   3091 			run_size = (alignment << 1) - pagesize;
   3092 		}
   3093 
   3094 		if (run_size <= arena_maxclass) {
   3095 			ret = arena_palloc(choose_arena(), alignment, ceil_size,
   3096 			    run_size);
   3097 		} else if (alignment <= chunksize)
   3098 			ret = huge_malloc(ceil_size);
   3099 		else
   3100 			ret = huge_palloc(alignment, ceil_size);
   3101 	}
   3102 
   3103 	assert(((uintptr_t)ret & (alignment - 1)) == 0);
   3104 	return (ret);
   3105 }
   3106 
   3107 static void *
   3108 icalloc(size_t size)
   3109 {
   3110 	void *ret;
   3111 
   3112 	if (size <= arena_maxclass) {
   3113 		ret = arena_malloc(choose_arena(), size);
   3114 		if (ret == NULL)
   3115 			return (NULL);
   3116 		memset(ret, 0, size);
   3117 	} else {
   3118 		/*
   3119 		 * The virtual memory system provides zero-filled pages, so
   3120 		 * there is no need to do so manually, unless opt_junk is
   3121 		 * enabled, in which case huge_malloc() fills huge allocations
   3122 		 * with junk.
   3123 		 */
   3124 		ret = huge_malloc(size);
   3125 		if (ret == NULL)
   3126 			return (NULL);
   3127 
   3128 		if (opt_junk)
   3129 			memset(ret, 0, size);
   3130 #ifdef USE_BRK
   3131 		else if ((uintptr_t)ret >= (uintptr_t)brk_base
   3132 		    && (uintptr_t)ret < (uintptr_t)brk_max) {
   3133 			/*
   3134 			 * This may be a re-used brk chunk.  Therefore, zero
   3135 			 * the memory.
   3136 			 */
   3137 			memset(ret, 0, size);
   3138 		}
   3139 #endif
   3140 	}
   3141 
   3142 	return (ret);
   3143 }
   3144 
   3145 static size_t
   3146 isalloc(const void *ptr)
   3147 {
   3148 	size_t ret;
   3149 	arena_chunk_t *chunk;
   3150 
   3151 	assert(ptr != NULL);
   3152 
   3153 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
   3154 	if (chunk != ptr) {
   3155 		/* Region. */
   3156 		assert(chunk->arena->magic == ARENA_MAGIC);
   3157 
   3158 		ret = arena_salloc(ptr);
   3159 	} else {
   3160 		chunk_node_t *node, key;
   3161 
   3162 		/* Chunk (huge allocation). */
   3163 
   3164 		malloc_mutex_lock(&chunks_mtx);
   3165 
   3166 		/* Extract from tree of huge allocations. */
   3167 		key.chunk = __DECONST(void *, ptr);
   3168 		/* LINTED */
   3169 		node = RB_FIND(chunk_tree_s, &huge, &key);
   3170 		assert(node != NULL);
   3171 
   3172 		ret = node->size;
   3173 
   3174 		malloc_mutex_unlock(&chunks_mtx);
   3175 	}
   3176 
   3177 	return (ret);
   3178 }
   3179 
   3180 static void *
   3181 iralloc(void *ptr, size_t size)
   3182 {
   3183 	void *ret;
   3184 	size_t oldsize;
   3185 
   3186 	assert(ptr != NULL);
   3187 	assert(size != 0);
   3188 
   3189 	oldsize = isalloc(ptr);
   3190 
   3191 	if (size <= arena_maxclass)
   3192 		ret = arena_ralloc(ptr, size, oldsize);
   3193 	else
   3194 		ret = huge_ralloc(ptr, size, oldsize);
   3195 
   3196 	return (ret);
   3197 }
   3198 
   3199 static void
   3200 idalloc(void *ptr)
   3201 {
   3202 	arena_chunk_t *chunk;
   3203 
   3204 	assert(ptr != NULL);
   3205 
   3206 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
   3207 	if (chunk != ptr) {
   3208 		/* Region. */
   3209 		arena_dalloc(chunk->arena, chunk, ptr);
   3210 	} else
   3211 		huge_dalloc(ptr);
   3212 }
   3213 
   3214 static void
   3215 malloc_print_stats(void)
   3216 {
   3217 
   3218 	if (opt_print_stats) {
   3219 		char s[UMAX2S_BUFSIZE];
   3220 		_malloc_message("___ Begin malloc statistics ___\n", "", "",
   3221 		    "");
   3222 		_malloc_message("Assertions ",
   3223 #ifdef NDEBUG
   3224 		    "disabled",
   3225 #else
   3226 		    "enabled",
   3227 #endif
   3228 		    "\n", "");
   3229 		_malloc_message("Boolean MALLOC_OPTIONS: ",
   3230 		    opt_abort ? "A" : "a",
   3231 		    opt_junk ? "J" : "j",
   3232 		    opt_hint ? "H" : "h");
   3233 		_malloc_message(opt_utrace ? "PU" : "Pu",
   3234 		    opt_sysv ? "V" : "v",
   3235 		    opt_xmalloc ? "X" : "x",
   3236 		    opt_zero ? "Z\n" : "z\n");
   3237 
   3238 		_malloc_message("CPUs: ", size_t2s(ncpus, s), "\n", "");
   3239 		_malloc_message("Max arenas: ", size_t2s(narenas, s), "\n", "");
   3240 		_malloc_message("Pointer size: ", size_t2s(sizeof(void *), s),
   3241 		    "\n", "");
   3242 		_malloc_message("Quantum size: ", size_t2s(quantum, s), "\n", "");
   3243 		_malloc_message("Max small size: ", size_t2s(small_max, s), "\n",
   3244 		    "");
   3245 
   3246 		_malloc_message("Chunk size: ", size_t2s(chunksize, s), "", "");
   3247 		_malloc_message(" (2^", size_t2s((size_t)opt_chunk_2pow, s),
   3248 		    ")\n", "");
   3249 
   3250 #ifdef MALLOC_STATS
   3251 		{
   3252 			size_t allocated, mapped;
   3253 			unsigned i;
   3254 			arena_t *arena;
   3255 
   3256 			/* Calculate and print allocated/mapped stats. */
   3257 
   3258 			/* arenas. */
   3259 			for (i = 0, allocated = 0; i < narenas; i++) {
   3260 				if (arenas[i] != NULL) {
   3261 					malloc_mutex_lock(&arenas[i]->mtx);
   3262 					allocated +=
   3263 					    arenas[i]->stats.allocated_small;
   3264 					allocated +=
   3265 					    arenas[i]->stats.allocated_large;
   3266 					malloc_mutex_unlock(&arenas[i]->mtx);
   3267 				}
   3268 			}
   3269 
   3270 			/* huge/base. */
   3271 			malloc_mutex_lock(&chunks_mtx);
   3272 			allocated += huge_allocated;
   3273 			mapped = stats_chunks.curchunks * chunksize;
   3274 			malloc_mutex_unlock(&chunks_mtx);
   3275 
   3276 			malloc_mutex_lock(&base_mtx);
   3277 			mapped += base_mapped;
   3278 			malloc_mutex_unlock(&base_mtx);
   3279 
   3280 			malloc_printf("Allocated: %zu, mapped: %zu\n",
   3281 			    allocated, mapped);
   3282 
   3283 			/* Print chunk stats. */
   3284 			{
   3285 				chunk_stats_t chunks_stats;
   3286 
   3287 				malloc_mutex_lock(&chunks_mtx);
   3288 				chunks_stats = stats_chunks;
   3289 				malloc_mutex_unlock(&chunks_mtx);
   3290 
   3291 				malloc_printf("chunks: nchunks   "
   3292 				    "highchunks    curchunks\n");
   3293 				malloc_printf("  %13llu%13lu%13lu\n",
   3294 				    chunks_stats.nchunks,
   3295 				    chunks_stats.highchunks,
   3296 				    chunks_stats.curchunks);
   3297 			}
   3298 
   3299 			/* Print chunk stats. */
   3300 			malloc_printf(
   3301 			    "huge: nmalloc      ndalloc      "
   3302 			    "nralloc    allocated\n");
   3303 			malloc_printf(" %12llu %12llu %12llu %12zu\n",
   3304 			    huge_nmalloc, huge_ndalloc, huge_nralloc,
   3305 			    huge_allocated);
   3306 
   3307 			/* Print stats for each arena. */
   3308 			for (i = 0; i < narenas; i++) {
   3309 				arena = arenas[i];
   3310 				if (arena != NULL) {
   3311 					malloc_printf(
   3312 					    "\narenas[%u] @ %p\n", i, arena);
   3313 					malloc_mutex_lock(&arena->mtx);
   3314 					stats_print(arena);
   3315 					malloc_mutex_unlock(&arena->mtx);
   3316 				}
   3317 			}
   3318 		}
   3319 #endif /* #ifdef MALLOC_STATS */
   3320 		_malloc_message("--- End malloc statistics ---\n", "", "", "");
   3321 	}
   3322 }
   3323 
   3324 /*
   3325  * FreeBSD's pthreads implementation calls malloc(3), so the malloc
   3326  * implementation has to take pains to avoid infinite recursion during
   3327  * initialization.
   3328  */
   3329 static inline bool
   3330 malloc_init(void)
   3331 {
   3332 
   3333 	if (malloc_initialized == false)
   3334 		return (malloc_init_hard());
   3335 
   3336 	return (false);
   3337 }
   3338 
   3339 static bool
   3340 malloc_init_hard(void)
   3341 {
   3342 	unsigned i, j;
   3343 	ssize_t linklen;
   3344 	char buf[PATH_MAX + 1];
   3345 	const char *opts = "";
   3346 	int serrno;
   3347 
   3348 	malloc_mutex_lock(&init_lock);
   3349 	if (malloc_initialized) {
   3350 		/*
   3351 		 * Another thread initialized the allocator before this one
   3352 		 * acquired init_lock.
   3353 		 */
   3354 		malloc_mutex_unlock(&init_lock);
   3355 		return (false);
   3356 	}
   3357 
   3358 	serrno = errno;
   3359 	/* Get number of CPUs. */
   3360 	{
   3361 		int mib[2];
   3362 		size_t len;
   3363 
   3364 		mib[0] = CTL_HW;
   3365 		mib[1] = HW_NCPU;
   3366 		len = sizeof(ncpus);
   3367 		if (sysctl(mib, 2, &ncpus, &len, (void *) 0, 0) == -1) {
   3368 			/* Error. */
   3369 			ncpus = 1;
   3370 		}
   3371 	}
   3372 
   3373 	/* Get page size. */
   3374 	{
   3375 		long result;
   3376 
   3377 		result = sysconf(_SC_PAGESIZE);
   3378 		assert(result != -1);
   3379 		pagesize = (unsigned) result;
   3380 
   3381 		/*
   3382 		 * We assume that pagesize is a power of 2 when calculating
   3383 		 * pagesize_mask and pagesize_2pow.
   3384 		 */
   3385 		assert(((result - 1) & result) == 0);
   3386 		pagesize_mask = result - 1;
   3387 		pagesize_2pow = ffs((int)result) - 1;
   3388 	}
   3389 
   3390 	for (i = 0; i < 3; i++) {
   3391 		/* Get runtime configuration. */
   3392 		switch (i) {
   3393 		case 0:
   3394 			if ((linklen = readlink("/etc/malloc.conf", buf,
   3395 						sizeof(buf) - 1)) != -1) {
   3396 				/*
   3397 				 * Use the contents of the "/etc/malloc.conf"
   3398 				 * symbolic link's name.
   3399 				 */
   3400 				buf[linklen] = '\0';
   3401 				opts = buf;
   3402 			} else {
   3403 				/* No configuration specified. */
   3404 				buf[0] = '\0';
   3405 				opts = buf;
   3406 			}
   3407 			break;
   3408 		case 1:
   3409 			if ((opts = getenv("MALLOC_OPTIONS")) != NULL &&
   3410 			    issetugid() == 0) {
   3411 				/*
   3412 				 * Do nothing; opts is already initialized to
   3413 				 * the value of the MALLOC_OPTIONS environment
   3414 				 * variable.
   3415 				 */
   3416 			} else {
   3417 				/* No configuration specified. */
   3418 				buf[0] = '\0';
   3419 				opts = buf;
   3420 			}
   3421 			break;
   3422 		case 2:
   3423 			if (_malloc_options != NULL) {
   3424 			    /*
   3425 			     * Use options that were compiled into the program.
   3426 			     */
   3427 			    opts = _malloc_options;
   3428 			} else {
   3429 				/* No configuration specified. */
   3430 				buf[0] = '\0';
   3431 				opts = buf;
   3432 			}
   3433 			break;
   3434 		default:
   3435 			/* NOTREACHED */
   3436 			/* LINTED */
   3437 			assert(false);
   3438 		}
   3439 
   3440 		for (j = 0; opts[j] != '\0'; j++) {
   3441 			switch (opts[j]) {
   3442 			case 'a':
   3443 				opt_abort = false;
   3444 				break;
   3445 			case 'A':
   3446 				opt_abort = true;
   3447 				break;
   3448 			case 'h':
   3449 				opt_hint = false;
   3450 				break;
   3451 			case 'H':
   3452 				opt_hint = true;
   3453 				break;
   3454 			case 'j':
   3455 				opt_junk = false;
   3456 				break;
   3457 			case 'J':
   3458 				opt_junk = true;
   3459 				break;
   3460 			case 'k':
   3461 				/*
   3462 				 * Chunks always require at least one header
   3463 				 * page, so chunks can never be smaller than
   3464 				 * two pages.
   3465 				 */
   3466 				if (opt_chunk_2pow > pagesize_2pow + 1)
   3467 					opt_chunk_2pow--;
   3468 				break;
   3469 			case 'K':
   3470 				if (opt_chunk_2pow + 1 <
   3471 				    (int)(sizeof(size_t) << 3))
   3472 					opt_chunk_2pow++;
   3473 				break;
   3474 			case 'n':
   3475 				opt_narenas_lshift--;
   3476 				break;
   3477 			case 'N':
   3478 				opt_narenas_lshift++;
   3479 				break;
   3480 			case 'p':
   3481 				opt_print_stats = false;
   3482 				break;
   3483 			case 'P':
   3484 				opt_print_stats = true;
   3485 				break;
   3486 			case 'q':
   3487 				if (opt_quantum_2pow > QUANTUM_2POW_MIN)
   3488 					opt_quantum_2pow--;
   3489 				break;
   3490 			case 'Q':
   3491 				if (opt_quantum_2pow < pagesize_2pow - 1)
   3492 					opt_quantum_2pow++;
   3493 				break;
   3494 			case 's':
   3495 				if (opt_small_max_2pow > QUANTUM_2POW_MIN)
   3496 					opt_small_max_2pow--;
   3497 				break;
   3498 			case 'S':
   3499 				if (opt_small_max_2pow < pagesize_2pow - 1)
   3500 					opt_small_max_2pow++;
   3501 				break;
   3502 			case 'u':
   3503 				opt_utrace = false;
   3504 				break;
   3505 			case 'U':
   3506 				opt_utrace = true;
   3507 				break;
   3508 			case 'v':
   3509 				opt_sysv = false;
   3510 				break;
   3511 			case 'V':
   3512 				opt_sysv = true;
   3513 				break;
   3514 			case 'x':
   3515 				opt_xmalloc = false;
   3516 				break;
   3517 			case 'X':
   3518 				opt_xmalloc = true;
   3519 				break;
   3520 			case 'z':
   3521 				opt_zero = false;
   3522 				break;
   3523 			case 'Z':
   3524 				opt_zero = true;
   3525 				break;
   3526 			default: {
   3527 				char cbuf[2];
   3528 
   3529 				cbuf[0] = opts[j];
   3530 				cbuf[1] = '\0';
   3531 				_malloc_message(getprogname(),
   3532 				    ": (malloc) Unsupported character in "
   3533 				    "malloc options: '", cbuf, "'\n");
   3534 			}
   3535 			}
   3536 		}
   3537 	}
   3538 	errno = serrno;
   3539 
   3540 	/* Take care to call atexit() only once. */
   3541 	if (opt_print_stats) {
   3542 		/* Print statistics at exit. */
   3543 		atexit(malloc_print_stats);
   3544 	}
   3545 
   3546 	/* Set variables according to the value of opt_small_max_2pow. */
   3547 	if (opt_small_max_2pow < opt_quantum_2pow)
   3548 		opt_small_max_2pow = opt_quantum_2pow;
   3549 	small_max = (1 << opt_small_max_2pow);
   3550 
   3551 	/* Set bin-related variables. */
   3552 	bin_maxclass = (pagesize >> 1);
   3553 	assert(opt_quantum_2pow >= TINY_MIN_2POW);
   3554 	ntbins = (unsigned)(opt_quantum_2pow - TINY_MIN_2POW);
   3555 	assert(ntbins <= opt_quantum_2pow);
   3556 	nqbins = (unsigned)(small_max >> opt_quantum_2pow);
   3557 	nsbins = (unsigned)(pagesize_2pow - opt_small_max_2pow - 1);
   3558 
   3559 	/* Set variables according to the value of opt_quantum_2pow. */
   3560 	quantum = (1 << opt_quantum_2pow);
   3561 	quantum_mask = quantum - 1;
   3562 	if (ntbins > 0)
   3563 		small_min = (quantum >> 1) + 1;
   3564 	else
   3565 		small_min = 1;
   3566 	assert(small_min <= quantum);
   3567 
   3568 	/* Set variables according to the value of opt_chunk_2pow. */
   3569 	chunksize = (1LU << opt_chunk_2pow);
   3570 	chunksize_mask = chunksize - 1;
   3571 	chunksize_2pow = (unsigned)opt_chunk_2pow;
   3572 	chunk_npages = (unsigned)(chunksize >> pagesize_2pow);
   3573 	{
   3574 		unsigned header_size;
   3575 
   3576 		header_size = (unsigned)(sizeof(arena_chunk_t) +
   3577 		    (sizeof(arena_chunk_map_t) * (chunk_npages - 1)));
   3578 		arena_chunk_header_npages = (header_size >> pagesize_2pow);
   3579 		if ((header_size & pagesize_mask) != 0)
   3580 			arena_chunk_header_npages++;
   3581 	}
   3582 	arena_maxclass = chunksize - (arena_chunk_header_npages <<
   3583 	    pagesize_2pow);
   3584 
   3585 	UTRACE(0, 0, 0);
   3586 
   3587 #ifdef MALLOC_STATS
   3588 	memset(&stats_chunks, 0, sizeof(chunk_stats_t));
   3589 #endif
   3590 
   3591 	/* Various sanity checks that regard configuration. */
   3592 	assert(quantum >= sizeof(void *));
   3593 	assert(quantum <= pagesize);
   3594 	assert(chunksize >= pagesize);
   3595 	assert(quantum * 4 <= chunksize);
   3596 
   3597 	/* Initialize chunks data. */
   3598 	malloc_mutex_init(&chunks_mtx);
   3599 	RB_INIT(&huge);
   3600 #ifdef USE_BRK
   3601 	malloc_mutex_init(&brk_mtx);
   3602 	brk_base = sbrk(0);
   3603 	brk_prev = brk_base;
   3604 	brk_max = brk_base;
   3605 #endif
   3606 #ifdef MALLOC_STATS
   3607 	huge_nmalloc = 0;
   3608 	huge_ndalloc = 0;
   3609 	huge_nralloc = 0;
   3610 	huge_allocated = 0;
   3611 #endif
   3612 	RB_INIT(&old_chunks);
   3613 
   3614 	/* Initialize base allocation data structures. */
   3615 #ifdef MALLOC_STATS
   3616 	base_mapped = 0;
   3617 #endif
   3618 #ifdef USE_BRK
   3619 	/*
   3620 	 * Allocate a base chunk here, since it doesn't actually have to be
   3621 	 * chunk-aligned.  Doing this before allocating any other chunks allows
   3622 	 * the use of space that would otherwise be wasted.
   3623 	 */
   3624 	base_pages_alloc(0);
   3625 #endif
   3626 	base_chunk_nodes = NULL;
   3627 	malloc_mutex_init(&base_mtx);
   3628 
   3629 	if (ncpus > 1) {
   3630 		/*
   3631 		 * For SMP systems, create four times as many arenas as there
   3632 		 * are CPUs by default.
   3633 		 */
   3634 		opt_narenas_lshift += 2;
   3635 	}
   3636 
   3637 #ifdef NO_TLS
   3638 	/* Initialize arena key. */
   3639 	(void)thr_keycreate(&arenas_map_key, NULL);
   3640 #endif
   3641 
   3642 	/* Determine how many arenas to use. */
   3643 	narenas = ncpus;
   3644 	if (opt_narenas_lshift > 0) {
   3645 		if ((narenas << opt_narenas_lshift) > narenas)
   3646 			narenas <<= opt_narenas_lshift;
   3647 		/*
   3648 		 * Make sure not to exceed the limits of what base_malloc()
   3649 		 * can handle.
   3650 		 */
   3651 		if (narenas * sizeof(arena_t *) > chunksize)
   3652 			narenas = (unsigned)(chunksize / sizeof(arena_t *));
   3653 	} else if (opt_narenas_lshift < 0) {
   3654 		if ((narenas << opt_narenas_lshift) < narenas)
   3655 			narenas <<= opt_narenas_lshift;
   3656 		/* Make sure there is at least one arena. */
   3657 		if (narenas == 0)
   3658 			narenas = 1;
   3659 	}
   3660 
   3661 	next_arena = 0;
   3662 
   3663 	/* Allocate and initialize arenas. */
   3664 	arenas = (arena_t **)base_alloc(sizeof(arena_t *) * narenas);
   3665 	if (arenas == NULL) {
   3666 		malloc_mutex_unlock(&init_lock);
   3667 		return (true);
   3668 	}
   3669 	/*
   3670 	 * Zero the array.  In practice, this should always be pre-zeroed,
   3671 	 * since it was just mmap()ed, but let's be sure.
   3672 	 */
   3673 	memset(arenas, 0, sizeof(arena_t *) * narenas);
   3674 
   3675 	/*
   3676 	 * Initialize one arena here.  The rest are lazily created in
   3677 	 * arena_choose_hard().
   3678 	 */
   3679 	arenas_extend(0);
   3680 	if (arenas[0] == NULL) {
   3681 		malloc_mutex_unlock(&init_lock);
   3682 		return (true);
   3683 	}
   3684 
   3685 	malloc_mutex_init(&arenas_mtx);
   3686 
   3687 	malloc_initialized = true;
   3688 	malloc_mutex_unlock(&init_lock);
   3689 	return (false);
   3690 }
   3691 
   3692 /*
   3693  * End general internal functions.
   3694  */
   3695 /******************************************************************************/
   3696 /*
   3697  * Begin malloc(3)-compatible functions.
   3698  */
   3699 
   3700 void *
   3701 malloc(size_t size)
   3702 {
   3703 	void *ret;
   3704 
   3705 	if (malloc_init()) {
   3706 		ret = NULL;
   3707 		goto RETURN;
   3708 	}
   3709 
   3710 	if (size == 0) {
   3711 		if (opt_sysv == false)
   3712 			size = 1;
   3713 		else {
   3714 			ret = NULL;
   3715 			goto RETURN;
   3716 		}
   3717 	}
   3718 
   3719 	ret = imalloc(size);
   3720 
   3721 RETURN:
   3722 	if (ret == NULL) {
   3723 		if (opt_xmalloc) {
   3724 			_malloc_message(getprogname(),
   3725 			    ": (malloc) Error in malloc(): out of memory\n", "",
   3726 			    "");
   3727 			abort();
   3728 		}
   3729 		errno = ENOMEM;
   3730 	}
   3731 
   3732 	UTRACE(0, size, ret);
   3733 	return (ret);
   3734 }
   3735 
   3736 int
   3737 posix_memalign(void **memptr, size_t alignment, size_t size)
   3738 {
   3739 	int ret;
   3740 	void *result;
   3741 
   3742 	if (malloc_init())
   3743 		result = NULL;
   3744 	else {
   3745 		/* Make sure that alignment is a large enough power of 2. */
   3746 		if (((alignment - 1) & alignment) != 0
   3747 		    || alignment < sizeof(void *)) {
   3748 			if (opt_xmalloc) {
   3749 				_malloc_message(getprogname(),
   3750 				    ": (malloc) Error in posix_memalign(): "
   3751 				    "invalid alignment\n", "", "");
   3752 				abort();
   3753 			}
   3754 			result = NULL;
   3755 			ret = EINVAL;
   3756 			goto RETURN;
   3757 		}
   3758 
   3759 		result = ipalloc(alignment, size);
   3760 	}
   3761 
   3762 	if (result == NULL) {
   3763 		if (opt_xmalloc) {
   3764 			_malloc_message(getprogname(),
   3765 			": (malloc) Error in posix_memalign(): out of memory\n",
   3766 			"", "");
   3767 			abort();
   3768 		}
   3769 		ret = ENOMEM;
   3770 		goto RETURN;
   3771 	}
   3772 
   3773 	*memptr = result;
   3774 	ret = 0;
   3775 
   3776 RETURN:
   3777 	UTRACE(0, size, result);
   3778 	return (ret);
   3779 }
   3780 
   3781 void *
   3782 calloc(size_t num, size_t size)
   3783 {
   3784 	void *ret;
   3785 	size_t num_size;
   3786 
   3787 	if (malloc_init()) {
   3788 		num_size = 0;
   3789 		ret = NULL;
   3790 		goto RETURN;
   3791 	}
   3792 
   3793 	num_size = num * size;
   3794 	if (num_size == 0) {
   3795 		if ((opt_sysv == false) && ((num == 0) || (size == 0)))
   3796 			num_size = 1;
   3797 		else {
   3798 			ret = NULL;
   3799 			goto RETURN;
   3800 		}
   3801 	/*
   3802 	 * Try to avoid division here.  We know that it isn't possible to
   3803 	 * overflow during multiplication if neither operand uses any of the
   3804 	 * most significant half of the bits in a size_t.
   3805 	 */
   3806 	} else if ((unsigned long long)((num | size) &
   3807 	   ((unsigned long long)SIZE_T_MAX << (sizeof(size_t) << 2))) &&
   3808 	   (num_size / size != num)) {
   3809 		/* size_t overflow. */
   3810 		ret = NULL;
   3811 		goto RETURN;
   3812 	}
   3813 
   3814 	ret = icalloc(num_size);
   3815 
   3816 RETURN:
   3817 	if (ret == NULL) {
   3818 		if (opt_xmalloc) {
   3819 			_malloc_message(getprogname(),
   3820 			    ": (malloc) Error in calloc(): out of memory\n", "",
   3821 			    "");
   3822 			abort();
   3823 		}
   3824 		errno = ENOMEM;
   3825 	}
   3826 
   3827 	UTRACE(0, num_size, ret);
   3828 	return (ret);
   3829 }
   3830 
   3831 void *
   3832 realloc(void *ptr, size_t size)
   3833 {
   3834 	void *ret;
   3835 
   3836 	if (size == 0) {
   3837 		if (opt_sysv == false)
   3838 			size = 1;
   3839 		else {
   3840 			if (ptr != NULL)
   3841 				idalloc(ptr);
   3842 			ret = NULL;
   3843 			goto RETURN;
   3844 		}
   3845 	}
   3846 
   3847 	if (ptr != NULL) {
   3848 		assert(malloc_initialized);
   3849 
   3850 		ret = iralloc(ptr, size);
   3851 
   3852 		if (ret == NULL) {
   3853 			if (opt_xmalloc) {
   3854 				_malloc_message(getprogname(),
   3855 				    ": (malloc) Error in realloc(): out of "
   3856 				    "memory\n", "", "");
   3857 				abort();
   3858 			}
   3859 			errno = ENOMEM;
   3860 		}
   3861 	} else {
   3862 		if (malloc_init())
   3863 			ret = NULL;
   3864 		else
   3865 			ret = imalloc(size);
   3866 
   3867 		if (ret == NULL) {
   3868 			if (opt_xmalloc) {
   3869 				_malloc_message(getprogname(),
   3870 				    ": (malloc) Error in realloc(): out of "
   3871 				    "memory\n", "", "");
   3872 				abort();
   3873 			}
   3874 			errno = ENOMEM;
   3875 		}
   3876 	}
   3877 
   3878 RETURN:
   3879 	UTRACE(ptr, size, ret);
   3880 	return (ret);
   3881 }
   3882 
   3883 void
   3884 free(void *ptr)
   3885 {
   3886 
   3887 	UTRACE(ptr, 0, 0);
   3888 	if (ptr != NULL) {
   3889 		assert(malloc_initialized);
   3890 
   3891 		idalloc(ptr);
   3892 	}
   3893 }
   3894 
   3895 /*
   3896  * End malloc(3)-compatible functions.
   3897  */
   3898 /******************************************************************************/
   3899 /*
   3900  * Begin non-standard functions.
   3901  */
   3902 #ifndef __NetBSD__
   3903 size_t
   3904 malloc_usable_size(const void *ptr)
   3905 {
   3906 
   3907 	assert(ptr != NULL);
   3908 
   3909 	return (isalloc(ptr));
   3910 }
   3911 #endif
   3912 
   3913 /*
   3914  * End non-standard functions.
   3915  */
   3916 /******************************************************************************/
   3917 /*
   3918  * Begin library-private functions, used by threading libraries for protection
   3919  * of malloc during fork().  These functions are only called if the program is
   3920  * running in threaded mode, so there is no need to check whether the program
   3921  * is threaded here.
   3922  */
   3923 
   3924 void
   3925 _malloc_prefork(void)
   3926 {
   3927 	unsigned i;
   3928 
   3929 	/* Acquire all mutexes in a safe order. */
   3930 
   3931 	malloc_mutex_lock(&arenas_mtx);
   3932 	for (i = 0; i < narenas; i++) {
   3933 		if (arenas[i] != NULL)
   3934 			malloc_mutex_lock(&arenas[i]->mtx);
   3935 	}
   3936 
   3937 	malloc_mutex_lock(&base_mtx);
   3938 
   3939 	malloc_mutex_lock(&chunks_mtx);
   3940 }
   3941 
   3942 void
   3943 _malloc_postfork(void)
   3944 {
   3945 	unsigned i;
   3946 
   3947 	/* Release all mutexes, now that fork() has completed. */
   3948 
   3949 	malloc_mutex_unlock(&chunks_mtx);
   3950 
   3951 	malloc_mutex_unlock(&base_mtx);
   3952 
   3953 	for (i = 0; i < narenas; i++) {
   3954 		if (arenas[i] != NULL)
   3955 			malloc_mutex_unlock(&arenas[i]->mtx);
   3956 	}
   3957 	malloc_mutex_unlock(&arenas_mtx);
   3958 }
   3959 
   3960 /*
   3961  * End library-private functions.
   3962  */
   3963 /******************************************************************************/
   3964