1b7eaed25SJason Evans #include "jemalloc/internal/jemalloc_preamble.h" 2b7eaed25SJason Evans #include "jemalloc/internal/sz.h" 3b7eaed25SJason Evans JEMALLOC_ALIGNED(CACHELINE)4b7eaed25SJason EvansJEMALLOC_ALIGNED(CACHELINE) 5*c5ad8142SEric van Gyzen size_t sz_pind2sz_tab[SC_NPSIZES+1]; 6*c5ad8142SEric van Gyzen 7*c5ad8142SEric van Gyzen static void 8*c5ad8142SEric van Gyzen sz_boot_pind2sz_tab(const sc_data_t *sc_data) { 9*c5ad8142SEric van Gyzen int pind = 0; 10*c5ad8142SEric van Gyzen for (unsigned i = 0; i < SC_NSIZES; i++) { 11*c5ad8142SEric van Gyzen const sc_t *sc = &sc_data->sc[i]; 12*c5ad8142SEric van Gyzen if (sc->psz) { 13*c5ad8142SEric van Gyzen sz_pind2sz_tab[pind] = (ZU(1) << sc->lg_base) 14*c5ad8142SEric van Gyzen + (ZU(sc->ndelta) << sc->lg_delta); 15*c5ad8142SEric van Gyzen pind++; 16*c5ad8142SEric van Gyzen } 17*c5ad8142SEric van Gyzen } 18*c5ad8142SEric van Gyzen for (int i = pind; i <= (int)SC_NPSIZES; i++) { 19*c5ad8142SEric van Gyzen sz_pind2sz_tab[pind] = sc_data->large_maxclass + PAGE; 20*c5ad8142SEric van Gyzen } 21*c5ad8142SEric van Gyzen } 22b7eaed25SJason Evans JEMALLOC_ALIGNED(CACHELINE)23b7eaed25SJason EvansJEMALLOC_ALIGNED(CACHELINE) 24*c5ad8142SEric van Gyzen size_t sz_index2size_tab[SC_NSIZES]; 25b7eaed25SJason Evans 26*c5ad8142SEric van Gyzen static void 27*c5ad8142SEric van Gyzen sz_boot_index2size_tab(const sc_data_t *sc_data) { 28*c5ad8142SEric van Gyzen for (unsigned i = 0; i < SC_NSIZES; i++) { 29*c5ad8142SEric van Gyzen const sc_t *sc = &sc_data->sc[i]; 30*c5ad8142SEric van Gyzen sz_index2size_tab[i] = (ZU(1) << sc->lg_base) 31*c5ad8142SEric van Gyzen + (ZU(sc->ndelta) << (sc->lg_delta)); 32*c5ad8142SEric van Gyzen } 33*c5ad8142SEric van Gyzen } 34*c5ad8142SEric van Gyzen 35*c5ad8142SEric van Gyzen /* 36*c5ad8142SEric van Gyzen * To keep this table small, we divide sizes by the tiny min size, which gives 37*c5ad8142SEric van Gyzen * the smallest interval for which the result can change. 38*c5ad8142SEric van Gyzen */ JEMALLOC_ALIGNED(CACHELINE)39b7eaed25SJason EvansJEMALLOC_ALIGNED(CACHELINE) 40*c5ad8142SEric van Gyzen uint8_t sz_size2index_tab[(SC_LOOKUP_MAXCLASS >> SC_LG_TINY_MIN) + 1]; 41*c5ad8142SEric van Gyzen 42*c5ad8142SEric van Gyzen static void 43*c5ad8142SEric van Gyzen sz_boot_size2index_tab(const sc_data_t *sc_data) { 44*c5ad8142SEric van Gyzen size_t dst_max = (SC_LOOKUP_MAXCLASS >> SC_LG_TINY_MIN) + 1; 45*c5ad8142SEric van Gyzen size_t dst_ind = 0; 46*c5ad8142SEric van Gyzen for (unsigned sc_ind = 0; sc_ind < SC_NSIZES && dst_ind < dst_max; 47*c5ad8142SEric van Gyzen sc_ind++) { 48*c5ad8142SEric van Gyzen const sc_t *sc = &sc_data->sc[sc_ind]; 49*c5ad8142SEric van Gyzen size_t sz = (ZU(1) << sc->lg_base) 50*c5ad8142SEric van Gyzen + (ZU(sc->ndelta) << sc->lg_delta); 51*c5ad8142SEric van Gyzen size_t max_ind = ((sz + (ZU(1) << SC_LG_TINY_MIN) - 1) 52*c5ad8142SEric van Gyzen >> SC_LG_TINY_MIN); 53*c5ad8142SEric van Gyzen for (; dst_ind <= max_ind && dst_ind < dst_max; dst_ind++) { 54*c5ad8142SEric van Gyzen sz_size2index_tab[dst_ind] = sc_ind; 55*c5ad8142SEric van Gyzen } 56*c5ad8142SEric van Gyzen } 57*c5ad8142SEric van Gyzen } 58*c5ad8142SEric van Gyzen 59*c5ad8142SEric van Gyzen void sz_boot(const sc_data_t * sc_data)60*c5ad8142SEric van Gyzensz_boot(const sc_data_t *sc_data) { 61*c5ad8142SEric van Gyzen sz_boot_pind2sz_tab(sc_data); 62*c5ad8142SEric van Gyzen sz_boot_index2size_tab(sc_data); 63*c5ad8142SEric van Gyzen sz_boot_size2index_tab(sc_data); 64*c5ad8142SEric van Gyzen } 65