diff options
author | Kinsey Moore <kmoore@digium.com> | 2013-08-06 13:08:13 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2013-08-06 13:08:13 +0000 |
commit | dfa5be76d4891f5240440cb5941374893a9ff57b (patch) | |
tree | eaa39b707e6944c48deeb76c9c6f89b16c60b9b8 /res/res_pjsip/config_system.c | |
parent | 2e23bec461e5957a2cf4673b3960b025b324b703 (diff) |
Expose res_pjsip threadpool options
Expose initial size, automatic increment, maximum size, and idle
timeout as configurable parameters for the res_pjsip thread pool.
Review: https://reviewboard.asterisk.org/r/2704/
(closes issue ASTERISK-22143)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396321 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_pjsip/config_system.c')
-rw-r--r-- | res/res_pjsip/config_system.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/res/res_pjsip/config_system.c b/res/res_pjsip/config_system.c index b1f13898b..f499e8a23 100644 --- a/res/res_pjsip/config_system.c +++ b/res/res_pjsip/config_system.c @@ -24,6 +24,7 @@ #include "asterisk/res_pjsip.h" #include "asterisk/sorcery.h" #include "include/res_pjsip_private.h" +#include "asterisk/threadpool.h" #define TIMER_T1_MIN 100 #define DEFAULT_TIMER_T1 500 @@ -37,8 +38,27 @@ struct system_config { unsigned int timerb; /*! Should we use short forms for headers? */ unsigned int compactheaders; + struct { + /*! Initial number of threads in the threadpool */ + int initial_size; + /*! The amount by which the number of threads is incremented when necessary */ + int auto_increment; + /*! Thread idle timeout in seconds */ + int idle_timeout; + /*! Maxumum number of threads in the threadpool */ + int max_size; + } threadpool; }; +static struct ast_threadpool_options sip_threadpool_options = { + .version = AST_THREADPOOL_OPTIONS_VERSION, +}; + +void sip_get_threadpool_options(struct ast_threadpool_options *threadpool_options) +{ + *threadpool_options = sip_threadpool_options; +} + static struct ast_sorcery *system_sorcery; static void *system_alloc(const char *name) @@ -77,11 +97,19 @@ static int system_apply(const struct ast_sorcery *system_sorcery, void *obj) pjsip_use_compact_form = PJ_TRUE; } + sip_threadpool_options.initial_size = system->threadpool.initial_size; + sip_threadpool_options.auto_increment = system->threadpool.auto_increment; + sip_threadpool_options.idle_timeout = system->threadpool.idle_timeout; + sip_threadpool_options.max_size = system->threadpool.max_size; + return 0; } int ast_sip_initialize_system(void) { + RAII_VAR(struct ao2_container *, system_configs, NULL, ao2_cleanup); + RAII_VAR(struct system_config *, system, NULL, ao2_cleanup); + system_sorcery = ast_sorcery_open(); if (!system_sorcery) { ast_log(LOG_ERROR, "Failed to open SIP system sorcery\n"); @@ -105,8 +133,35 @@ int ast_sip_initialize_system(void) OPT_UINT_T, 0, FLDSET(struct system_config, timerb)); ast_sorcery_object_field_register(system_sorcery, "system", "compactheaders", "no", OPT_BOOL_T, 1, FLDSET(struct system_config, compactheaders)); + ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_initial_size", "0", + OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.initial_size)); + ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_auto_increment", "5", + OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.auto_increment)); + ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_idle_timeout", "60", + OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.idle_timeout)); + ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_max_size", "0", + OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.max_size)); ast_sorcery_load(system_sorcery); + system_configs = ast_sorcery_retrieve_by_fields(system_sorcery, "system", + AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL); + + if (ao2_container_count(system_configs)) { + return 0; + } + + /* No config present, allocate one and apply defaults */ + system = ast_sorcery_alloc(system_sorcery, "system", NULL); + if (!system) { + ast_log(LOG_ERROR, "Unable to allocate default system config.\n"); + return -1; + } + + if (system_apply(system_sorcery, system)) { + ast_log(LOG_ERROR, "Failed to apply default system config.\n"); + return -1; + } + return 0; } |