summaryrefslogtreecommitdiff
path: root/accel-pppd/triton/mempool.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2011-01-26 00:50:30 +0300
committerDmitry Kozlov <xeb@mail.ru>2011-01-26 00:50:30 +0300
commit64b0cc8703122437fb46e890ea0c0b4fda1d77da (patch)
treec6a29f38bb442474ab8af80894cfce0b499fc023 /accel-pppd/triton/mempool.c
parent2742af0f2760b7b8d326aa4112aac14b453e3bbb (diff)
downloadaccel-ppp-64b0cc8703122437fb46e890ea0c0b4fda1d77da.tar.gz
accel-ppp-64b0cc8703122437fb46e890ea0c0b4fda1d77da.zip
futher memory usage optimization
Diffstat (limited to 'accel-pppd/triton/mempool.c')
-rw-r--r--accel-pppd/triton/mempool.c59
1 files changed, 24 insertions, 35 deletions
diff --git a/accel-pppd/triton/mempool.c b/accel-pppd/triton/mempool.c
index e3950dcb..eb33e427 100644
--- a/accel-pppd/triton/mempool.c
+++ b/accel-pppd/triton/mempool.c
@@ -20,6 +20,8 @@
#define MAGIC1 0x2233445566778899llu
#define PAGE_ORDER 5
+static int conf_mempool_min = 128;
+
struct _mempool_t
{
struct list_head entry;
@@ -31,6 +33,7 @@ struct _mempool_t
spinlock_t lock;
uint64_t magic;
int mmap:1;
+ int objects;
};
struct _item_t
@@ -56,6 +59,7 @@ static void *mmap_ptr;
static void *mmap_endptr;
static int mmap_grow(void);
+static void mempool_clean(void);
mempool_t __export *mempool_create(int size)
{
@@ -69,7 +73,6 @@ mempool_t __export *mempool_create(int size)
spinlock_init(&p->lock);
p->size = size;
p->magic = (uint64_t)random() * (uint64_t)random();
- p->mmap = 1;
spin_lock(&pools_lock);
list_add_tail(&p->entry, &pools);
@@ -100,6 +103,7 @@ void __export *mempool_alloc(mempool_t *pool)
list_del(&it->entry);
spin_unlock(&p->lock);
+ --p->objects;
__sync_sub_and_fetch(&triton_stat.mempool_available, size);
it->magic1 = MAGIC1;
@@ -160,6 +164,7 @@ void __export *mempool_alloc_md(mempool_t *pool, const char *fname, int line)
it->fname = fname;
it->line = line;
+ --p->objects;
__sync_sub_and_fetch(&triton_stat.mempool_available, size);
it->magic1 = MAGIC1;
@@ -208,6 +213,7 @@ void __export mempool_free(void *ptr)
struct _item_t *it = container_of(ptr, typeof(*it), ptr);
struct _mempool_t *p = it->owner;
uint32_t size = sizeof(*it) + it->owner->size + 8;
+ int need_free = 0;
#ifdef MEMDEBUG
if (it->magic1 != MAGIC1) {
@@ -233,7 +239,11 @@ void __export mempool_free(void *ptr)
list_del(&it->entry);
#endif
#ifndef MEMPOOL_DISABLE
- list_add_tail(&it->entry,&it->owner->items);
+ if (p->objects < conf_mempool_min) {
+ ++p->objects;
+ list_add_tail(&it->entry,&it->owner->items);
+ } else
+ need_free = 1;
#endif
#ifdef VALGRIND
time(&it->timestamp);
@@ -242,41 +252,15 @@ void __export mempool_free(void *ptr)
spin_unlock(&p->lock);
#ifdef MEMPOOL_DISABLE
- if (it->owner->mmap)
- munmap(it, size);
- else
+ _free(it);
+#else
+ if (need_free) {
_free(it);
-#endif
-
- __sync_add_and_fetch(&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);
-#ifdef VALGRIND
- if (it->timestamp + DELAY < time(NULL)) {
- VALGRIND_MAKE_MEM_DEFINED(&it->owner, size - sizeof(it->entry) - sizeof(it->timestamp));
-#endif
- list_del(&it->entry);
- if (p->mmap)
- munmap(it, size);
- else
- _free(it);
__sync_sub_and_fetch(&triton_stat.mempool_allocated, size);
- __sync_sub_and_fetch(&triton_stat.mempool_available, size);
-#ifdef VALGRIND
- } else
- break;
+ } else
+ __sync_add_and_fetch(&triton_stat.mempool_available, size);
#endif
- }
- spin_unlock(&p->lock);
+
}
#ifdef MEMDEBUG
@@ -292,7 +276,7 @@ void __export mempool_show(mempool_t *pool)
}
#endif
-void sigclean(int num)
+static void mempool_clean(void)
{
struct _mempool_t *p;
struct _item_t *it;
@@ -326,6 +310,11 @@ void sigclean(int num)
spin_unlock(&pools_lock);
}
+static void sigclean(int num)
+{
+ mempool_clean();
+}
+
static int mmap_grow(void)
{
int size = sysconf(_SC_PAGE_SIZE) * (1 << PAGE_ORDER);