summaryrefslogtreecommitdiffstats
path: root/src/arena.c
diff options
context:
space:
mode:
authorQinfan Wu <wqfish@fb.com>2014-07-21 17:23:36 (GMT)
committerQinfan Wu <wqfish@fb.com>2014-08-12 16:50:00 (GMT)
commita244e5078e8505978b5f63cfe6dcb3c9d63d2cb5 (patch)
tree9e95378e5d059d974fa328d34e16369c8fb3cf91 /src/arena.c
parent04d60a132beed9e8c33f73b94fb9251b919073c8 (diff)
downloadjemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.zip
jemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.tar.gz
jemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.tar.bz2
Add dirty page counting for debug
Diffstat (limited to 'src/arena.c')
-rw-r--r--src/arena.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/arena.c b/src/arena.c
index 3397731..3cf1abf 100644
--- a/src/arena.c
+++ b/src/arena.c
@@ -923,11 +923,33 @@ arena_maybe_purge(arena_t *arena)
static arena_chunk_t *
chunks_dirty_iter_cb(arena_chunk_tree_t *tree, arena_chunk_t *chunk, void *arg)
{
- size_t *ndirty = (size_t *)arg;
+ size_t *ndirty = (size_t *)arg;
- assert(chunk->ndirty != 0);
- *ndirty += chunk->ndirty;
- return (NULL);
+ assert(chunk->ndirty != 0);
+ *ndirty += chunk->ndirty;
+ return (NULL);
+}
+
+static size_t
+arena_dirty_count(arena_t *arena)
+{
+ size_t ndirty = 0;
+ arena_chunk_map_t *mapelm;
+ arena_chunk_t *chunk;
+ size_t pageind, npages;
+
+ ql_foreach(mapelm, &arena->runs_dirty, dr_link) {
+ chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm);
+ pageind = arena_mapelm_to_pageind(mapelm);
+ assert(arena_mapbits_allocated_get(chunk, pageind) == 0);
+ assert(arena_mapbits_large_get(chunk, pageind) == 0);
+ assert(arena_mapbits_dirty_get(chunk, pageind) != 0);
+ npages = arena_mapbits_unallocated_size_get(chunk, pageind) >>
+ LG_PAGE;
+ ndirty += npages;
+ }
+
+ return (ndirty);
}
static size_t
@@ -1134,6 +1156,9 @@ arena_purge(arena_t *arena, bool all)
arena_chunk_dirty_iter(&arena->chunks_dirty, NULL,
chunks_dirty_iter_cb, (void *)&ndirty);
assert(ndirty == arena->ndirty);
+
+ ndirty = arena_dirty_count(arena);
+ assert(ndirty == arena->ndirty);
}
assert(arena->ndirty > arena->npurgatory || all);
assert((arena->nactive >> opt_lg_dirty_mult) < (arena->ndirty -