]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
mod_rayo: clean up module hashes on shutdown
authorChris Rienzo <chris.rienzo@grasshopper.com>
Mon, 14 Apr 2014 16:01:31 +0000 (12:01 -0400)
committerChris Rienzo <chris.rienzo@grasshopper.com>
Mon, 14 Apr 2014 16:01:31 +0000 (12:01 -0400)
src/mod/event_handlers/mod_rayo/nlsml.c
src/mod/event_handlers/mod_rayo/nlsml.h
src/mod/event_handlers/mod_rayo/rayo_cpa_detector.c
src/mod/event_handlers/mod_rayo/rayo_input_component.c
src/mod/event_handlers/mod_rayo/rayo_output_component.c
src/mod/event_handlers/mod_rayo/srgs.c
src/mod/event_handlers/mod_rayo/srgs.h

index 867b31b5c1222f7ad5b1b5333808eb9deb839f07..6d18f4bb562be6a93b8080ece16cfa40839d74ec 100644 (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
index 75c4ad6378ee79ef354c1639dd4c4c4799bad7cc..f5be079ba56c85f055be41d4c0c7b9c60b0c3a7b 100644 (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);
index b5f4a58fb85ee6f97ae87bf69d085361b9f8224c..702d20bec2e8c6de914c7446f6460c5855062bf2 100644 (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);
                                        }
 
index ecf59e85a791fd702dfc27fb98e21a6e036e1046..a9412ee2b62ead7104f964b13e14164ea0939ba1 100644 (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;
index f2548f380ef2d53826e2228939ae4b53457b8148..4f32bbec104168095354cad9bd37015b2cc8b072 100644 (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;
 }
 
index aba23e9708f2cc543f4b39c2561ee561ee786811..22ee02fd06e8eb451415178646a8c590bc65519e 100644 (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
index 29ee916ce7b86dfc13d7055ab3004fff9d269f5c..cfe2c6c93a34e19896f12d205d2db942c46713c5 100644 (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);