From f461f65dea636c74632abf5e6e6f66e56b387ac9 Mon Sep 17 00:00:00 2001 From: Martin Tomec Date: Fri, 9 Dec 2016 19:23:37 +0100 Subject: app_queue: Ensure member is removed from pending when hanging up. In some cases member is added to pending_members, and the channel is hung up before any extension state change. So the member would stay in pending_members forever. So when we call do_hang, we should also remove member from pending. ASTERISK-26621 #close Change-Id: Iae476b5c06481db18ebe0fa594b3e80fdc9a7d54 --- apps/app_queue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/app_queue.c b/apps/app_queue.c index 0abd512fa..9176f9360 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2351,6 +2351,7 @@ static int pending_members_cmp(void *obj, void *arg, int flags) static void pending_members_remove(struct member *mem) { + ast_debug(3, "Removed %s from pending_members\n", mem->membername); ao2_find(pending_members, mem, OBJ_POINTER | OBJ_NODATA | OBJ_UNLINK); } @@ -4207,6 +4208,7 @@ static void do_hang(struct callattempt *o) { o->stillgoing = 0; ast_hangup(o->chan); + pending_members_remove(o->member); o->chan = NULL; } @@ -4287,6 +4289,7 @@ static int can_ring_entry(struct queue_ent *qe, struct callattempt *call) * If not found add it to the container so another queue * won't attempt to call this member at the same time. */ + ast_debug(3, "Add %s to pending_members\n", call->member->membername); ao2_link(pending_members, call->member); ao2_unlock(pending_members); @@ -4422,7 +4425,6 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies /* Again, keep going even if there's an error */ ast_verb(3, "Couldn't call %s\n", tmp->interface); do_hang(tmp); - pending_members_remove(tmp->member); ++*busies; return 0; } -- cgit v1.2.3