]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make modules unbind events and un-reserve subclasses on module unload
authorMichael Jerris <mike@jerris.com>
Thu, 3 Jul 2008 23:54:35 +0000 (23:54 +0000)
committerMichael Jerris <mike@jerris.com>
Thu, 3 Jul 2008 23:54:35 +0000 (23:54 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8898 d0543943-73ff-0310-b7d9-9358b9ac24b2

15 files changed:
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_enum/mod_enum.c
src/mod/applications/mod_voicemail/mod_voicemail.c
src/mod/endpoints/mod_dingaling/mod_dingaling.c
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia_glue.c
src/mod/endpoints/mod_sofia/sofia_presence.c
src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c
src/mod/event_handlers/mod_event_socket/mod_event_socket.c
src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c
src/mod/languages/mod_lua/mod_lua.cpp
src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
src/mod/loggers/mod_logfile/mod_logfile.c

index 7e94e23ce9b7a0ac128a15e0fb0b039840fb4e05..6790b46eae94498aa6b1c2515eae0ff517d48c05 100644 (file)
@@ -75,6 +75,7 @@ static struct {
        uint32_t id_pool;
        int32_t running;
        uint32_t threads;
+       switch_event_node_t *node;
 } globals;
 
 typedef enum {
@@ -5258,7 +5259,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load)
        switch_mutex_init(&globals.hash_mutex, SWITCH_MUTEX_NESTED, globals.conference_pool);
 
        /* Subscribe to presence request events */
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't subscribe to presence request events!\n");
                return SWITCH_STATUS_GENERR;
        }
@@ -5283,6 +5284,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_conference_shutdown)
                        switch_yield(100000);
                }
 
+               switch_event_unbind(&globals.node);
+               switch_event_free_subclass(CONF_EVENT_MAINT);
+
                /* free api interface help ".syntax" field string */
                switch_safe_free(api_syntax);
        }
index 262c8efe00c4a676470a8ed97afea5e77958dcb8..944c70f8d4988c3bda6ebe04d584f688873d0361 100644 (file)
@@ -80,6 +80,7 @@ static struct {
        switch_memory_pool_t *pool;
        int auto_reload;
        int timeout;
+       switch_event_node_t *node;
 } globals;
 
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_root, globals.root);
@@ -834,7 +835,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_enum_load)
        do_load();
 
 
-       if (switch_event_bind(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_TERM;
        }
@@ -855,6 +856,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_enum_load)
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_enum_shutdown)
 {
 
+       switch_event_unbind(&globals.node);
+
        if (globals.pool) {
                switch_core_destroy_memory_pool(&globals.pool);
        }
index 4949eb190f7915ca9b9fd05d3c30a9cb32489979..e840a606a7c418e320c926c3aa6feb80b0fb0653 100644 (file)
@@ -2955,5 +2955,5 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load)
  * c-basic-offset:4
  * End:
  * For VIM:
- * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
  */
index a0b7f60338cc906591cc7f10c4e2c070b12e8e5a..f1591d612cc178e41a3d0375b9fdca4aaaec7c6e 100644 (file)
@@ -103,6 +103,11 @@ static struct {
        int running;
        int handles;
        char guess_ip[80];
+       switch_event_node_t *in_node;
+       switch_event_node_t *probe_node;
+       switch_event_node_t *out_node;
+       switch_event_node_t *roster_node;
+
 } globals;
 
 struct mdl_profile {
@@ -1755,22 +1760,22 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dingaling_load)
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_IN, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_IN, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL, &globals.in_node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL, &globals.probe_node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_SUBCLASS_ANY, pres_event_handler, NULL, &globals.out_node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_ROSTER, SWITCH_EVENT_SUBCLASS_ANY, roster_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_ROSTER, SWITCH_EVENT_SUBCLASS_ANY, roster_event_handler, NULL, &globals.roster_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
@@ -1867,6 +1872,16 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_dingaling_shutdown)
                        ldl_global_destroy();
                }
        }
