]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
start one msg thread per cpu by default
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 27 Mar 2012 21:48:30 +0000 (16:48 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 27 Mar 2012 21:48:30 +0000 (16:48 -0500)
src/include/switch_core.h
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/switch_core.c

index 517e13ed94343497592e74d5cd3ad4e4f1106956..1e3bfcba76ea333a01afb8fe5956b0d08f57f248 100644 (file)
@@ -217,6 +217,8 @@ SWITCH_DECLARE(uint32_t) switch_core_media_bug_clear_flag(_In_ switch_media_bug_
 */
 SWITCH_DECLARE(void) switch_core_media_bug_set_read_replace_frame(_In_ switch_media_bug_t *bug, _In_ switch_frame_t *frame);
 
+SWITCH_DECLARE(uint32_t) switch_core_cpu_count(void);
+
 /*!
   \brief Remove a media bug from the session
   \param session the session to remove the bug from
index 3cac1a0fc2745e9e7aa9e854184ce5d96f03b564..1928e0f462049e790b56f9f4a68525ccf461086a 100644 (file)
@@ -5353,6 +5353,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_chat_interface_t *chat_interface;
        switch_api_interface_t *api_interface;
        switch_management_interface_t *management_interface;
+       uint32_t cpus = switch_core_cpu_count();
        struct in_addr in;
 
        memset(&mod_sofia_globals, 0, sizeof(mod_sofia_globals));
@@ -5390,6 +5391,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for profiles to start\n");
        switch_yield(1500000);
 
+       /* start one message thread per cpu */
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Starting %u message threads.\n", cpus);
+       sofia_msg_thread_start(cpus);
+
        if (switch_event_bind_removable(modname, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT, event_handler, NULL,
                                                                        &mod_sofia_globals.custom_node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
index 9947e3778e82a496bb8dcfbd539feec0fad95682..93a053bf441093171d7c47816b141d083d09c019 100644 (file)
@@ -1151,3 +1151,4 @@ void sofia_glue_pause_jitterbuffer(switch_core_session_t *session, switch_bool_t
 void sofia_process_dispatch_event(sofia_dispatch_event_t **dep);
 char *sofia_glue_get_host(const char *str, switch_memory_pool_t *pool);
 void sofia_presence_check_subscriptions(sofia_profile_t *profile, time_t now);
+void sofia_msg_thread_start(int idx);
index 6ddfbe50b4a95b90fab0c57a61b4ab111fd0270f..a915a61b9963ba2df85d622f2d2bc887171a564c 100644 (file)
@@ -1232,7 +1232,7 @@ void *SWITCH_THREAD_FUNC sofia_msg_thread_run(switch_thread_t *thread, void *obj
 
 static int IDX = 0;
 
-static void sofia_msg_thread_start(int idx)
+void sofia_msg_thread_start(int idx)
 {
 
        if (idx >= SOFIA_MAX_MSG_QUEUE || (idx < mod_sofia_globals.msg_queue_len && mod_sofia_globals.msg_queue_thread[idx])) {
@@ -3616,6 +3616,18 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                mod_sofia_globals.debug_sla = atoi(val);
                        } else if (!strcasecmp(var, "auto-restart")) {
                                mod_sofia_globals.auto_restart = switch_true(val);
+                       } else if (!strcasecmp(var, "message-threads")) {
+                               int num = atoi(val);
+                               
+                               if (num < 1 || num > SOFIA_MAX_MSG_QUEUE - 1) {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "message-threads must be between 1 and %d", SOFIA_MAX_MSG_QUEUE -1);
+                               } 
+                               
+                               if (num < 1) num = 1;
+                               if (num > SOFIA_MAX_MSG_QUEUE - 1) num = SOFIA_MAX_MSG_QUEUE -1;
+                               
+                               sofia_msg_thread_start(num);
+                               
                        } else if (!strcasecmp(var, "reg-deny-binding-fetch-and-no-lookup")) {          /* backwards compatibility */
                                mod_sofia_globals.reg_deny_binding_fetch_and_no_lookup = switch_true(val);  /* remove when noone complains about the extra lookup */
                                if (switch_true(val)) {
@@ -3862,19 +3874,7 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                                } else {
                                                        sofia_clear_pflag(profile, PFLAG_CID_IN_1XX);
                                                }
-                                       } else if (!strcasecmp(var, "message-threads")) {
-                                               int num = atoi(val);
-
-                                               if (num < 1 || num > SOFIA_MAX_MSG_QUEUE - 1) {
-                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "message-threads must be between 1 and %d", SOFIA_MAX_MSG_QUEUE -1);
-                                               } 
-
-                                               if (num < 1) num = 1;
-                                               if (num > SOFIA_MAX_MSG_QUEUE - 1) num = SOFIA_MAX_MSG_QUEUE -1;
-
-                                               sofia_msg_thread_start(num);
                                                
-
                                        } else if (!strcasecmp(var, "disable-hold")) {
                                                if (switch_true(val)) {
                                                        sofia_set_pflag(profile, PFLAG_DISABLE_HOLD);
index d3d00ba6ab1a863bd2a4ac25b421ae9c27a22523..19de186fc779b9d12c18383085da8c92cfe79a3b 100644 (file)
@@ -724,6 +724,11 @@ SWITCH_DECLARE(int32_t) set_realtime_priority(void)
        return 0;
 }
 
+SWITCH_DECLARE(uint32_t) switch_core_cpu_count(void)
+{
+       return runtime.cpu_count;
+}
+
 SWITCH_DECLARE(int32_t) set_normal_priority(void)
 {
        return 0;