diff --git a/src/fast_mblock.c b/src/fast_mblock.c index 38198dd..197466e 100644 --- a/src/fast_mblock.c +++ b/src/fast_mblock.c @@ -374,7 +374,6 @@ int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, void *malloc_trunk_args) { int result; - int block_size; if (element_size <= 0) { @@ -386,14 +385,14 @@ int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, mblock->info.element_size = MEM_ALIGN(element_size); mblock->alloc_elements.limit = alloc_elements_limit; - block_size = fast_mblock_get_block_size(mblock); + mblock->info.block_size = fast_mblock_get_block_size(mblock); if (alloc_elements_once > 0) { mblock->alloc_elements.once = alloc_elements_once; } else { - mblock->alloc_elements.once = (1024 * 1024) / block_size; + mblock->alloc_elements.once = (1024 * 1024) / mblock->info.block_size; } if (mblock->alloc_elements.limit > 0 && mblock->alloc_elements.once > mblock->alloc_elements.limit) @@ -422,7 +421,7 @@ int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, mblock->info.element_used_count = 0; mblock->info.instance_count = 1; mblock->info.trunk_size = fast_mblock_get_trunk_size(mblock, - block_size, mblock->alloc_elements.once); + mblock->info.block_size, mblock->alloc_elements.once); mblock->need_lock = need_lock; mblock->alloc_elements.need_wait = false; mblock->alloc_elements.pcontinue_flag = NULL; @@ -453,11 +452,9 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) char *p; char *pLast; int result; - int block_size; int trunk_size; int alloc_count; - block_size = fast_mblock_get_block_size(mblock); if (mblock->alloc_elements.limit > 0) { int64_t avail_count; @@ -478,7 +475,7 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) alloc_count = avail_count > mblock->alloc_elements.once ? mblock->alloc_elements.once : avail_count; trunk_size = fast_mblock_get_trunk_size(mblock, - block_size, alloc_count); + mblock->info.block_size, alloc_count); } else { @@ -501,10 +498,9 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) memset(pNew, 0, trunk_size); pMallocNode = (struct fast_mblock_malloc *)pNew; - pTrunkStart = pNew + sizeof(struct fast_mblock_malloc); - pLast = pNew + (trunk_size - block_size); - for (p=pTrunkStart; p<=pLast; p += block_size) + pLast = pNew + (trunk_size - mblock->info.block_size); + for (p=pTrunkStart; p<=pLast; p += mblock->info.block_size) { pNode = (struct fast_mblock_node *)p; if (mblock->alloc_init_func != NULL) @@ -516,8 +512,14 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) return result; } } + pNode->offset = (int)(p - pNew); - pNode->next = (struct fast_mblock_node *)(p + block_size); + pNode->next = (struct fast_mblock_node *)(p + mblock->info.block_size); + +#ifdef FAST_MBLOCK_MAGIC_CHECK + pNode->index = (p - pTrunkStart) / mblock->info.block_size; + pNode->magic = FAST_MBLOCK_MAGIC_NUMBER; +#endif } ((struct fast_mblock_node *)pLast)->next = NULL; @@ -566,6 +568,24 @@ static inline void fast_mblock_ref_counter_op(struct fast_mblock_man *mblock, { struct fast_mblock_malloc *pMallocNode; +#ifdef FAST_MBLOCK_MAGIC_CHECK + int calc_offset; + + calc_offset = sizeof(struct fast_mblock_malloc) + + pNode->index * mblock->info.block_size; + if (pNode->magic != FAST_MBLOCK_MAGIC_NUMBER || + pNode->offset != calc_offset) + { + logCrit("file: "__FILE__", line: %d, " + "magic check for %s %s fail, node: %p, index: %d, offset: %d, " + "offset by index: %d, magic number: %d, expect magic: %d", + __LINE__, (is_inc ? "alloc" : "free"), mblock->info.name, + pNode, pNode->index, pNode->offset, calc_offset, + pNode->magic, FAST_MBLOCK_MAGIC_NUMBER); + return; + } +#endif + pMallocNode = FAST_MBLOCK_GET_TRUNK(pNode); if (is_inc) { diff --git a/src/fast_mblock.h b/src/fast_mblock.h index d3f220a..3d94002 100644 --- a/src/fast_mblock.h +++ b/src/fast_mblock.h @@ -26,6 +26,13 @@ #include "fc_memory.h" #include "logger.h" +/* following two macros for debug only */ +/* +#define FAST_MBLOCK_MAGIC_CHECK 1 +#define FAST_MBLOCK_MAGIC_NUMBER 1234567890 +*/ + + #define FAST_MBLOCK_NAME_SIZE 32 #define FAST_MBLOCK_ORDER_BY_ALLOC_BYTES 1 @@ -37,6 +44,10 @@ struct fast_mblock_node struct fast_mblock_node *next; int offset; //trunk offset int recycle_timestamp; +#ifdef FAST_MBLOCK_MAGIC_CHECK + int index; + int magic; //magic number +#endif char data[0]; //the data buffer }; @@ -69,6 +80,7 @@ struct fast_mblock_info int element_size; //element size int trunk_size; //trunk size int instance_count; //instance count + int block_size; int64_t element_total_count; //total element count int64_t element_used_count; //used element count int64_t delay_free_elements; //delay free element count