+
+       switch_event_free_subclass(DL_EVENT_LOGIN_SUCCESS);
+       switch_event_free_subclass(DL_EVENT_LOGIN_FAILURE);
+       switch_event_free_subclass(DL_EVENT_CONNECTED);
+       switch_event_unbind(&globals.in_node);
+       switch_event_unbind(&globals.probe_node);
+       switch_event_unbind(&globals.out_node);
+       switch_event_unbind(&globals.roster_node);
+
+
        switch_core_hash_destroy(&globals.profile_hash);
        return SWITCH_STATUS_SUCCESS;
 }
index 47e5e8995244f2c305e5d26b32217b1dd63121e6..f2fff44b99226bfb33756800191f19037852520d 100644 (file)
@@ -1961,36 +1961,36 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for profiles to start\n");
        switch_yield(1500000);
 
-       if (switch_event_bind(modname, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT, event_handler, NULL, &mod_sofia_globals.custom_node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_TERM;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_IN, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_IN, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL, &mod_sofia_globals.in_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL, &mod_sofia_globals.out_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL, &mod_sofia_globals.probe_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_ROSTER, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_ROSTER, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL, &mod_sofia_globals.roster_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_MESSAGE_WAITING, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_mwi_event_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_MESSAGE_WAITING, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_mwi_event_handler, NULL, &mod_sofia_globals.mwi_node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
@@ -2030,6 +2030,13 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sofia_shutdown)
        }
        switch_mutex_unlock(mod_sofia_globals.mutex);
 
+       switch_event_unbind(&mod_sofia_globals.in_node);
+       switch_event_unbind(&mod_sofia_globals.probe_node);
+       switch_event_unbind(&mod_sofia_globals.out_node);
+       switch_event_unbind(&mod_sofia_globals.roster_node);
+       switch_event_unbind(&mod_sofia_globals.custom_node);
+       switch_event_unbind(&mod_sofia_globals.mwi_node);
+
        while (mod_sofia_globals.threads) {
                switch_yield(1000);
                if (++sanity >= 10000) {
index 7d8201260fb38e0762fb007747463323c27c1b44..707d3e0d5ec7f26d5c1cd2fcdced0ebee119564f 100644 (file)
@@ -209,6 +209,12 @@ struct mod_sofia_globals {
        switch_queue_t *mwi_queue;
        struct sofia_private destroy_private;
        struct sofia_private keep_private;
+       switch_event_node_t *in_node;
+       switch_event_node_t *probe_node;
+       switch_event_node_t *out_node;
+       switch_event_node_t *roster_node;
+       switch_event_node_t *custom_node;
+       switch_event_node_t *mwi_node;
 };
 extern struct mod_sofia_globals mod_sofia_globals;
 
index 16c8b4fcee17b2061fb4342d80ffae39d6a26dd4..7c9f49359f553ac2956f140cbc72cf3415079343 100644 (file)
@@ -1184,6 +1184,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
                char *p;
 
                route = switch_core_session_strdup(tech_pvt->session, route + 9);
+               switch_assert(route);
 
                for (p = route; p && *p ; p++) {
                        if (*p == '>' || *p == ';') {
index 86e055e89af2981a2113499350185433f0eda0c1..9cebbff4573ceb91233c20e8f5513e378514e41a 100644 (file)
@@ -1413,7 +1413,7 @@ void sofia_presence_handle_sip_i_subscribe(int status,
                        char *sticky = NULL;
 
                        if (is_nat) {
-                               const char *ipv6 = strchr(network_ip, ':');
+                               ipv6 = strchr(network_ip, ':');
                                sticky = switch_mprintf("sip:%s@%s%s%s:%d",
                                                                                contact_user,
                                                                                ipv6 ? "[" : "",
index 6238a340df7d0060cf12447753ce14b1ad695eda..0c1187e2d5cd4579cb1f2f6b3cf597d755f14ac6 100644 (file)
@@ -56,11 +56,12 @@ static struct {
        int rotate;
        int debug;
        cdr_leg_t legs;
+       switch_event_node_t *node;
 } globals;
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_csv_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown);
-SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, NULL, NULL);
+SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, mod_cdr_csv_shutdown, NULL);
 
 static off_t fd_size(int fd)
 {
@@ -363,7 +364,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_csv_load)
 {
        switch_status_t status = SWITCH_STATUS_SUCCESS;
 
-       if (switch_event_bind(modname, SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
@@ -385,6 +386,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown)
 {
 
        globals.shutdown = 1;
+       switch_event_unbind(&globals.node);
        return SWITCH_STATUS_SUCCESS;
 }
 
index a45e0d47da513f5df9d390ec8753696e4f7bb2c5..bff0672d1128cbb221ee7bade799226c52367dab 100644 (file)
@@ -54,6 +54,7 @@ static struct {
        switch_hash_t *event_hash;
        uint8_t event_list[SWITCH_EVENT_ALL + 1];
        int running;
+       switch_event_node_t *node;
 } globals;
 
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_address, globals.address);
@@ -261,6 +262,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_event_multicast_shutdown)
                globals.udp_socket = NULL;
        }
 
+       switch_event_unbind(&globals.node);
+       switch_event_free_subclass(MULTICAST_EVENT);
+
        switch_core_hash_destroy(&globals.event_hash);
 
        return SWITCH_STATUS_SUCCESS;
index e7e2489078acae5f9352c485fa3a36c8c3375ffb..fbc0b9381aa6b6f5cacfd0d34bbcc2fc54f850e4 100644 (file)
@@ -106,6 +106,11 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_pref_pass, prefs.password);
 static void *SWITCH_THREAD_FUNC listener_run(switch_thread_t *thread, void *obj);
 static void launch_listener_thread(listener_t *listener);
 
+static struct {
+       switch_event_node_t *node;
+} globals;
+
+
 static switch_status_t socket_logger(const switch_log_node_t *node, switch_log_level_t level)
 {
        listener_t *l;
@@ -326,6 +331,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_event_socket_shutdown)
                        break;
                }
        }
