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
*/
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

View File

@ -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);

View File

@ -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);
}

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)
{
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;

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_core_hash_destroy(&fileman_globals.hash);
return SWITCH_STATUS_SUCCESS;
}

View File

@ -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

View File

@ -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);