[Asterisk-code-review] chan sip.c: Clear scheduled immediate events on unload. (asterisk[master])
Richard Mudgett
asteriskteam at digium.com
Tue Mar 15 14:59:36 CDT 2016
Richard Mudgett has uploaded a new change for review.
https://gerrit.asterisk.org/2406
Change subject: chan_sip.c: Clear scheduled immediate events on unload.
......................................................................
chan_sip.c: Clear scheduled immediate events on unload.
This patch is part of a series to resolve deadlocks in chan_sip.c.
ASTERISK-25023
Change-Id: I3f6540717634f6f2e84d8531a054976f2bbb9d20
---
M channels/chan_sip.c
1 file changed, 31 insertions(+), 22 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/06/2406/1
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2d5843d..3245509 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -34896,6 +34896,26 @@
ast_mutex_unlock(&monlock);
}
+ cleanup_all_regs();
+
+ {
+ struct ao2_iterator iter;
+ struct sip_subscription_mwi *iterator;
+
+ iter = ao2_iterator_init(subscription_mwi_list, 0);
+ while ((iterator = ao2_t_iterator_next(&iter, "unload_module iter"))) {
+ ao2_lock(iterator);
+ if (iterator->dnsmgr) {
+ ast_dnsmgr_release(iterator->dnsmgr);
+ iterator->dnsmgr = NULL;
+ ao2_t_ref(iterator, -1, "dnsmgr release");
+ }
+ ao2_unlock(iterator);
+ ao2_t_ref(iterator, -1, "unload_module iter");
+ }
+ ao2_iterator_destroy(&iter);
+ }
+
/* Destroy all the dialogs and free their memory */
i = ao2_iterator_init(dialogs, 0);
while ((p = ao2_t_iterator_next(&i, "iterate thru dialogs"))) {
@@ -34903,6 +34923,13 @@
ao2_t_ref(p, -1, "throw away iterator result");
}
ao2_iterator_destroy(&i);
+
+ /*
+ * Since the monitor thread runs the scheduled events and we
+ * just stopped the monitor thread above, we have to run any
+ * pending scheduled immediate events in this thread.
+ */
+ ast_sched_runq(sched);
/* Free memory for local network address mask */
ast_free_ha(localaddr);
@@ -34925,28 +34952,6 @@
ast_rtp_dtls_cfg_free(&default_dtls_cfg);
- cleanup_all_regs();
- ao2_cleanup(registry_list);
-
- {
- struct ao2_iterator iter;
- struct sip_subscription_mwi *iterator;
-
- iter = ao2_iterator_init(subscription_mwi_list, 0);
- while ((iterator = ao2_t_iterator_next(&iter, "unload_module iter"))) {
- ao2_lock(iterator);
- if (iterator->dnsmgr) {
- ast_dnsmgr_release(iterator->dnsmgr);
- iterator->dnsmgr = NULL;
- ao2_t_ref(iterator, -1, "dnsmgr release");
- }
- ao2_unlock(iterator);
- ao2_t_ref(iterator, -1, "unload_module iter");
- }
- ao2_iterator_destroy(&iter);
- }
- ao2_cleanup(subscription_mwi_list);
-
/*
* Wait awhile for the TCP/TLS thread container to become empty.
*
@@ -34961,6 +34966,9 @@
if (!wait_count) {
ast_debug(2, "TCP/TLS thread container did not become empty :(\n");
}
+
+ ao2_cleanup(registry_list);
+ ao2_cleanup(subscription_mwi_list);
ao2_t_global_obj_release(g_bogus_peer, "Release the bogus peer.");
@@ -34981,6 +34989,7 @@
close(sipsock);
io_context_destroy(io);
ast_sched_context_destroy(sched);
+ sched = NULL;
ast_context_destroy_by_name(used_context, "SIP");
ast_unload_realtime("sipregs");
ast_unload_realtime("sippeers");
--
To view, visit https://gerrit.asterisk.org/2406
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3f6540717634f6f2e84d8531a054976f2bbb9d20
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
More information about the asterisk-code-review
mailing list