+       switch_event_unbind(&globals.node);
 
        switch_mutex_lock(listen_list.mutex);
        for (l = listen_list.listeners; l; l = l->next) {
@@ -1357,7 +1363,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_event_socket_runtime)
 
        listen_list.ready = 1;
 
-       if (switch_event_bind(modname, SWITCH_EVENT_ALL, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_ALL, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
index c05d04c0929ff11d78422054bae20ab2992babd3..3cf7048c1c93e5efab3eb08634304a9a6b573e5d 100644 (file)
@@ -46,6 +46,8 @@ static struct {
        sw_discovery discovery;
        sw_discovery_publish_id disc_id;
        switch_mutex_t *zc_lock;
+       switch_event_node_t *publish_node;
+       switch_event_node_t *unpublish_node;
 } globals;
 
 
@@ -218,12 +220,12 @@ static switch_status_t load_config(void)
                                        return SWITCH_STATUS_MEMERR;
                                }
                        } else if (!strcasecmp(var, "publish") && !strcasecmp(val, "yes")) {
-                               if (switch_event_bind(modname, SWITCH_EVENT_PUBLISH, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+                               if (switch_event_bind_removable(modname, SWITCH_EVENT_PUBLISH, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL, &globals.publish_node) != SWITCH_STATUS_SUCCESS) {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                                        return SWITCH_STATUS_GENERR;
                                }
 
-                               if (switch_event_bind(modname, SWITCH_EVENT_UNPUBLISH, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+                               if (switch_event_bind_removable(modname, SWITCH_EVENT_UNPUBLISH, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL, &globals.unpublish_node) != SWITCH_STATUS_SUCCESS) {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                                        return SWITCH_STATUS_GENERR;
                                }
@@ -248,6 +250,12 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_zeroconf_shutdown)
                RUNNING = -1;
                switch_yield(100000);
        }
+
+       switch_event_unbind(&globals.publish_node);
+       switch_event_unbind(&globals.unpublish_node);
+       switch_event_free_subclass(MY_EVENT_PUBLISH);
+       switch_event_free_subclass(MY_EVENT_UNPUBLISH);
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -265,10 +273,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_zeroconf_load)
                return SWITCH_STATUS_TERM;
        }
 
-       if (load_config() != SWITCH_STATUS_SUCCESS) {
-               return SWITCH_STATUS_TERM;
-       }
-
        if (switch_event_reserve_subclass(MY_EVENT_PUBLISH) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass!\n");
                return SWITCH_STATUS_GENERR;
@@ -279,6 +283,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_zeroconf_load)
                return SWITCH_STATUS_GENERR;
        }
 
