diff --git a/src/mod/event_handlers/mod_rayo/nlsml.c b/src/mod/event_handlers/mod_rayo/nlsml.c index 867b31b5c1..6d18f4bb56 100644 --- a/src/mod/event_handlers/mod_rayo/nlsml.c +++ b/src/mod/event_handlers/mod_rayo/nlsml.c @@ -51,14 +51,15 @@ struct tag_def { /** * library configuration */ -static struct { +typedef struct { /** true if initialized */ switch_bool_t init; /** Mapping of tag name to definition */ switch_hash_t *tag_defs; /** library memory pool */ switch_memory_pool_t *pool; -} globals; +} nlsml_globals; +static nlsml_globals globals = { 0 }; /** * The node in the XML tree @@ -88,6 +89,17 @@ struct nlsml_parser { int nomatch; }; +/** + * Tag def destructor + */ +static void destroy_tag_def(void *ptr) +{ + struct tag_def *tag = (struct tag_def *) ptr; + if (tag->children_tags) { + switch_core_hash_destroy(&tag->children_tags); + } +} + /** * Add a definition for a tag * @param tag the name @@ -114,7 +126,7 @@ static struct tag_def *add_tag_def(const char *tag, tag_attribs_fn attribs_fn, t def->attribs_fn = attribs_fn; def->cdata_fn = cdata_fn; def->is_root = SWITCH_FALSE; - switch_core_hash_insert(globals.tag_defs, tag, def); + switch_core_hash_insert_destructor(globals.tag_defs, tag, def, destroy_tag_def); return def; } @@ -467,6 +479,24 @@ int nlsml_init(void) return 1; } +/** + * Destruction of NLSML parser environment + */ +void nlsml_destroy(void) +{ + if (globals.init) { + if (globals.tag_defs) { + switch_core_hash_destroy(&globals.tag_defs); + globals.tag_defs = NULL; + } + if (globals.pool) { + switch_core_destroy_memory_pool(&globals.pool); + globals.pool = NULL; + } + globals.init = SWITCH_FALSE; + } +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/event_handlers/mod_rayo/nlsml.h b/src/mod/event_handlers/mod_rayo/nlsml.h index 75c4ad6378..f5be079ba5 100644 --- a/src/mod/event_handlers/mod_rayo/nlsml.h +++ b/src/mod/event_handlers/mod_rayo/nlsml.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2014, Grasshopper * * Version: MPL 1.1 * @@ -40,6 +40,7 @@ enum nlsml_match_type { }; extern int nlsml_init(void); +extern void nlsml_destroy(void); enum nlsml_match_type nlsml_parse(const char *result, const char *uuid); iks *nlsml_normalize(const char *result); extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation); diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.c b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.c index b5f4a58fb8..702d20bec2 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.c +++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.c @@ -248,6 +248,17 @@ done: return SWITCH_STATUS_SUCCESS; } +/** + * Detector definition destructor + */ +static void destroy_detector(void *ptr) +{ + struct rayo_cpa_detector *detector = (struct rayo_cpa_detector *) ptr; + if (detector->signal_type_map) { + switch_core_hash_destroy(&detector->signal_type_map); + } +} + /** * Configure CPA */ @@ -353,7 +364,7 @@ static switch_status_t do_config(switch_memory_pool_t *pool, const char *config_ /* add signal-type to detector mapping */ const char *signal_type_ns = switch_core_sprintf(pool, "%s%s:%s", RAYO_CPA_BASE, signal_type, RAYO_VERSION); event_ok = 1; - switch_core_hash_insert(globals.detectors, signal_type_ns, detector); + switch_core_hash_insert_destructor(globals.detectors, signal_type_ns, detector, destroy_detector); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding CPA %s => %s\n", signal_type_ns, detector->name); } diff --git a/src/mod/event_handlers/mod_rayo/rayo_input_component.c b/src/mod/event_handlers/mod_rayo/rayo_input_component.c index ecf59e85a7..a9412ee2b6 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_input_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_input_component.c @@ -890,9 +890,12 @@ switch_status_t rayo_input_component_load(switch_loadable_module_interface_t **m */ switch_status_t rayo_input_component_shutdown(void) { - srgs_parser_destroy(globals.parser); switch_event_unbind_callback(on_detected_speech_event); + srgs_parser_destroy(globals.parser); + srgs_destroy(); + nlsml_destroy(); + rayo_cpa_component_shutdown(); return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/event_handlers/mod_rayo/rayo_output_component.c b/src/mod/event_handlers/mod_rayo/rayo_output_component.c index f2548f380e..4f32bbec10 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_output_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_output_component.c @@ -1226,6 +1226,8 @@ switch_status_t rayo_output_component_load(switch_loadable_module_interface_t ** */ switch_status_t rayo_output_component_shutdown(void) { + switch_core_hash_destroy(&fileman_globals.hash); + return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/event_handlers/mod_rayo/srgs.c b/src/mod/event_handlers/mod_rayo/srgs.c index aba23e9708..22ee02fd06 100644 --- a/src/mod/event_handlers/mod_rayo/srgs.c +++ b/src/mod/event_handlers/mod_rayo/srgs.c @@ -53,14 +53,15 @@ struct tag_def { /** * library configuration */ -static struct { +typedef struct { /** true if initialized */ switch_bool_t init; /** Mapping of tag name to definition */ switch_hash_t *tag_defs; /** library memory pool */ switch_memory_pool_t *pool; -} globals; +} srgs_globals; +static srgs_globals globals = { 0 }; /** * SRGS node types @@ -376,6 +377,17 @@ static struct srgs_node *sn_insert_string(switch_memory_pool_t *pool, struct srg return child; } +/** + * Tag def destructor + */ +static void destroy_tag_def(void *ptr) +{ + struct tag_def *tag = (struct tag_def *) ptr; + if (tag->children_tags) { + switch_core_hash_destroy(&tag->children_tags); + } +} + /** * Add a definition for a tag * @param tag the name @@ -402,7 +414,7 @@ static struct tag_def *add_tag_def(const char *tag, tag_attribs_fn attribs_fn, t def->attribs_fn = attribs_fn; def->cdata_fn = cdata_fn; def->is_root = SWITCH_FALSE; - switch_core_hash_insert(globals.tag_defs, tag, def); + switch_core_hash_insert_destructor(globals.tag_defs, tag, def, destroy_tag_def); return def; } @@ -871,15 +883,18 @@ void srgs_parser_destroy(struct srgs_parser *parser) switch_memory_pool_t *pool = parser->pool; switch_hash_index_t *hi = NULL; - /* clean up all cached grammars */ - for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) { - struct srgs_grammar *grammar = NULL; - const void *key; - void *val; - switch_core_hash_this(hi, &key, NULL, &val); - grammar = (struct srgs_grammar *)val; - switch_assert(grammar); - srgs_grammar_destroy(grammar); + if (parser->cache) { + /* clean up all cached grammars */ + for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) { + struct srgs_grammar *grammar = NULL; + const void *key; + void *val; + switch_core_hash_this(hi, &key, NULL, &val); + grammar = (struct srgs_grammar *)val; + switch_assert(grammar); + srgs_grammar_destroy(grammar); + } + switch_core_hash_destroy(&parser->cache); } switch_core_destroy_memory_pool(&pool); } @@ -1629,6 +1644,24 @@ int srgs_init(void) return 1; } +/** + * Destruction of SRGS parser environment + */ +void srgs_destroy(void) +{ + if (globals.init) { + if (globals.tag_defs) { + switch_core_hash_destroy(&globals.tag_defs); + globals.tag_defs = NULL; + } + if (globals.pool) { + switch_core_destroy_memory_pool(&globals.pool); + globals.pool = NULL; + } + globals.init = SWITCH_FALSE; + } +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/event_handlers/mod_rayo/srgs.h b/src/mod/event_handlers/mod_rayo/srgs.h index 29ee916ce7..cfe2c6c93a 100644 --- a/src/mod/event_handlers/mod_rayo/srgs.h +++ b/src/mod/event_handlers/mod_rayo/srgs.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2014, Grasshopper * * Version: MPL 1.1 * @@ -46,6 +46,7 @@ enum srgs_match_type { }; extern int srgs_init(void); +extern void srgs_destroy(void); extern struct srgs_parser *srgs_parser_new(const char *uuid); extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document); extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar);