limit simo reg processing threads to 25 and add param to raise it

This commit is contained in:
Anthony Minessale 2013-02-21 12:26:30 -06:00
parent 362b101ede
commit dd3bd238c5
2 changed files with 21 additions and 2 deletions

View File

@ -392,6 +392,7 @@ struct mod_sofia_globals {
int rewrite_multicasted_fs_path;
int presence_flush;
switch_thread_t *presence_thread;
uint32_t max_reg_threads;
};
extern struct mod_sofia_globals mod_sofia_globals;

View File

@ -1506,11 +1506,17 @@ static void our_sofia_event_callback(nua_event_t event,
}
}
static uint32_t DE_THREAD_CNT = 0;
void *SWITCH_THREAD_FUNC sofia_msg_thread_run_once(switch_thread_t *thread, void *obj)
{
sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) obj;
switch_memory_pool_t *pool = NULL;
switch_mutex_lock(mod_sofia_globals.mutex);
DE_THREAD_CNT++;
switch_mutex_unlock(mod_sofia_globals.mutex);
if (de) {
pool = de->pool;
de->pool = NULL;
@ -1521,6 +1527,10 @@ void *SWITCH_THREAD_FUNC sofia_msg_thread_run_once(switch_thread_t *thread, void
switch_core_destroy_memory_pool(&pool);
}
switch_mutex_lock(mod_sofia_globals.mutex);
DE_THREAD_CNT--;
switch_mutex_unlock(mod_sofia_globals.mutex);
return NULL;
}
@ -1660,7 +1670,8 @@ void sofia_queue_message(sofia_dispatch_event_t *de)
}
if (de->profile && sofia_test_pflag(de->profile, PFLAG_THREAD_PER_REG) && de->data->e_event == nua_i_register) {
if (de->profile && sofia_test_pflag(de->profile, PFLAG_THREAD_PER_REG) &&
de->data->e_event == nua_i_register && DE_THREAD_CNT < mod_sofia_globals.max_reg_threads) {
sofia_process_dispatch_event_in_thread(&de);
return;
}
@ -3430,6 +3441,13 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name)
mod_sofia_globals.debug_presence = atoi(val);
} else if (!strcasecmp(var, "debug-sla")) {
mod_sofia_globals.debug_sla = atoi(val);
} else if (!strcasecmp(var, "max-reg-threads") && val) {
int x = atoi(val);
if (x > 0) {
mod_sofia_globals.max_reg_threads = x;
}
} else if (!strcasecmp(var, "auto-restart")) {
mod_sofia_globals.auto_restart = switch_true(val);
} else if (!strcasecmp(var, "reg-deny-binding-fetch-and-no-lookup")) { /* backwards compatibility */
@ -3831,7 +3849,7 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name)
sofia_clear_pflag(profile, PFLAG_MESSAGE_QUERY_ON_REGISTER);
sofia_clear_pflag(profile, PFLAG_MESSAGE_QUERY_ON_FIRST_REGISTER);
}
} else if (!strcasecmp(var, "inbound-reg-in-new-thread")) {
} else if (!strcasecmp(var, "inbound-reg-in-new-thread") && val) {
if (switch_true(val)) {
sofia_set_pflag(profile, PFLAG_THREAD_PER_REG);
} else {