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