summaryrefslogtreecommitdiff
path: root/accel-pptpd/triton
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-10-14 11:28:17 +0400
committerKozlov Dmitry <dima@server>2010-10-14 11:28:17 +0400
commit763fe9e3ba0faeea25cc423152a065900f901a53 (patch)
treed3772cac139507699746461afc16a26e20065f21 /accel-pptpd/triton
parent80e8ec99aeffcec505165f099f68d0fb2903e12b (diff)
downloadaccel-ppp-763fe9e3ba0faeea25cc423152a065900f901a53.tar.gz
accel-ppp-763fe9e3ba0faeea25cc423152a065900f901a53.zip
various bug fixed and improvements
Diffstat (limited to 'accel-pptpd/triton')
-rw-r--r--accel-pptpd/triton/mempool.c64
1 files changed, 60 insertions, 4 deletions
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);
}
+