mblock add macro FAST_MBLOCK_MAGIC_CHECK for debug

pull/37/merge
YuQing 2021-12-12 10:16:06 +08:00
parent 87377981ec
commit 720c4a686d
2 changed files with 43 additions and 11 deletions

View File

@ -374,7 +374,6 @@ int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name,
void *malloc_trunk_args) void *malloc_trunk_args)
{ {
int result; int result;
int block_size;
if (element_size <= 0) 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->info.element_size = MEM_ALIGN(element_size);
mblock->alloc_elements.limit = alloc_elements_limit; 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) if (alloc_elements_once > 0)
{ {
mblock->alloc_elements.once = alloc_elements_once; mblock->alloc_elements.once = alloc_elements_once;
} }
else 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 > if (mblock->alloc_elements.limit > 0 && mblock->alloc_elements.once >
mblock->alloc_elements.limit) 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.element_used_count = 0;
mblock->info.instance_count = 1; mblock->info.instance_count = 1;
mblock->info.trunk_size = fast_mblock_get_trunk_size(mblock, 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->need_lock = need_lock;
mblock->alloc_elements.need_wait = false; mblock->alloc_elements.need_wait = false;
mblock->alloc_elements.pcontinue_flag = NULL; mblock->alloc_elements.pcontinue_flag = NULL;
@ -453,11 +452,9 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock)
char *p; char *p;
char *pLast; char *pLast;
int result; int result;
int block_size;
int trunk_size; int trunk_size;
int alloc_count; int alloc_count;
block_size = fast_mblock_get_block_size(mblock);
if (mblock->alloc_elements.limit > 0) if (mblock->alloc_elements.limit > 0)
{ {
int64_t avail_count; 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 ? alloc_count = avail_count > mblock->alloc_elements.once ?
mblock->alloc_elements.once : avail_count; mblock->alloc_elements.once : avail_count;
trunk_size = fast_mblock_get_trunk_size(mblock, trunk_size = fast_mblock_get_trunk_size(mblock,
block_size, alloc_count); mblock->info.block_size, alloc_count);
} }
else else
{ {
@ -501,10 +498,9 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock)
memset(pNew, 0, trunk_size); memset(pNew, 0, trunk_size);
pMallocNode = (struct fast_mblock_malloc *)pNew; pMallocNode = (struct fast_mblock_malloc *)pNew;
pTrunkStart = pNew + sizeof(struct fast_mblock_malloc); pTrunkStart = pNew + sizeof(struct fast_mblock_malloc);
pLast = pNew + (trunk_size - block_size); pLast = pNew + (trunk_size - mblock->info.block_size);
for (p=pTrunkStart; p<=pLast; p += block_size) for (p=pTrunkStart; p<=pLast; p += mblock->info.block_size)
{ {
pNode = (struct fast_mblock_node *)p; pNode = (struct fast_mblock_node *)p;
if (mblock->alloc_init_func != NULL) if (mblock->alloc_init_func != NULL)
@ -516,8 +512,14 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock)
return result; return result;
} }
} }
pNode->offset = (int)(p - pNew); 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; ((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; 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); pMallocNode = FAST_MBLOCK_GET_TRUNK(pNode);
if (is_inc) if (is_inc)
{ {

View File

@ -26,6 +26,13 @@
#include "fc_memory.h" #include "fc_memory.h"
#include "logger.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_NAME_SIZE 32
#define FAST_MBLOCK_ORDER_BY_ALLOC_BYTES 1 #define FAST_MBLOCK_ORDER_BY_ALLOC_BYTES 1
@ -37,6 +44,10 @@ struct fast_mblock_node
struct fast_mblock_node *next; struct fast_mblock_node *next;
int offset; //trunk offset int offset; //trunk offset
int recycle_timestamp; int recycle_timestamp;
#ifdef FAST_MBLOCK_MAGIC_CHECK
int index;
int magic; //magic number
#endif
char data[0]; //the data buffer char data[0]; //the data buffer
}; };
@ -69,6 +80,7 @@ struct fast_mblock_info
int element_size; //element size int element_size; //element size
int trunk_size; //trunk size int trunk_size; //trunk size
int instance_count; //instance count int instance_count; //instance count
int block_size;
int64_t element_total_count; //total element count int64_t element_total_count; //total element count
int64_t element_used_count; //used element count int64_t element_used_count; //used element count
int64_t delay_free_elements; //delay free element count int64_t delay_free_elements; //delay free element count