diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2010-12-23 01:24:01 +0300 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2010-12-23 01:24:01 +0300 |
commit | 5d87e39182189250bfa035f0ae9a48c94fe74903 (patch) | |
tree | 6b16f3f0abf9f3a80ddd20acb2bae8e71cedd4a1 /accel-pptpd/triton | |
parent | 6268016c6aeaefd500b879260ab9a5b69eb911dc (diff) | |
download | accel-ppp-5d87e39182189250bfa035f0ae9a48c94fe74903.tar.gz accel-ppp-5d87e39182189250bfa035f0ae9a48c94fe74903.zip |
minor changes
Diffstat (limited to 'accel-pptpd/triton')
-rw-r--r-- | accel-pptpd/triton/mempool.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/accel-pptpd/triton/mempool.c b/accel-pptpd/triton/mempool.c index a2448760..65597921 100644 --- a/accel-pptpd/triton/mempool.c +++ b/accel-pptpd/triton/mempool.c @@ -11,9 +11,11 @@ #ifdef VALGRIND #include <valgrind/memcheck.h> -#endif - +#define DELAY 5 +#define MMAP_PAGE_SIZE 1 +#else #define MMAP_PAGE_SIZE 16 +#endif //#define MEMPOOL_DISABLE @@ -35,6 +37,9 @@ struct _mempool_t struct _item_t { struct list_head entry; +#ifdef VALGRIND + time_t timestamp; +#endif struct _mempool_t *owner; #ifdef MEMDEBUG const char *fname; @@ -129,7 +134,8 @@ 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); #ifdef VALGRIND - VALGRIND_MAKE_MEM_DEFINED(&it->owner, size - sizeof(it->entry)); + if (it->timestamp + DELAY < time(NULL)) { + VALGRIND_MAKE_MEM_DEFINED(&it->owner, size - sizeof(it->entry) - sizeof(it->timestamp)); VALGRIND_MAKE_MEM_UNDEFINED(it->ptr, p->size); #endif list_del(&it->entry); @@ -144,20 +150,26 @@ void __export *mempool_alloc_md(mempool_t *pool, const char *fname, int line) it->magic1 = MAGIC1; return it->ptr; +#ifdef VALGRIND + } +#endif } spin_unlock(&p->lock); if (p->mmap) { it = mmap(NULL, size * MMAP_PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_32BIT, -1, 0); + __sync_add_and_fetch(&triton_stat.mempool_allocated, size * (MMAP_PAGE_SIZE - 1)); + __sync_add_and_fetch(&triton_stat.mempool_available, size * (MMAP_PAGE_SIZE - 1)); spin_lock(&p->lock); for (i = 0; i < MMAP_PAGE_SIZE - 1; i++, it) { it->owner = p; it->magic2 = p->magic; it->magic1 = MAGIC1; + it->timestamp = 0; *(uint64_t*)(it->ptr + p->size) = it->magic2; list_add_tail(&it->entry,&p->items); #ifdef VALGRIND - VALGRIND_MAKE_MEM_NOACCESS(&it->owner, size - sizeof(it->entry)); + VALGRIND_MAKE_MEM_NOACCESS(&it->owner, size - sizeof(it->entry) - sizeof(it->timestamp)); #endif it = (struct _item_t *)((char *)it + size); } @@ -222,7 +234,8 @@ void __export mempool_free(void *ptr) list_add_tail(&it->entry,&it->owner->items); #endif #ifdef VALGRIND - VALGRIND_MAKE_MEM_NOACCESS(&it->owner, size - sizeof(it->entry)); + time(&it->timestamp); + VALGRIND_MAKE_MEM_NOACCESS(&it->owner, size - sizeof(it->entry) - sizeof(it->timestamp)); #endif spin_unlock(&p->lock); @@ -245,6 +258,10 @@ void __export mempool_clean(mempool_t *pool) 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); @@ -252,6 +269,10 @@ void __export mempool_clean(mempool_t *pool) _free(it); __sync_sub_and_fetch(&triton_stat.mempool_allocated, size); __sync_sub_and_fetch(&triton_stat.mempool_available, size); +#ifdef VALGRIND + } else + break; +#endif } spin_unlock(&p->lock); } @@ -283,6 +304,10 @@ void sigclean(int num) 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); @@ -290,6 +315,10 @@ void sigclean(int num) _free(it); __sync_sub_and_fetch(&triton_stat.mempool_allocated, size); __sync_sub_and_fetch(&triton_stat.mempool_available, size); +#ifdef VALGRIND + } else + break; +#endif } spin_unlock(&p->lock); } |