xref: /freebsd/contrib/jemalloc/src/inspect.c (revision c43cad87172039ccf38172129c79755ea79e6102)
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