[Asterisk-code-review] chan sip.c: Clear scheduled immediate events on unload. (asterisk[master])
Joshua Colp
asteriskteam at digium.com
Thu Mar 17 06:10:31 CDT 2016
Joshua Colp has submitted this change and it was merged.
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.
The reordering of chan_sip's shutdown is to handle any immediate events
that get put onto the scheduler so resources aren't leaked. The typical
immediate events at this time are going to be concerned with stopping
other scheduled events.
ASTERISK-25023
Change-Id: I3f6540717634f6f2e84d8531a054976f2bbb9d20
---
M channels/chan_sip.c
1 file changed, 31 insertions(+), 22 deletions(-)
Approvals:
Joshua Colp: Looks good to me, approved; Verified
Corey Farrell: Looks good to me, but someone else must approve
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a8d5032..2719372 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -34879,6 +34879,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"))) {
@@ -34886,6 +34906,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);
@@ -34908,28 +34935,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.
*
@@ -34944,6 +34949,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.");
@@ -34964,6 +34972,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: merged
Gerrit-Change-Id: I3f6540717634f6f2e84d8531a054976f2bbb9d20
Gerrit-PatchSet: 2
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Corey Farrell <git at cfware.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>
More information about the asterisk-code-review
mailing list