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