1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
$NetBSD: patch-memory_build_mozjemalloc__compat.c,v 1.4 2015/12/16 09:34:56 ryoon Exp $
--- memory/build/mozjemalloc_compat.c.orig 2015-12-04 00:37:04.000000000 +0000
+++ memory/build/mozjemalloc_compat.c
@@ -140,6 +140,48 @@ compute_bin_unused_and_bookkeeping(jemal
stats->bin_unused = bin_unused;
}
+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;
+
+ // curruns and curregs are not defined for uninitialized arenas,
+ // so we skip them when computing bin_unused. However, initialized
+ // arenas are not guaranteed to be sequential, so we must test each
+ // one when iterating below.
+ bool initialized[100]; // should be narenas, but MSVC doesn't have VLAs
+ 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;
+}
+
MOZ_JEMALLOC_API void
jemalloc_stats_impl(jemalloc_stats_t *stats)
{
|