[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