summaryrefslogtreecommitdiff
path: root/res/res_pjsip_transport_management.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-04-18 15:41:34 -0300
committerJoshua Colp <jcolp@digium.com>2016-04-18 15:49:07 -0300
commit49bfdc9ac029e0ef17cd8e85d8d7b7731387a34e (patch)
treed91e99a959834c58d9e6a13389b684261fa83c65 /res/res_pjsip_transport_management.c
parent22335fe18af85b8086899740cef436b5a59a2ae4 (diff)
res_pjsip_transport_management: Allow unload to occur.
At shutdown it is possible for modules to be unloaded that wouldn't normally be unloaded. This allows the environment to be cleaned up. The res_pjsip_transport_management module did not have the unload logic in it to clean itself up causing the res_pjsip module to not get unloaded. As a result the res_pjsip monitor thread kept going processing traffic and timers when it shouldn't. Change-Id: Ic8cadee131e3b2c436a81d3ae8bb5775999ae00a
Diffstat (limited to 'res/res_pjsip_transport_management.c')
-rw-r--r--res/res_pjsip_transport_management.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/res/res_pjsip_transport_management.c b/res/res_pjsip_transport_management.c
index eb0240438..afd94eb1f 100644
--- a/res/res_pjsip_transport_management.c
+++ b/res/res_pjsip_transport_management.c
@@ -24,6 +24,8 @@
#include "asterisk.h"
+#include <signal.h>
+
#include <pjsip.h>
#include <pjsip_ua.h>
@@ -93,7 +95,7 @@ static void *keepalive_transport_thread(void *data)
/* Once loaded this module just keeps on going as it is unsafe to stop and change the underlying
* callback for the transport manager.
*/
- while (1) {
+ while (keepalive_interval) {
sleep(keepalive_interval);
ao2_callback(transports, OBJ_NODATA, keepalive_transport_cb, NULL);
}
@@ -347,7 +349,19 @@ static int load_module(void)
static int unload_module(void)
{
- /* This will never get called */
+ pjsip_tpmgr *tpmgr = pjsip_endpt_get_tpmgr(ast_sip_get_pjsip_endpoint());
+
+ if (keepalive_interval) {
+ keepalive_interval = 0;
+ pthread_kill(keepalive_thread, SIGURG);
+ pthread_join(keepalive_thread, NULL);
+ }
+
+ ast_sched_context_destroy(sched);
+ ao2_ref(transports, -1);
+
+ ast_sip_unregister_service(&idle_monitor_module);
+ pjsip_tpmgr_set_state_cb(tpmgr, tpmgr_state_callback);
return 0;
}