inspect.c 2.3 KB

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