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