summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-04-07 13:05:26 -0300
committerJoshua Colp <jcolp@digium.com>2016-04-07 13:42:01 -0300
commit901e8d78c4ddad0e60ce792f53ebe5a43026f163 (patch)
tree319da19442a58f56f71f7694771e2e68303299c9 /res
parent8207372e663bdaa44acbe8fd6a262eead5532ad8 (diff)
res_pjsip_registrar_expire: Fix race condition at shutdown.
When shutting down, the PJSIP sorcery is destroyed. The registrar expiration module queries the PJSIP sorcery to determine what to expire. As there was no synchronization between termination of the expiration thread and the unloading of the module it was possible for the thread to try to access the PJSIP sorcery after it had been destroyed. This change ensures that the thread is shut down before allowing the module to be considered unloaded. Change-Id: I69fd239edbaaf160c2d37ae00d3ac06e5596fe8b
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_registrar_expire.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/res/res_pjsip_registrar_expire.c b/res/res_pjsip_registrar_expire.c
index bdb86e50e..97f2ca1c0 100644
--- a/res/res_pjsip_registrar_expire.c
+++ b/res/res_pjsip_registrar_expire.c
@@ -91,6 +91,7 @@ static void expiration_global_loaded(const char *object_type)
} else {
if (check_thread != AST_PTHREADT_NULL) {
pthread_kill(check_thread, SIGURG);
+ pthread_join(check_thread, NULL);
check_thread = AST_PTHREADT_NULL;
ast_debug(3, "Interval = 0, shutting thread down\n");
}
@@ -105,7 +106,10 @@ static struct ast_sorcery_observer expiration_global_observer = {
static int unload_module(void)
{
if (check_thread != AST_PTHREADT_NULL) {
+ check_interval = 0;
pthread_kill(check_thread, SIGURG);
+ pthread_join(check_thread, NULL);
+
check_thread = AST_PTHREADT_NULL;
}