xref: /freebsd/contrib/jemalloc/src/bin.c (revision 0ef50b4ec8737044c26bf6de2968747df658bc7f)
1*0ef50b4eSJason Evans #include "jemalloc/internal/jemalloc_preamble.h"
2*0ef50b4eSJason Evans #include "jemalloc/internal/jemalloc_internal_includes.h"
3*0ef50b4eSJason Evans 
4*0ef50b4eSJason Evans #include "jemalloc/internal/bin.h"
5*0ef50b4eSJason Evans #include "jemalloc/internal/witness.h"
6*0ef50b4eSJason Evans 
7*0ef50b4eSJason Evans const bin_info_t bin_infos[NBINS] = {
8*0ef50b4eSJason Evans #define BIN_INFO_bin_yes(reg_size, slab_size, nregs)			\
9*0ef50b4eSJason Evans 	{reg_size, slab_size, nregs, BITMAP_INFO_INITIALIZER(nregs)},
10*0ef50b4eSJason Evans #define BIN_INFO_bin_no(reg_size, slab_size, nregs)
11*0ef50b4eSJason Evans #define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs,		\
12*0ef50b4eSJason Evans     lg_delta_lookup)							\
13*0ef50b4eSJason Evans 	BIN_INFO_bin_##bin((1U<<lg_grp) + (ndelta<<lg_delta),		\
14*0ef50b4eSJason Evans 	    (pgs << LG_PAGE), (pgs << LG_PAGE) / ((1U<<lg_grp) +	\
15*0ef50b4eSJason Evans 	    (ndelta<<lg_delta)))
16*0ef50b4eSJason Evans 	SIZE_CLASSES
17*0ef50b4eSJason Evans #undef BIN_INFO_bin_yes
18*0ef50b4eSJason Evans #undef BIN_INFO_bin_no
19*0ef50b4eSJason Evans #undef SC
20*0ef50b4eSJason Evans };
21*0ef50b4eSJason Evans 
22*0ef50b4eSJason Evans bool
23*0ef50b4eSJason Evans bin_init(bin_t *bin) {
24*0ef50b4eSJason Evans 	if (malloc_mutex_init(&bin->lock, "bin", WITNESS_RANK_BIN,
25*0ef50b4eSJason Evans 	    malloc_mutex_rank_exclusive)) {
26*0ef50b4eSJason Evans 		return true;
27*0ef50b4eSJason Evans 	}
28*0ef50b4eSJason Evans 	bin->slabcur = NULL;
29*0ef50b4eSJason Evans 	extent_heap_new(&bin->slabs_nonfull);
30*0ef50b4eSJason Evans 	extent_list_init(&bin->slabs_full);
31*0ef50b4eSJason Evans 	if (config_stats) {
32*0ef50b4eSJason Evans 		memset(&bin->stats, 0, sizeof(bin_stats_t));
33*0ef50b4eSJason Evans 	}
34*0ef50b4eSJason Evans 	return false;
35*0ef50b4eSJason Evans }
36*0ef50b4eSJason Evans 
37*0ef50b4eSJason Evans void
38*0ef50b4eSJason Evans bin_prefork(tsdn_t *tsdn, bin_t *bin) {
39*0ef50b4eSJason Evans 	malloc_mutex_prefork(tsdn, &bin->lock);
40*0ef50b4eSJason Evans }
41*0ef50b4eSJason Evans 
42*0ef50b4eSJason Evans void
43*0ef50b4eSJason Evans bin_postfork_parent(tsdn_t *tsdn, bin_t *bin) {
44*0ef50b4eSJason Evans 	malloc_mutex_postfork_parent(tsdn, &bin->lock);
45*0ef50b4eSJason Evans }
46*0ef50b4eSJason Evans 
47*0ef50b4eSJason Evans void
48*0ef50b4eSJason Evans bin_postfork_child(tsdn_t *tsdn, bin_t *bin) {
49*0ef50b4eSJason Evans 	malloc_mutex_postfork_child(tsdn, &bin->lock);
50*0ef50b4eSJason Evans }
51