+       if (load_config() != SWITCH_STATUS_SUCCESS) {
+               return SWITCH_STATUS_TERM;
+       }
+
        /* connect my internal structure to the blank pointer passed to me */
        *module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
index d1db9b4db067764ad7517ce3f0b1ac1f096ca9dc..3512c59a49424f64ec26999934cc432403d34270 100644 (file)
@@ -38,11 +38,14 @@ SWITCH_BEGIN_EXTERN_C
 #include <lualib.h>
 #include "mod_lua_extra.h"
 SWITCH_MODULE_LOAD_FUNCTION(mod_lua_load);
-SWITCH_MODULE_DEFINITION(mod_lua, mod_lua_load, NULL, NULL);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_lua_shutdown);
+
+SWITCH_MODULE_DEFINITION(mod_lua, mod_lua_load, mod_lua_shutdown, NULL);
 
 static struct {
        switch_memory_pool_t *pool;
        char *xml_handler;
+       switch_event_node_t *node;
 } globals;
 
 int luaopen_freeswitch(lua_State * L);
@@ -389,7 +392,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_lua_load)
        switch_api_interface_t *api_interface;
        switch_application_interface_t *app_interface;
 
-       if (switch_event_bind(modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY, message_query_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY, message_query_handler, NULL, &globals.node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
@@ -411,6 +414,13 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_lua_load)
        return SWITCH_STATUS_SUCCESS;
 }
 
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_lua_shutdown)
+{
+       switch_event_unbind(&globals.node);
+       return SWITCH_STATUS_SUCCESS;
+}
+
+
 SWITCH_END_EXTERN_C
 /* For Emacs:
  * Local Variables:
index 2d4803db85625da775c2a12ee3a55616d5ba90ec..dbdad5d0669dcf4fedfdceb0b0fc713bf6df7e1c 100644 (file)
@@ -95,9 +95,9 @@ static struct {
        FILE *gOutFile;
        int stackDummy;
        JSRuntime *rt;
+       switch_event_node_t *node;
 } globals;
 
-
 static JSClass global_class = {
        "Global", JSCLASS_HAS_PRIVATE,
        JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
@@ -3564,7 +3564,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_spidermonkey_load)
                return status;
        }
 
-       if (switch_event_bind(modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY, message_query_handler, NULL)
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY, message_query_handler, NULL, &globals.node)
                != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
@@ -3586,6 +3586,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_spidermonkey_load)
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_spidermonkey_shutdown)
 {
        curl_global_cleanup();
+       switch_event_unbind(&globals.node);
        switch_core_hash_destroy(&module_manager.mod_hash);
        switch_core_hash_destroy(&module_manager.load_hash);
        return SWITCH_STATUS_SUCCESS;
index eb7acc398deffbbda63387c7a3a47b4d8a854ac5..599e82571816e5ffacea817bb628754d5c43b62b 100644 (file)
@@ -46,6 +46,7 @@ static switch_hash_t *profile_hash = NULL;
 static struct {
        int rotate;
        switch_mutex_t *mutex;
+       switch_event_node_t *node;
 } globals;
 
 struct logfile_profile {
@@ -341,7 +342,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_logfile_load)
        }
        switch_core_hash_init(&profile_hash, module_pool);
 
-       if (switch_event_bind(modname, SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+       if (switch_event_bind_removable(modname, SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
                return SWITCH_STATUS_GENERR;
        }
@@ -383,6 +384,8 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_logfile_shutdown)
        /* TODO:  Need to finish processing pending log messages before we close the file handle */
 
        //switch_file_close(globals->log_afd);
+       switch_event_unbind(&globals.node);
+
        return SWITCH_STATUS_SUCCESS;
 }