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