1*c43cad87SWarner Losh #include "jemalloc/internal/jemalloc_preamble.h" 2*c43cad87SWarner Losh #include "jemalloc/internal/jemalloc_internal_includes.h" 3*c43cad87SWarner Losh 4*c43cad87SWarner Losh void 5*c43cad87SWarner Losh inspect_extent_util_stats_get(tsdn_t *tsdn, const void *ptr, size_t *nfree, 6*c43cad87SWarner Losh size_t *nregs, size_t *size) { 7*c43cad87SWarner Losh assert(ptr != NULL && nfree != NULL && nregs != NULL && size != NULL); 8*c43cad87SWarner Losh 9*c43cad87SWarner Losh const edata_t *edata = emap_edata_lookup(tsdn, &arena_emap_global, ptr); 10*c43cad87SWarner Losh if (unlikely(edata == NULL)) { 11*c43cad87SWarner Losh *nfree = *nregs = *size = 0; 12*c43cad87SWarner Losh return; 13*c43cad87SWarner Losh } 14*c43cad87SWarner Losh 15*c43cad87SWarner Losh *size = edata_size_get(edata); 16*c43cad87SWarner Losh if (!edata_slab_get(edata)) { 17*c43cad87SWarner Losh *nfree = 0; 18*c43cad87SWarner Losh *nregs = 1; 19*c43cad87SWarner Losh } else { 20*c43cad87SWarner Losh *nfree = edata_nfree_get(edata); 21*c43cad87SWarner Losh *nregs = bin_infos[edata_szind_get(edata)].nregs; 22*c43cad87SWarner Losh assert(*nfree <= *nregs); 23*c43cad87SWarner Losh assert(*nfree * edata_usize_get(edata) <= *size); 24*c43cad87SWarner Losh } 25*c43cad87SWarner Losh } 26*c43cad87SWarner Losh 27*c43cad87SWarner Losh void 28*c43cad87SWarner Losh inspect_extent_util_stats_verbose_get(tsdn_t *tsdn, const void *ptr, 29*c43cad87SWarner Losh size_t *nfree, size_t *nregs, size_t *size, size_t *bin_nfree, 30*c43cad87SWarner Losh size_t *bin_nregs, void **slabcur_addr) { 31*c43cad87SWarner Losh assert(ptr != NULL && nfree != NULL && nregs != NULL && size != NULL 32*c43cad87SWarner Losh && bin_nfree != NULL && bin_nregs != NULL && slabcur_addr != NULL); 33*c43cad87SWarner Losh 34*c43cad87SWarner Losh const edata_t *edata = emap_edata_lookup(tsdn, &arena_emap_global, ptr); 35*c43cad87SWarner Losh if (unlikely(edata == NULL)) { 36*c43cad87SWarner Losh *nfree = *nregs = *size = *bin_nfree = *bin_nregs = 0; 37*c43cad87SWarner Losh *slabcur_addr = NULL; 38*c43cad87SWarner Losh return; 39*c43cad87SWarner Losh } 40*c43cad87SWarner Losh 41*c43cad87SWarner Losh *size = edata_size_get(edata); 42*c43cad87SWarner Losh if (!edata_slab_get(edata)) { 43*c43cad87SWarner Losh *nfree = *bin_nfree = *bin_nregs = 0; 44*c43cad87SWarner Losh *nregs = 1; 45*c43cad87SWarner Losh *slabcur_addr = NULL; 46*c43cad87SWarner Losh return; 47*c43cad87SWarner Losh } 48*c43cad87SWarner Losh 49*c43cad87SWarner Losh *nfree = edata_nfree_get(edata); 50*c43cad87SWarner Losh const szind_t szind = edata_szind_get(edata); 51*c43cad87SWarner Losh *nregs = bin_infos[szind].nregs; 52*c43cad87SWarner Losh assert(*nfree <= *nregs); 53*c43cad87SWarner Losh assert(*nfree * edata_usize_get(edata) <= *size); 54*c43cad87SWarner Losh 55*c43cad87SWarner Losh arena_t *arena = (arena_t *)atomic_load_p( 56*c43cad87SWarner Losh &arenas[edata_arena_ind_get(edata)], ATOMIC_RELAXED); 57*c43cad87SWarner Losh assert(arena != NULL); 58*c43cad87SWarner Losh const unsigned binshard = edata_binshard_get(edata); 59*c43cad87SWarner Losh bin_t *bin = arena_get_bin(arena, szind, binshard); 60*c43cad87SWarner Losh 61*c43cad87SWarner Losh malloc_mutex_lock(tsdn, &bin->lock); 62*c43cad87SWarner Losh if (config_stats) { 63*c43cad87SWarner Losh *bin_nregs = *nregs * bin->stats.curslabs; 64*c43cad87SWarner Losh assert(*bin_nregs >= bin->stats.curregs); 65*c43cad87SWarner Losh *bin_nfree = *bin_nregs - bin->stats.curregs; 66*c43cad87SWarner Losh } else { 67*c43cad87SWarner Losh *bin_nfree = *bin_nregs = 0; 68*c43cad87SWarner Losh } 69*c43cad87SWarner Losh edata_t *slab; 70*c43cad87SWarner Losh if (bin->slabcur != NULL) { 71*c43cad87SWarner Losh slab = bin->slabcur; 72*c43cad87SWarner Losh } else { 73*c43cad87SWarner Losh slab = edata_heap_first(&bin->slabs_nonfull); 74*c43cad87SWarner Losh } 75*c43cad87SWarner Losh *slabcur_addr = slab != NULL ? edata_addr_get(slab) : NULL; 76*c43cad87SWarner Losh malloc_mutex_unlock(tsdn, &bin->lock); 77*c43cad87SWarner Losh } 78