diff --git a/HISTORY b/HISTORY index ee35bf2..8f39a6b 100644 --- a/HISTORY +++ b/HISTORY @@ -1,9 +1,10 @@ -Version 1.67 2023-05-15 +Version 1.67 2023-05-19 * lc_pair in struct fc_queue change to lcp * sorted queue use double link chain for quick push * add function uniq_skiplist_clear * fast_mblock_malloc_trunk_notify_func prototype changed + * fast_mblock_init_ex2 add parameter prealloc_trunk_count Version 1.66 2023-02-12 * struct fast_task_info add field: notify_next for nio notify queue diff --git a/src/fast_allocator.c b/src/fast_allocator.c index 8e5ad9e..ba8ba81 100644 --- a/src/fast_allocator.c +++ b/src/fast_allocator.c @@ -140,6 +140,7 @@ static int region_init(struct fast_allocator_context *acontext, *object_callbacks, struct fast_region_info *region) { const int64_t alloc_elements_limit = 0; + const int prealloc_trunk_count = 0; int result; int bytes; int element_size; @@ -194,7 +195,8 @@ static int region_init(struct fast_allocator_context *acontext, trunk_callbacks.args = acontext; result = fast_mblock_init_ex2(&allocator->mblock, name, element_size, region->alloc_elements_once, alloc_elements_limit, - object_callbacks, acontext->need_lock, &trunk_callbacks); + prealloc_trunk_count, object_callbacks, + acontext->need_lock, &trunk_callbacks); if (result != 0) { break; diff --git a/src/fast_mblock.c b/src/fast_mblock.c index 7066cca..dadf633 100644 --- a/src/fast_mblock.c +++ b/src/fast_mblock.c @@ -42,9 +42,6 @@ struct _fast_mblock_manager static struct _fast_mblock_manager mblock_manager = {false, 0}; -#define fast_mblock_get_trunk_size(mblock, block_size, element_count) \ - (sizeof(struct fast_mblock_malloc) + block_size * element_count) - int fast_mblock_manager_init() { int result; @@ -328,10 +325,10 @@ int fast_mblock_manager_stat_print_ex(const bool hide_empty, const int order_by) { amem = (int64_t)pStat->trunk_size * pStat->trunk_total_count; alloc_mem += amem; - used_mem += GET_BLOCK_SIZE(*pStat) * - pStat->element_used_count; - delay_free_mem += GET_BLOCK_SIZE(*pStat) * - pStat->delay_free_elements; + used_mem += fast_mblock_get_block_size(pStat-> + element_size) * pStat->element_used_count; + delay_free_mem += fast_mblock_get_block_size(pStat-> + element_size) * pStat->delay_free_elements; } else { @@ -401,100 +398,6 @@ int fast_mblock_manager_stat_print_ex(const bool hide_empty, const int order_by) return 0; } -int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, - const int element_size, const int alloc_elements_once, - const int64_t alloc_elements_limit, - struct fast_mblock_object_callbacks *object_callbacks, - const bool need_lock, struct fast_mblock_trunk_callbacks - *trunk_callbacks) -{ - int result; - - if (element_size <= 0) - { - logError("file: "__FILE__", line: %d, " \ - "invalid block size: %d", \ - __LINE__, element_size); - return EINVAL; - } - - mblock->info.element_size = MEM_ALIGN(element_size); - mblock->alloc_elements.limit = alloc_elements_limit; - 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) / mblock->info.block_size; - } - if (mblock->alloc_elements.limit > 0 && mblock->alloc_elements.once > - mblock->alloc_elements.limit) - { - mblock->alloc_elements.once = mblock->alloc_elements.limit; - } - - if (need_lock && (result=init_pthread_lock_cond_pair(&(mblock->lcp))) != 0) - { - logError("file: "__FILE__", line: %d, " \ - "init_pthread_lock fail, errno: %d, error info: %s", \ - __LINE__, result, STRERROR(result)); - return result; - } - - if (object_callbacks == NULL) - { - mblock->object_callbacks.init_func = NULL; - mblock->object_callbacks.destroy_func = NULL; - mblock->object_callbacks.args = NULL; - } - else - { - mblock->object_callbacks = *object_callbacks; - } - - INIT_HEAD(&mblock->trunks.head); - mblock->info.trunk_total_count = 0; - mblock->info.trunk_used_count = 0; - mblock->info.delay_free_elements = 0; - mblock->free_chain_head = NULL; - mblock->delay_free_chain.head = NULL; - mblock->delay_free_chain.tail = NULL; - mblock->info.element_total_count = 0; - mblock->info.element_used_count = 0; - mblock->info.instance_count = 1; - mblock->info.trunk_size = fast_mblock_get_trunk_size(mblock, - 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; - mblock->alloc_elements.exceed_log_level = LOG_ERR; - - if (trunk_callbacks == NULL) - { - mblock->trunk_callbacks.check_func = NULL; - mblock->trunk_callbacks.notify_func = NULL; - mblock->trunk_callbacks.args = NULL; - } - else - { - mblock->trunk_callbacks = *trunk_callbacks; - } - - if (name != NULL) - { - snprintf(mblock->info.name, sizeof(mblock->info.name), "%s", name); - } - else - { - *mblock->info.name = '\0'; - } - add_to_mblock_list(mblock); - - return 0; -} - static int fast_mblock_prealloc(struct fast_mblock_man *mblock) { struct fast_mblock_node *pNode; @@ -526,7 +429,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, + trunk_size = fast_mblock_get_trunk_size( mblock->info.block_size, alloc_count); } else @@ -596,6 +499,112 @@ static int fast_mblock_prealloc(struct fast_mblock_man *mblock) return 0; } +int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, + const int element_size, const int alloc_elements_once, + const int64_t alloc_elements_limit, const int prealloc_trunk_count, + struct fast_mblock_object_callbacks *object_callbacks, + const bool need_lock, struct fast_mblock_trunk_callbacks + *trunk_callbacks) +{ + int result; + int i; + + if (element_size <= 0) + { + logError("file: "__FILE__", line: %d, " \ + "invalid block size: %d", \ + __LINE__, element_size); + return EINVAL; + } + + mblock->info.element_size = MEM_ALIGN(element_size); + mblock->alloc_elements.limit = alloc_elements_limit; + mblock->info.block_size = fast_mblock_get_block_size( + mblock->info.element_size); + if (alloc_elements_once > 0) + { + mblock->alloc_elements.once = alloc_elements_once; + } + else + { + mblock->alloc_elements.once = (1024 * 1024) / mblock->info.block_size; + } + if (mblock->alloc_elements.limit > 0 && mblock->alloc_elements.once > + mblock->alloc_elements.limit) + { + mblock->alloc_elements.once = mblock->alloc_elements.limit; + } + + if (need_lock && (result=init_pthread_lock_cond_pair(&(mblock->lcp))) != 0) + { + logError("file: "__FILE__", line: %d, " \ + "init_pthread_lock fail, errno: %d, error info: %s", \ + __LINE__, result, STRERROR(result)); + return result; + } + + if (object_callbacks == NULL) + { + mblock->object_callbacks.init_func = NULL; + mblock->object_callbacks.destroy_func = NULL; + mblock->object_callbacks.args = NULL; + } + else + { + mblock->object_callbacks = *object_callbacks; + } + + INIT_HEAD(&mblock->trunks.head); + mblock->info.trunk_total_count = 0; + mblock->info.trunk_used_count = 0; + mblock->info.delay_free_elements = 0; + mblock->free_chain_head = NULL; + mblock->delay_free_chain.head = NULL; + mblock->delay_free_chain.tail = NULL; + mblock->info.element_total_count = 0; + mblock->info.element_used_count = 0; + mblock->info.instance_count = 1; + mblock->info.trunk_size = fast_mblock_get_trunk_size( + 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; + mblock->alloc_elements.exceed_log_level = LOG_ERR; + + if (trunk_callbacks == NULL) + { + mblock->trunk_callbacks.check_func = NULL; + mblock->trunk_callbacks.notify_func = NULL; + mblock->trunk_callbacks.args = NULL; + } + else + { + mblock->trunk_callbacks = *trunk_callbacks; + } + + if (name != NULL) + { + snprintf(mblock->info.name, sizeof(mblock->info.name), "%s", name); + } + else + { + *mblock->info.name = '\0'; + } + add_to_mblock_list(mblock); + + + for (i=0; iinfo) +#define fast_mblock_get_trunk_size(block_size, element_count) \ + (sizeof(struct fast_mblock_malloc) + block_size * element_count) #define fast_mblock_to_node_ptr(data_ptr) \ (struct fast_mblock_node *)((char *)data_ptr - ((size_t)(char *) \ @@ -165,6 +166,7 @@ parameters: element_size: element size, such as sizeof(struct xxx) alloc_elements_once: malloc elements once, 0 for malloc 1MB memory once alloc_elements_limit: malloc elements limit, <= 0 for no limit + prealloc_trunk_count: prealloc trunk node count object_callbacks: the object callback functions and args need_lock: if need lock trunk_callbacks: the trunk callback functions and args @@ -172,7 +174,7 @@ return error no, 0 for success, != 0 fail */ int fast_mblock_init_ex2(struct fast_mblock_man *mblock, const char *name, const int element_size, const int alloc_elements_once, - const int64_t alloc_elements_limit, + const int64_t alloc_elements_limit, const int prealloc_trunk_count, struct fast_mblock_object_callbacks *object_callbacks, const bool need_lock, struct fast_mblock_trunk_callbacks *trunk_callbacks); @@ -196,6 +198,7 @@ static inline int fast_mblock_init_ex1(struct fast_mblock_man *mblock, fast_mblock_object_init_func init_func, void *init_args, const bool need_lock) { + const int prealloc_trunk_count = 0; struct fast_mblock_object_callbacks object_callbacks; object_callbacks.init_func = init_func; @@ -203,7 +206,8 @@ static inline int fast_mblock_init_ex1(struct fast_mblock_man *mblock, object_callbacks.args = init_args; return fast_mblock_init_ex2(mblock, name, element_size, alloc_elements_once, alloc_elements_limit, - &object_callbacks, need_lock, NULL); + prealloc_trunk_count, &object_callbacks, + need_lock, NULL); } /** @@ -219,9 +223,8 @@ return error no, 0 for success, != 0 fail */ static inline int fast_mblock_init_ex(struct fast_mblock_man *mblock, const int element_size, const int alloc_elements_once, - const int64_t alloc_elements_limit, - fast_mblock_object_init_func init_func, void *init_args, - const bool need_lock) + const int64_t alloc_elements_limit, fast_mblock_object_init_func + init_func, void *init_args, const bool need_lock) { return fast_mblock_init_ex1(mblock, NULL, element_size, alloc_elements_once, alloc_elements_limit,