Ejemplo n.º 1
0
MOZ_JEMALLOC_API void
jemalloc_free_dirty_pages_impl()
{
    unsigned narenas;
    size_t mib[3];
    size_t miblen = sizeof(mib) / sizeof(mib[0]);

    CTL_GET("arenas.narenas", narenas);
    je_(mallctlnametomib)("arena.0.purge", mib, &miblen);
    mib[1] = narenas;
    je_(mallctlbymib)(mib, miblen, NULL, NULL, NULL, 0);
}
Ejemplo n.º 2
0
MOZ_JEMALLOC_API void
jemalloc_stats_impl(jemalloc_stats_t *stats)
{
    unsigned narenas;
    size_t active, allocated, mapped, page, pdirty;
    size_t lg_chunk;

    // Refresh jemalloc's stats by updating its epoch, see ctl_refresh in
    // src/ctl.c
    uint64_t epoch = 0;
    size_t esz = sizeof(epoch);
    int ret = je_(mallctl)("epoch", &epoch, &esz, &epoch, esz);

    CTL_GET("arenas.narenas", narenas);
    CTL_GET("arenas.page", page);
    CTL_GET("stats.active", active);
    CTL_GET("stats.allocated", allocated);
    CTL_GET("stats.mapped", mapped);
    CTL_GET("opt.lg_chunk", lg_chunk);
    CTL_GET("stats.bookkeeping", stats->bookkeeping);

    /* get the summation for all arenas, i == narenas */
    CTL_I_GET("stats.arenas.0.pdirty", pdirty, narenas);

    stats->chunksize = (size_t) 1 << lg_chunk;
    stats->mapped = mapped;
    stats->allocated = allocated;
    stats->waste = active - allocated;
    stats->page_cache = pdirty * page;
    stats->bin_unused = compute_bin_unused(narenas);
    stats->waste -= stats->bin_unused;
}
Ejemplo n.º 3
0
MOZ_MEMORY_API size_t
malloc_good_size_impl(size_t size)
{
  /* je_nallocx crashes when given a size of 0. As
   * malloc_usable_size(malloc(0)) and malloc_usable_size(malloc(1))
   * return the same value, use a size of 1. */
  if (size == 0)
    size = 1;
  return je_(nallocx)(size, 0);
}
Ejemplo n.º 4
0
MOZ_MEMORY_API size_t
malloc_good_size_impl(size_t size)
{
  size_t ret;
  /* je_nallocm crashes when given a size of 0. As
   * malloc_usable_size(malloc(0)) and malloc_usable_size(malloc(1))
   * return the same value, use a size of 1. */
  if (size == 0)
    size = 1;
  if (!je_(nallocm)(&ret, size, 0))
    return ret;
  return size;
}
Ejemplo n.º 5
0
static void
compute_bin_unused_and_bookkeeping(jemalloc_stats_t *stats, unsigned int narenas)
{
    size_t bin_unused = 0;

    uint32_t nregs; // number of regions per run in the j-th bin
    size_t reg_size; // size of regions served by the j-th bin
    size_t curruns; // number of runs belonging to a bin
    size_t curregs; // number of allocated regions in a bin

    unsigned int nbins; // number of bins per arena
    unsigned int i, j;

    size_t stats_metadata;
    size_t stats_ametadata = 0; // total internal allocations in all arenas

    // narenas also counts uninitialized arenas, and initialized arenas
    // are not guaranteed to be adjacent
    VARIABLE_ARRAY(bool, initialized, narenas);
    size_t isz = sizeof(initialized) / sizeof(initialized[0]);

    je_(mallctl)("arenas.initialized", initialized, &isz, NULL, 0);
    CTL_GET("arenas.nbins", nbins);

    for (j = 0; j < nbins; j++) {
        CTL_I_GET("arenas.bin.0.nregs", nregs, j);
        CTL_I_GET("arenas.bin.0.size", reg_size, j);

        for (i = 0; i < narenas; i++) {
            if (!initialized[i]) {
                continue;
            }

            CTL_IJ_GET("stats.arenas.0.bins.0.curruns", curruns, i, j);
            CTL_IJ_GET("stats.arenas.0.bins.0.curregs", curregs, i, j);

            bin_unused += (nregs * curruns - curregs) * reg_size;
        }
    }

    CTL_GET("stats.metadata", stats_metadata);

    /* get the summation for all arenas, i == narenas */
    CTL_I_GET("stats.arenas.0.metadata.allocated", stats_ametadata, narenas);

    stats->bookkeeping = stats_metadata - stats_ametadata;
    stats->bin_unused = bin_unused;
}
Ejemplo n.º 6
0
static size_t
compute_bin_unused(unsigned int narenas)
{
    size_t bin_unused = 0;

    uint32_t nregs; // number of regions per run in the j-th bin
    size_t reg_size; // size of regions served by the j-th bin
    size_t curruns; // number of runs belonging to a bin
    size_t curregs; // number of allocated regions in a bin

    unsigned int nbins; // number of bins per arena
    unsigned int i, j;

    // narenas also counts uninitialized arenas, and initialized arenas
    // are not guaranteed to be adjacent
    VARIABLE_ARRAY(bool, initialized, narenas);
    size_t isz = sizeof(initialized) / sizeof(initialized[0]);

    je_(mallctl)("arenas.initialized", initialized, &isz, NULL, 0);
    CTL_GET("arenas.nbins", nbins);

    for (j = 0; j < nbins; j++) {
        CTL_I_GET("arenas.bin.0.nregs", nregs, j);
        CTL_I_GET("arenas.bin.0.size", reg_size, j);

        for (i = 0; i < narenas; i++) {
            if (!initialized[i]) {
                continue;
            }

            CTL_IJ_GET("stats.arenas.0.bins.0.curruns", curruns, i, j);
            CTL_IJ_GET("stats.arenas.0.bins.0.curregs", curregs, i, j);

            bin_unused += (nregs * curruns - curregs) * reg_size;
        }
    }

    return bin_unused;
}
Ejemplo n.º 7
0
MOZ_JEMALLOC_API void
jemalloc_free_dirty_pages_impl()
{
  je_(mallctl)("arenas.purge", NULL, 0, NULL, 0);
}