summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-04-26 13:13:14 -0300
committerJoshua Colp <jcolp@digium.com>2016-04-26 13:15:37 -0300
commit949bf6b282e09cb7104a5cc55a3be3d33873db0f (patch)
tree6c462d5b87d5f5a00fd20b86615bc48f0a375915 /channels
parent9d8f59aaf286c2177cdc051e25a50b05bfeacb44 (diff)
chan_sip: Give more time for TCP/TLS threads to stop.
The unload process currently tells each TCP/TLS to terminate but does not wait for them to do so. This introduces a race condition where the container holding the threads may be destroyed before the threads are able to remove themselves from it. When they finally do the container is invalid and can't be used causing a crash. A previous change existed which waited a bit to wait for any stranglers to finish. This change extends this and waits longer. ASTERISK-25961 #close Change-Id: Idc6262b670ca49ede32061159e323b7b63c6f3c6
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 45827b448..cbbda4e73 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -35201,7 +35201,7 @@ static int unload_module(void)
struct sip_pvt *p;
struct sip_threadinfo *th;
struct ao2_iterator i;
- int wait_count;
+ struct timeval start;
ast_sip_api_provider_unregister();
@@ -35351,11 +35351,11 @@ static int unload_module(void)
* joinable. They can die on their own and remove themselves
* from the container thus resulting in a huge memory leak.
*/
- wait_count = 1000;
- while (ao2_container_count(threadt) && --wait_count) {
+ start = ast_tvnow();
+ while (ao2_container_count(threadt) && (ast_tvdiff_sec(ast_tvnow(), start) < 5)) {
sched_yield();
}
- if (!wait_count) {
+ if (ao2_container_count(threadt)) {
ast_debug(2, "TCP/TLS thread container did not become empty :(\n");
}