[Freeswitch-svn] [commit] r3878 - freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference

Freeswitch SVN knhor at freeswitch.org
Sun Dec 31 15:02:01 EST 2006


Author: knhor
Date: Sun Dec 31 15:02:01 2006
New Revision: 3878

Modified:
   freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c

Log:
oops.. don't keep the xml config registry locked!


Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c	(original)
+++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c	Sun Dec 31 15:02:01 2006
@@ -199,7 +199,6 @@
 	uint32_t count;
 	int32_t energy_level;
 	uint8_t min;
-	conf_xml_cfg_t xml_cfg;
 	switch_hash_t *chat_permissions_map;
 } conference_obj_t;
 
@@ -1679,31 +1678,6 @@
 	/* Start the input thread */
 	launch_conference_loop_input(member, switch_core_session_get_pool(member->session));
 
-	/* caller control configuration chores */
-	if (switch_ivr_digit_stream_parser_new(member->pool, &member->dtmf_parser) == SWITCH_STATUS_SUCCESS) {
-		switch_status_t status = SWITCH_STATUS_FALSE;
-
-		/* if no controls, or default controls specified, install default */
-		if (member->conference->caller_controls == NULL || *member->conference->caller_controls == '\0' || strcasecmp(member->conference->caller_controls, "default") == 0) {
-			status = caller_control_build_default(member);
-		} else if (strcasecmp(member->conference->caller_controls, "none") != 0) {
-		/* try to build caller control if the group has been specified and != "none" */
-			switch_xml_t xml_controls = switch_xml_find_child(member->conference->xml_cfg.controls, "group", "name", member->conference->caller_controls);
-#ifdef OPTION_IVR_MENU_SUPPORT
-			status = caller_control_build_custom(member, xml_controls, member->conference->xml_cfg.menus);
-#else
-			status = caller_control_build_custom(member, xml_controls, NULL);
-#endif
-			if (status != SWITCH_STATUS_SUCCESS) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to install caller controls group '%s'\n", member->conference->caller_controls);
-			}
-		} else {
-			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "no caller controls intalled.\n");
-		}
-	} else {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to allocate caller control digit parser.\n");
-	}
-
 	/* build a digit stream object */
 	if (member->dtmf_parser != NULL && switch_ivr_digit_stream_new(member->dtmf_parser, &member->digit_stream) != SWITCH_STATUS_SUCCESS) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Warning Will Robinson, there is no digit parser stream object\n");
@@ -3174,10 +3148,6 @@
                     if (pool != NULL) {
                         switch_core_destroy_memory_pool(&pool);
                     }
-		    /* Release the config registry handle */
-		    if (xml_cfg.cxml) {
-			switch_xml_free(xml_cfg.cxml);
-		    }
                     goto done;
                 }
 
@@ -3189,6 +3159,12 @@
 
                 /* Start the conference thread for this conference */
                 launch_conference_thread(new_conference);
+
+		/* Release the config registry thread lock */
+		if (xml_cfg.cxml) {
+			switch_xml_free(xml_cfg.cxml);
+			memset(&xml_cfg,0,sizeof(xml_cfg));
+		}
             }
 
             /* move the member from the old conference to the new one */
@@ -3952,6 +3928,37 @@
     msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE;
     switch_core_session_receive_message(session, &msg);
 
+	/* caller control configuration chores */
+	if (switch_ivr_digit_stream_parser_new(member.pool, &member.dtmf_parser) == SWITCH_STATUS_SUCCESS) {
+		switch_status_t status = SWITCH_STATUS_FALSE;
+
+		/* if no controls, or default controls specified, install default */
+		if (member.conference->caller_controls == NULL || *member.conference->caller_controls == '\0' || strcasecmp(member.conference->caller_controls, "default") == 0) {
+			status = caller_control_build_default(&member);
+		} else if (strcasecmp(member.conference->caller_controls, "none") != 0) {
+		/* try to build caller control if the group has been specified and != "none" */
+			switch_xml_t xml_controls = switch_xml_find_child(xml_cfg.controls, "group", "name", member.conference->caller_controls);
+#ifdef OPTION_IVR_MENU_SUPPORT
+			status = caller_control_build_custom(&member, xml_controls, xml_cfg.menus);
+#else
+			status = caller_control_build_custom(&member, xml_controls, NULL);
+#endif
+			if (status != SWITCH_STATUS_SUCCESS) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to install caller controls group '%s'\n", member.conference->caller_controls);
+			}
+		} else {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "no caller controls intalled.\n");
+		}
+	} else {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to allocate caller control digit parser.\n");
+	}
+
+    /* Release the config registry thread lock */
+    if (xml_cfg.cxml) {
+        switch_xml_free(xml_cfg.cxml);
+	memset(&xml_cfg,0,sizeof(xml_cfg));
+    }
+
     /* Run the confernece loop */
     conference_loop_output(&member);
 
@@ -3976,11 +3983,6 @@
     switch_buffer_destroy(&member.audio_buffer);
     switch_buffer_destroy(&member.mux_buffer);
 
-    /* Release the config registry handle */
-    if (xml_cfg.cxml) {
-        switch_xml_free(xml_cfg.cxml);
-    }
-
     if (freepool) {
         switch_core_destroy_memory_pool(&freepool);
     }
@@ -4154,15 +4156,15 @@
     /*.chat_interface */ &conference_chat_interface
 };
 
-switch_status_t chat_permissions_get(conference_obj_t *conference)
+switch_status_t chat_permissions_get(conference_obj_t *conference, conf_xml_cfg_t *xml_cfg)
 {
-	switch_status_t status = SWITCH_STATUS_FALSE;
 	int count = 0;
 
 	assert(conference != NULL);
+	assert(xml_cfg != NULL);
 
-	if (conference->xml_cfg.chat_permissions != NULL && !switch_strlen_zero(conference->chat_permissions)) {
-		switch_xml_t profile = switch_xml_find_child(conference->xml_cfg.chat_permissions, "profile", "name", conference->chat_permissions);
+	if (xml_cfg->chat_permissions != NULL && !switch_strlen_zero(conference->chat_permissions)) {
+		switch_xml_t profile = switch_xml_find_child(xml_cfg->chat_permissions, "profile", "name", conference->chat_permissions);
 
 		if (profile != NULL) {
 			switch_xml_t xml_kvp;
@@ -4183,14 +4185,11 @@
 						count ++;
 					}
 				}
-				if (count != 0) {
-					status = SWITCH_STATUS_SUCCESS;
-				}
 			}
 		}
 	}
 
-	return status;
+	return (count != 0 ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE);
 }
 
 /* create a new conferene with a specific profile */
@@ -4423,12 +4422,8 @@
     conference->rate = rate;
     conference->interval = interval;
 
-	/* copy the xml config sections to the new conference */
-	memcpy(&conference->xml_cfg,xml_cfg,sizeof(conf_xml_cfg_t));
-
 	/* build the chat interface permissions map */
-	chat_permissions_get(conference);
-
+	chat_permissions_get(conference, xml_cfg);
 
     /* Activate the conference mutex for exclusivity */
     switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool);
@@ -4512,7 +4507,7 @@
     } 
 
  done: 
-    /* Release the config registry handle */ 
+    /* Release the config registry thread lock */ 
     if (cxml) { 
         switch_xml_free(cxml); 
         cxml = NULL; 



More information about the Freeswitch-svn mailing list