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