From 6db41264efc2ab8bdcff061476366359d29550ba Mon Sep 17 00:00:00 2001 From: yuqing Date: Sun, 26 Oct 2014 11:52:28 +0800 Subject: [PATCH] mblock support alloc_init_func --- HISTORY | 3 ++- src/fast_mblock.c | 27 ++++++++++++++++++++++++--- src/fast_mblock.h | 10 ++++++++-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/HISTORY b/HISTORY index a84259c..73bf214 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,7 @@ -Version 1.09 2014-10-24 +Version 1.09 2014-10-26 * Version struct add variable: patch * get local ipaddr support interface based 1 + * mblock support alloc_init_func Version 1.08 2014-10-09 * sched_thread.c: calculate next_call_time correctly diff --git a/src/fast_mblock.c b/src/fast_mblock.c index c38035a..4e4ecd1 100644 --- a/src/fast_mblock.c +++ b/src/fast_mblock.c @@ -9,8 +9,8 @@ #include "shared_func.h" #include "pthread_func.h" -int fast_mblock_init(struct fast_mblock_man *mblock, const int element_size, \ - const int alloc_elements_once) +int fast_mblock_init_ex(struct fast_mblock_man *mblock, const int element_size, + const int alloc_elements_once, fast_mblock_alloc_init_func init_func) { int result; @@ -43,6 +43,7 @@ int fast_mblock_init(struct fast_mblock_man *mblock, const int element_size, \ return result; } + mblock->alloc_init_func = init_func; mblock->malloc_chain_head = NULL; mblock->free_chain_head = NULL; mblock->total_count = 0; @@ -58,6 +59,7 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) char *pTrunkStart; char *p; char *pLast; + int result; int block_size; int alloc_size; @@ -84,9 +86,28 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) for (p=pTrunkStart; palloc_init_func != NULL) + { + if ((result=mblock->alloc_init_func(pNode->data)) != 0) + { + free(pNew); + return result; + } + } pNode->next = (struct fast_mblock_node *)(p + block_size); } - ((struct fast_mblock_node *)pLast)->next = NULL; + + if (mblock->alloc_init_func != NULL) + { + if ((result=mblock->alloc_init_func(((struct fast_mblock_node *) + pLast)->data)) != 0) + { + free(pNew); + return result; + } + } + ((struct fast_mblock_node *)pLast)->next = NULL; mblock->free_chain_head = (struct fast_mblock_node *)pTrunkStart; pMallocNode->next = mblock->malloc_chain_head; diff --git a/src/fast_mblock.h b/src/fast_mblock.h index 858b306..b383af0 100644 --- a/src/fast_mblock.h +++ b/src/fast_mblock.h @@ -31,10 +31,13 @@ struct fast_mblock_malloc struct fast_mblock_malloc *next; }; +typedef int (*fast_mblock_alloc_init_func)(void *element); + struct fast_mblock_man { struct fast_mblock_node *free_chain_head; //free node chain struct fast_mblock_malloc *malloc_chain_head; //malloc chain to be freed + fast_mblock_alloc_init_func alloc_init_func; int element_size; //element size int alloc_elements_once; //alloc elements once int total_count; //total element count @@ -49,6 +52,9 @@ struct fast_mblock_man extern "C" { #endif +#define fast_mblock_init(mblock, element_size, alloc_elements_once) \ + fast_mblock_init_ex(mblock, element_size, alloc_elements_once, NULL) + /** mblock init parameters: @@ -57,8 +63,8 @@ parameters: alloc_elements_once: malloc elements once, 0 for malloc 1MB once return error no, 0 for success, != 0 fail */ -int fast_mblock_init(struct fast_mblock_man *mblock, const int element_size, \ - const int alloc_elements_once); +int fast_mblock_init_ex(struct fast_mblock_man *mblock, const int element_size, + const int alloc_elements_once, fast_mblock_alloc_init_func init_func); /** mblock destroy