From 57f0b08cc1c6be0afc4f563d41cacae7c5d820a9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 19 Aug 2006 16:25:15 +0000 Subject: generate per-type memory block statistics git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1293 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/pulsecore/memblock.c | 19 ++++++++++++++++++- src/pulsecore/memblock.h | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src/pulsecore') diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c index 90494fb6..c34ddee5 100644 --- a/src/pulsecore/memblock.c +++ b/src/pulsecore/memblock.c @@ -121,6 +121,9 @@ static void stat_add(pa_memblock*b) { b->pool->stat.n_imported++; b->pool->stat.imported_size += b->length; } + + b->pool->stat.n_allocated_by_type[b->type]++; + b->pool->stat.n_accumulated_by_type[b->type]++; } static void stat_remove(pa_memblock *b) { @@ -140,6 +143,8 @@ static void stat_remove(pa_memblock *b) { b->pool->stat.n_imported --; b->pool->stat.imported_size -= b->length; } + + b->pool->stat.n_allocated_by_type[b->type]--; } static pa_memblock *memblock_new_appended(pa_mempool *p, size_t length); @@ -353,13 +358,21 @@ void pa_memblock_unref(pa_memblock*b) { if (b->type == PA_MEMBLOCK_POOL_EXTERNAL) pa_xfree(b); + + break; } + + case PA_MEMBLOCK_TYPE_MAX: + default: + abort(); } } static void memblock_make_local(pa_memblock *b) { assert(b); + b->pool->stat.n_allocated_by_type[b->type]--; + if (b->length <= b->pool->block_size - sizeof(struct mempool_slot)) { struct mempool_slot *slot; @@ -373,7 +386,7 @@ static void memblock_make_local(pa_memblock *b) { new_data = mempool_slot_data(slot); memcpy(new_data, b->data, b->length); b->data = new_data; - return; + goto finish; } } @@ -382,6 +395,10 @@ static void memblock_make_local(pa_memblock *b) { b->per_type.user.free_cb = pa_xfree; b->read_only = 0; b->data = pa_xmemdup(b->data, b->length); + +finish: + b->pool->stat.n_allocated_by_type[b->type]++; + b->pool->stat.n_accumulated_by_type[b->type]++; } void pa_memblock_unref_fixed(pa_memblock *b) { diff --git a/src/pulsecore/memblock.h b/src/pulsecore/memblock.h index 70cd1b9e..620bf726 100644 --- a/src/pulsecore/memblock.h +++ b/src/pulsecore/memblock.h @@ -40,6 +40,7 @@ typedef enum pa_memblock_type { PA_MEMBLOCK_USER, /* User supplied memory, to be freed with free_cb */ PA_MEMBLOCK_FIXED, /* data is a pointer to fixed memory that needs not to be freed */ PA_MEMBLOCK_IMPORTED, /* Memory is imported from another process via shm */ + PA_MEMBLOCK_TYPE_MAX } pa_memblock_type_t; typedef struct pa_memblock pa_memblock; @@ -84,6 +85,9 @@ struct pa_mempool_stat { unsigned n_too_large_for_pool; unsigned n_pool_full; + + unsigned n_allocated_by_type[PA_MEMBLOCK_TYPE_MAX]; + unsigned n_accumulated_by_type[PA_MEMBLOCK_TYPE_MAX]; }; /* Allocate a new memory block of type PA_MEMBLOCK_MEMPOOL or PA_MEMBLOCK_APPENDED, depending on the size */ -- cgit