[asterisk-commits] mjordan: branch group/performance r399800 - /team/group/performance/main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Sep 25 14:44:52 CDT 2013


Author: mjordan
Date: Wed Sep 25 14:44:51 2013
New Revision: 399800

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=399800
Log:
Only subscribe in CEL if we need it

This also avoids leaking due to re-subscribing in CDRs.

Modified:
    team/group/performance/main/cdr.c
    team/group/performance/main/cel.c

Modified: team/group/performance/main/cdr.c
URL: http://svnview.digium.com/svn/asterisk/team/group/performance/main/cdr.c?view=diff&rev=399800&r1=399799&r2=399800
==============================================================================
--- team/group/performance/main/cdr.c (original)
+++ team/group/performance/main/cdr.c Wed Sep 25 14:44:51 2013
@@ -3853,6 +3853,11 @@
  */
 static int create_subscriptions(void)
 {
+	/* Use the CDR topic to determine if we've already created this */
+	if (cdr_topic) {
+		return 0;
+	}
+
 	cdr_topic = stasis_topic_create("cdr_engine");
 	if (!cdr_topic) {
 		return -1;

Modified: team/group/performance/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/team/group/performance/main/cel.c?view=diff&rev=399800&r1=399799&r2=399800
==============================================================================
--- team/group/performance/main/cel.c (original)
+++ team/group/performance/main/cel.c Wed Sep 25 14:44:51 2013
@@ -547,17 +547,6 @@
 	return 0;
 }
 
-static int do_reload(void)
-{
-	if (aco_process_config(&cel_cfg_info, 1) == ACO_PROCESS_ERROR) {
-		return -1;
-	}
-
-	ast_verb(3, "CEL logging %sabled.\n", ast_cel_check_enabled() ? "en" : "dis");
-
-	return 0;
-}
-
 const char *ast_cel_get_type_name(enum ast_cel_event_type type)
 {
 	return S_OR(cel_event_types[type], "Unknown");
@@ -1333,20 +1322,30 @@
 	cel_report_event(localone, AST_CEL_LOCAL_OPTIMIZE, NULL, extra);
 }
 
-static void ast_cel_engine_term(void)
-{
-	aco_info_destroy(&cel_cfg_info);
-	ao2_global_obj_release(cel_configs);
-	stasis_message_router_unsubscribe_and_join(cel_state_router);
-	cel_state_router = NULL;
+static void destroy_subscriptions(void)
+{
+	if (cel_state_router) {
+		stasis_message_router_unsubscribe_and_join(cel_state_router);
+		cel_state_router = NULL;
+	}
+
 	ao2_cleanup(cel_aggregation_topic);
 	cel_aggregation_topic = NULL;
 	ao2_cleanup(cel_topic);
 	cel_topic = NULL;
+
 	cel_channel_forwarder = stasis_forward_cancel(cel_channel_forwarder);
 	cel_bridge_forwarder = stasis_forward_cancel(cel_bridge_forwarder);
 	cel_parking_forwarder = stasis_forward_cancel(cel_parking_forwarder);
 	cel_cel_forwarder = stasis_forward_cancel(cel_cel_forwarder);
+}
+
+static void ast_cel_engine_term(void)
+{
+	destroy_subscriptions();
+
+	aco_info_destroy(&cel_cfg_info);
+	ao2_global_obj_release(cel_configs);
 	ast_cli_unregister(&cli_status);
 	ao2_cleanup(cel_dialstatus_store);
 	cel_dialstatus_store = NULL;
@@ -1357,29 +1356,12 @@
 	STASIS_MESSAGE_TYPE_CLEANUP(cel_generic_type);
 }
 
-int ast_cel_engine_init(void)
+/*!
+ * \brief Create the Stasis subscriptions for CEL
+ */
+static int create_subscriptions(void)
 {
 	int ret = 0;
-	if (!(linkedids = ast_str_container_alloc(NUM_APP_BUCKETS))) {
-		return -1;
-	}
-
-	if (!(cel_dialstatus_store = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS, dialstatus_hash, dialstatus_cmp))) {
-		return -1;
-	}
-
-	if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
-		return -1;
-	}
-
-	if (ast_cli_register(&cli_status)) {
-		return -1;
-	}
-
-	cel_backends = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash, cel_backend_cmp);
-	if (!cel_backends) {
-		return -1;
-	}
 
 	cel_aggregation_topic = stasis_topic_create("cel_aggregation_topic");
 	if (!cel_aggregation_topic) {
@@ -1474,11 +1456,33 @@
 		cel_local_cb,
 		NULL);
 
-	/* If somehow we failed to add any routes, just shut down the whole
-	 * thing and fail it.
-	 */
 	if (ret) {
-		ast_cel_engine_term();
+		ast_log(AST_LOG_ERROR, "Failed to register for Stasis messages\n");
+	}
+
+	return ret;
+}
+
+int ast_cel_engine_init(void)
+{
+	if (!(linkedids = ast_str_container_alloc(NUM_APP_BUCKETS))) {
+		return -1;
+	}
+
+	if (!(cel_dialstatus_store = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS, dialstatus_hash, dialstatus_cmp))) {
+		return -1;
+	}
+
+	if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
+		return -1;
+	}
+
+	if (ast_cli_register(&cli_status)) {
+		return -1;
+	}
+
+	cel_backends = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash, cel_backend_cmp);
+	if (!cel_backends) {
 		return -1;
 	}
 
@@ -1507,7 +1511,34 @@
 		}
 	}
 
-	ast_register_cleanup(ast_cel_engine_term);
+	if (ast_cel_check_enabled() && create_subscriptions()) {
+		return -1;
+	}
+
+	ast_register_atexit(&ast_cel_engine_term);
+	return 0;
+}
+
+static int do_reload(void)
+{
+	unsigned int was_enabled = ast_cel_check_enabled();
+	unsigned int is_enabled;
+
+	if (aco_process_config(&cel_cfg_info, 1) == ACO_PROCESS_ERROR) {
+		return -1;
+	}
+
+	is_enabled = ast_cel_check_enabled();
+
+	if (!was_enabled && is_enabled) {
+		if (create_subscriptions()) {
+			return -1;
+		}
+	} else if (was_enabled && !is_enabled) {
+		destroy_subscriptions();
+	}
+
+	ast_verb(3, "CEL logging %sabled.\n", is_enabled ? "en" : "dis");
 
 	return 0;
 }




More information about the asterisk-commits mailing list