From 9941b34dd8356fde826936d52453f6ad7fe132b5 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Tue, 2 Nov 2004 21:56:01 +0000
Subject: [PATCH] Fix locking issues

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4148 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 pbx/pbx_dundi.c | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c
index 8b583ef71a..a9a295323c 100755
--- a/pbx/pbx_dundi.c
+++ b/pbx/pbx_dundi.c
@@ -3183,22 +3183,50 @@ static int dundi_query(struct dundi_transaction *trans)
 static int discover_transactions(struct dundi_request *dr)
 {
 	struct dundi_transaction *trans;
+	ast_mutex_lock(&peerlock);
 	trans = dr->trans;
 	while(trans) {
 		dundi_discover(trans);
 		trans = trans->next;
 	}
+	ast_mutex_unlock(&peerlock);
 	return 0;
 }
 
 static int precache_transactions(struct dundi_request *dr, struct dundi_mapping *maps, int mapcount, int *expiration, int *foundanswers)
 {
-	struct dundi_transaction *trans;
+	struct dundi_transaction *trans, *transn;
+	/* Mark all as "in thread" so they don't disappear */
+	ast_mutex_lock(&peerlock);
 	trans = dr->trans;
 	while(trans) {
-		precache_trans(trans, maps, mapcount, expiration, foundanswers);
+		if (trans->thread)
+			ast_log(LOG_WARNING, "This shouldn't happen, really...\n");
+		trans->thread = 1;
 		trans = trans->next;
 	}
+	ast_mutex_unlock(&peerlock);
+
+	trans = dr->trans;
+	while(trans) {
+		if (!(trans->flags & FLAG_DEAD))
+			precache_trans(trans, maps, mapcount, expiration, foundanswers);
+		trans = trans->next;
+	}
+
+	/* Cleanup any that got destroyed in the mean time */
+	ast_mutex_lock(&peerlock);
+	trans = dr->trans;
+	while(trans) {
+		transn = trans->next;
+		trans->thread = 0;
+		if (trans->flags & FLAG_DEAD) {
+			ast_log(LOG_DEBUG, "Our transaction went away!\n");
+			destroy_trans(trans, 0);
+		}
+		trans = transn;
+	}
+	ast_mutex_unlock(&peerlock);
 	return 0;
 }
 
-- 
GitLab