mod_rayo: clean up module hashes on shutdown
This commit is contained in:
parent
b0c2c6d67c
commit
e8078d8aef
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue