diff --git a/src/sf_global.c b/src/sf_global.c index 8dfa559..3a41ec8 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -56,8 +56,9 @@ SFContext g_sf_context = {{'\0'}, NULL, 0, sf_address_family_auto, }; static int load_network_parameters(IniFullContext *ini_ctx, - const char *max_pkg_size_item_nm, const int fixed_buff_size, - const int task_buffer_extra_size, SFNetBufferConfig *net_buffer_cfg) + const char *max_pkg_size_item_nm, const int max_pkg_size_min_value, + const int fixed_buff_size, const int task_buffer_extra_size, + SFNetBufferConfig *net_buffer_cfg) { int padding_buff_size; char *pMinBuffSize; @@ -84,7 +85,8 @@ static int load_network_parameters(IniFullContext *ini_ctx, } if (fixed_buff_size > 0) { - padding_buff_size = fixed_buff_size + task_buffer_extra_size; + padding_buff_size = FC_MAX(fixed_buff_size, max_pkg_size_min_value) + + task_buffer_extra_size; net_buffer_cfg->min_buff_size = padding_buff_size; net_buffer_cfg->max_buff_size = padding_buff_size; net_buffer_cfg->max_pkg_size = padding_buff_size; @@ -94,6 +96,13 @@ static int load_network_parameters(IniFullContext *ini_ctx, net_buffer_cfg->max_pkg_size = iniGetByteCorrectValueEx(ini_ctx, max_pkg_size_item_nm, SF_DEF_MAX_PACKAGE_SIZE, 1, 8192, SF_MAX_NETWORK_BUFF_SIZE, true); + if (net_buffer_cfg->max_pkg_size < max_pkg_size_min_value) { + net_buffer_cfg->max_pkg_size = max_pkg_size_min_value; + } + if (task_buffer_extra_size > 0) { + net_buffer_cfg->max_pkg_size += task_buffer_extra_size; + } + pMinBuffSize = iniGetStrValueEx(ini_ctx->section_name, "min_buff_size", ini_ctx->context, true); pMaxBuffSize = iniGetStrValueEx(ini_ctx->section_name, @@ -109,8 +118,16 @@ static int load_network_parameters(IniFullContext *ini_ctx, "max_buff_size", SF_DEF_MAX_BUFF_SIZE, 1, 8192, SF_MAX_NETWORK_BUFF_SIZE, true); + if (task_buffer_extra_size > 0) { + net_buffer_cfg->min_buff_size += task_buffer_extra_size; + net_buffer_cfg->max_buff_size += task_buffer_extra_size; + } if (net_buffer_cfg->max_buff_size < net_buffer_cfg->max_pkg_size) { net_buffer_cfg->max_buff_size = net_buffer_cfg->max_pkg_size; + } else if (net_buffer_cfg->max_pkg_size < + net_buffer_cfg->max_buff_size) + { + net_buffer_cfg->max_pkg_size = net_buffer_cfg->max_buff_size; } if (net_buffer_cfg->max_buff_size < net_buffer_cfg->min_buff_size) { logWarning("file: "__FILE__", line: %d, " @@ -122,14 +139,6 @@ static int load_network_parameters(IniFullContext *ini_ctx, } } - if (task_buffer_extra_size > 0) { - net_buffer_cfg->min_buff_size += task_buffer_extra_size; - net_buffer_cfg->max_buff_size += task_buffer_extra_size; - if (net_buffer_cfg->max_pkg_size < net_buffer_cfg->max_buff_size) { - net_buffer_cfg->max_pkg_size = net_buffer_cfg->max_buff_size; - } - } - return 0; } @@ -284,6 +293,7 @@ int sf_load_global_config_ex(const char *log_filename_prefix, const char *max_pkg_size_item_nm, const int fixed_buff_size, const int task_buffer_extra_size, const bool need_set_run_by) { + const int max_pkg_size_min_value = 0; int result; const char *old_section_name; char *pRunByGroup; @@ -299,8 +309,9 @@ int sf_load_global_config_ex(const char *log_filename_prefix, tcp_set_quick_ack(g_sf_global_vars.tcp_quick_ack); if (load_network_params) { if ((result=load_network_parameters(ini_ctx, max_pkg_size_item_nm, - fixed_buff_size, task_buffer_extra_size, - &g_sf_global_vars.net_buffer_cfg)) != 0) + max_pkg_size_min_value, fixed_buff_size, + task_buffer_extra_size, &g_sf_global_vars. + net_buffer_cfg)) != 0) { return result; } @@ -768,9 +779,9 @@ int sf_load_context_from_config_ex(SFContext *sf_context, } if ((result=load_network_parameters(&config->ini_ctx, config-> - max_pkg_size_item_name, fixed_buff_size, - task_buffer_extra_size, &sf_context-> - net_buffer_cfg)) != 0) + max_pkg_size_item_name, config->max_pkg_size_min_value, + fixed_buff_size, task_buffer_extra_size, + &sf_context->net_buffer_cfg)) != 0) { return result; } diff --git a/src/sf_global.h b/src/sf_global.h index b359035..680aaed 100644 --- a/src/sf_global.h +++ b/src/sf_global.h @@ -66,6 +66,7 @@ typedef struct sf_context_ini_config { int default_inner_port; int default_outer_port; int default_work_threads; + int max_pkg_size_min_value; FCCommunicationType comm_type; const char *max_pkg_size_item_name; } SFContextIniConfig; @@ -172,9 +173,9 @@ extern SFContext g_sf_context; #define SF_FCHOWN_TO_RUNBY_RETURN_ON_ERROR(fd, path) \ SF_FCHOWN_RETURN_ON_ERROR(fd, path, geteuid(), getegid()) -#define SF_SET_CONTEXT_INI_CONFIG_EX(config, the_comm_type, filename, \ - pIniContext, section_name, def_inner_port, def_outer_port, \ - def_work_threads, max_pkg_size_item_nm) \ +#define SF_SET_CONTEXT_INI_CONFIG_EX(config, the_comm_type, filename, \ + pIniContext, section_name, def_inner_port, def_outer_port, \ + def_work_threads, max_pkg_size_item_nm, max_pkg_size_min_val) \ do { \ FAST_INI_SET_FULL_CTX_EX(config.ini_ctx, filename, \ section_name, pIniContext); \ @@ -183,6 +184,7 @@ extern SFContext g_sf_context; config.default_outer_port = def_outer_port; \ config.default_work_threads = def_work_threads; \ config.max_pkg_size_item_name = max_pkg_size_item_nm; \ + config.max_pkg_size_min_value = max_pkg_size_min_val; \ } while (0) #define SF_SET_CONTEXT_INI_CONFIG(config, the_comm_type, \ @@ -190,7 +192,7 @@ extern SFContext g_sf_context; def_outer_port, def_work_threads) \ SF_SET_CONTEXT_INI_CONFIG_EX(config, the_comm_type, filename, \ pIniContext, section_name, def_inner_port, def_outer_port, \ - def_work_threads, "max_pkg_size") + def_work_threads, "max_pkg_size", 0) int sf_load_global_config_ex(const char *log_filename_prefix, IniFullContext *ini_ctx, const bool load_network_params, diff --git a/src/sf_service.h b/src/sf_service.h index 18e45ca..136fe1d 100644 --- a/src/sf_service.h +++ b/src/sf_service.h @@ -170,7 +170,10 @@ static inline struct fast_task_info *sf_alloc_init_task_ex( return task; } -#define sf_hold_task(task) __sync_add_and_fetch(&task->reffer_count, 1) +#define sf_hold_task_ex(task, inc_count) __sync_add_and_fetch( \ + &task->reffer_count, inc_count) +#define sf_hold_task(task) sf_hold_task_ex(task, 1) + #define sf_alloc_init_task(handler, fd) sf_alloc_init_task_ex(handler, fd, 1) static inline void sf_release_task(struct fast_task_info *task)