From 763fe9e3ba0faeea25cc423152a065900f901a53 Mon Sep 17 00:00:00 2001 From: Kozlov Dmitry Date: Thu, 14 Oct 2010 11:28:17 +0400 Subject: various bug fixed and improvements --- accel-pptpd/triton/mempool.c | 64 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) (limited to 'accel-pptpd/triton') diff --git a/accel-pptpd/triton/mempool.c b/accel-pptpd/triton/mempool.c index c96c3ba2..bd951b43 100644 --- a/accel-pptpd/triton/mempool.c +++ b/accel-pptpd/triton/mempool.c @@ -14,6 +14,9 @@ struct _mempool_t struct list_head entry; int size; struct list_head items; +#ifdef MEMDEBUG + struct list_head ditems; +#endif spinlock_t lock; uint64_t magic; }; @@ -22,6 +25,10 @@ struct _item_t { struct _mempool_t *owner; struct list_head entry; +#ifdef MEMDEBUG + const char *fname; + int line; +#endif uint64_t magic2; uint64_t magic1; char ptr[0]; @@ -30,12 +37,15 @@ struct _item_t static LIST_HEAD(pools); static spinlock_t pools_lock = SPINLOCK_INITIALIZER; -__export mempool_t *mempool_create(int size) +mempool_t __export *mempool_create(int size) { struct _mempool_t *p = _malloc(sizeof(*p)); memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->items); +#ifdef MEMDEBUG + INIT_LIST_HEAD(&p->ditems); +#endif spinlock_init(&p->lock); p->size = size; p->magic = (uint64_t)random() * (uint64_t)random(); @@ -48,7 +58,7 @@ __export mempool_t *mempool_create(int size) } #ifndef MEMDEBUG -__export void *mempool_alloc(mempool_t *pool) +void __export *mempool_alloc(mempool_t *pool) { struct _mempool_t *p = (struct _mempool_t *)pool; struct _item_t *it; @@ -94,7 +104,11 @@ void __export *mempool_alloc_md(mempool_t *pool, const char *fname, int line) if (!list_empty(&p->items)) { it = list_entry(p->items.next, typeof(*it), entry); list_del(&it->entry); + list_add(&it->entry, &p->ditems); spin_unlock(&p->lock); + + it->fname = fname; + it->line = line; __sync_fetch_and_sub(&triton_stat.mempool_available, size); @@ -112,19 +126,26 @@ void __export *mempool_alloc_md(mempool_t *pool, const char *fname, int line) it->owner = p; it->magic2 = p->magic; it->magic1 = MAGIC1; + it->fname = fname; + it->line = line; *(uint64_t*)(it->ptr + p->size) = it->magic2; + spin_lock(&p->lock); + list_add(&it->entry, &p->ditems); + spin_unlock(&p->lock); + __sync_fetch_and_add(&triton_stat.mempool_allocated, size); return it->ptr; } -__export void mempool_free(void *ptr) +void __export mempool_free(void *ptr) { struct _item_t *it = container_of(ptr, typeof(*it), ptr); uint32_t size = sizeof(*it) + it->owner->size + 8; +#ifdef MEMDEBUG if (it->magic1 != MAGIC1) { triton_log_error("mempool: memory corruption detected"); abort(); @@ -141,14 +162,48 @@ __export void mempool_free(void *ptr) } it->magic1 = 0; +#endif spin_lock(&it->owner->lock); +#ifdef MEMDEBUG + list_del(&it->entry); +#endif list_add_tail(&it->entry,&it->owner->items); spin_unlock(&it->owner->lock); __sync_fetch_and_add(&triton_stat.mempool_available, size); } +void __export mempool_clean(mempool_t *pool) +{ + struct _mempool_t *p = (struct _mempool_t *)pool; + struct _item_t *it; + uint32_t size = sizeof(*it) + p->size + 8; + + spin_lock(&p->lock); + while (!list_empty(&p->items)) { + it = list_entry(p->items.next, typeof(*it), entry); + list_del(&it->entry); + _free(it); + __sync_fetch_and_sub(&triton_stat.mempool_allocated, size); + __sync_fetch_and_sub(&triton_stat.mempool_available, size); + } + spin_unlock(&p->lock); +} + +#ifdef MEMDEBUG +void __export mempool_show(mempool_t *pool) +{ + struct _mempool_t *p = (struct _mempool_t *)pool; + struct _item_t *it; + + spin_lock(&p->lock); + list_for_each_entry(it, &p->ditems, entry) + triton_log_error("%s:%i %p\n", it->fname, it->line, it->ptr); + spin_unlock(&p->lock); +} +#endif + void sigclean(int num) { struct _mempool_t *p; @@ -159,7 +214,7 @@ void sigclean(int num) spin_lock(&pools_lock); list_for_each_entry(p, &pools, entry) { - size = sizeof(*it) + p->size; + size = sizeof(*it) + p->size + 8; spin_lock(&p->lock); while (!list_empty(&p->items)) { it = list_entry(p->items.next, typeof(*it), entry); @@ -177,3 +232,4 @@ static void __init init(void) { signal(35, sigclean); } + -- cgit v1.2.3