mod_rayo: clean up module hashes on shutdown

This commit is contained in:
Chris Rienzo 2014-04-14 12:01:31 -04:00
parent b0c2c6d67c
commit e8078d8aef
7 changed files with 100 additions and 19 deletions

View File

@ -51,14 +51,15 @@ struct tag_def {
/** /**
* library configuration * library configuration
*/ */
static struct { typedef struct {
/** true if initialized */ /** true if initialized */
switch_bool_t init; switch_bool_t init;
/** Mapping of tag name to definition */ /** Mapping of tag name to definition */
switch_hash_t *tag_defs; switch_hash_t *tag_defs;
/** library memory pool */ /** library memory pool */
switch_memory_pool_t *pool; switch_memory_pool_t *pool;
} globals; } nlsml_globals;
static nlsml_globals globals = { 0 };
/** /**
* The node in the XML tree * The node in the XML tree
@ -88,6 +89,17 @@ struct nlsml_parser {
int nomatch; 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 * Add a definition for a tag
* @param tag the name * @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->attribs_fn = attribs_fn;
def->cdata_fn = cdata_fn; def->cdata_fn = cdata_fn;
def->is_root = SWITCH_FALSE; 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; return def;
} }
@ -467,6 +479,24 @@ int nlsml_init(void)
return 1; 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: /* For Emacs:
* Local Variables: * Local Variables:
* mode:c * mode:c

View File

@ -1,6 +1,6 @@
/* /*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * 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 * Version: MPL 1.1
* *
@ -40,6 +40,7 @@ enum nlsml_match_type {
}; };
extern int nlsml_init(void); extern int nlsml_init(void);
extern void nlsml_destroy(void);
enum nlsml_match_type nlsml_parse(const char *result, const char *uuid); enum nlsml_match_type nlsml_parse(const char *result, const char *uuid);
iks *nlsml_normalize(const char *result); iks *nlsml_normalize(const char *result);
extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation); extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation);

View File

@ -248,6 +248,17 @@ done:
return SWITCH_STATUS_SUCCESS; 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 * 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 */ /* 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); const char *signal_type_ns = switch_core_sprintf(pool, "%s%s:%s", RAYO_CPA_BASE, signal_type, RAYO_VERSION);
event_ok = 1; 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding CPA %s => %s\n", signal_type_ns, detector->name);
} }

View File

@ -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) switch_status_t rayo_input_component_shutdown(void)
{ {
srgs_parser_destroy(globals.parser);
switch_event_unbind_callback(on_detected_speech_event); switch_event_unbind_callback(on_detected_speech_event);
srgs_parser_destroy(globals.parser);
srgs_destroy();
nlsml_destroy();
rayo_cpa_component_shutdown(); rayo_cpa_component_shutdown();
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;

View File

@ -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_status_t rayo_output_component_shutdown(void)
{ {
switch_core_hash_destroy(&fileman_globals.hash);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }

View File

@ -53,14 +53,15 @@ struct tag_def {
/** /**
* library configuration * library configuration
*/ */
static struct { typedef struct {
/** true if initialized */ /** true if initialized */
switch_bool_t init; switch_bool_t init;
/** Mapping of tag name to definition */ /** Mapping of tag name to definition */
switch_hash_t *tag_defs; switch_hash_t *tag_defs;
/** library memory pool */ /** library memory pool */
switch_memory_pool_t *pool; switch_memory_pool_t *pool;
} globals; } srgs_globals;
static srgs_globals globals = { 0 };
/** /**
* SRGS node types * SRGS node types
@ -376,6 +377,17 @@ static struct srgs_node *sn_insert_string(switch_memory_pool_t *pool, struct srg
return child; 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 * Add a definition for a tag
* @param tag the name * @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->attribs_fn = attribs_fn;
def->cdata_fn = cdata_fn; def->cdata_fn = cdata_fn;
def->is_root = SWITCH_FALSE; 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; return def;
} }
@ -871,6 +883,7 @@ void srgs_parser_destroy(struct srgs_parser *parser)
switch_memory_pool_t *pool = parser->pool; switch_memory_pool_t *pool = parser->pool;
switch_hash_index_t *hi = NULL; switch_hash_index_t *hi = NULL;
if (parser->cache) {
/* clean up all cached grammars */ /* clean up all cached grammars */
for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) { for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) {
struct srgs_grammar *grammar = NULL; struct srgs_grammar *grammar = NULL;
@ -881,6 +894,8 @@ void srgs_parser_destroy(struct srgs_parser *parser)
switch_assert(grammar); switch_assert(grammar);
srgs_grammar_destroy(grammar); srgs_grammar_destroy(grammar);
} }
switch_core_hash_destroy(&parser->cache);
}
switch_core_destroy_memory_pool(&pool); switch_core_destroy_memory_pool(&pool);
} }
@ -1629,6 +1644,24 @@ int srgs_init(void)
return 1; 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: /* For Emacs:
* Local Variables: * Local Variables:
* mode:c * mode:c

View File

@ -1,6 +1,6 @@
/* /*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * 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 * Version: MPL 1.1
* *
@ -46,6 +46,7 @@ enum srgs_match_type {
}; };
extern int srgs_init(void); extern int srgs_init(void);
extern void srgs_destroy(void);
extern struct srgs_parser *srgs_parser_new(const char *uuid); extern struct srgs_parser *srgs_parser_new(const char *uuid);
extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document); extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document);
extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar); extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar);