mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-25 07:01:09 +00:00
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
This commit is contained in:
committed by
Martin Tomec
parent
147b8e636e
commit
f461f65dea
@@ -2351,6 +2351,7 @@ static int pending_members_cmp(void *obj, void *arg, int flags)
|
|||||||
|
|
||||||
static void pending_members_remove(struct member *mem)
|
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);
|
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;
|
o->stillgoing = 0;
|
||||||
ast_hangup(o->chan);
|
ast_hangup(o->chan);
|
||||||
|
pending_members_remove(o->member);
|
||||||
o->chan = NULL;
|
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
|
* If not found add it to the container so another queue
|
||||||
* won't attempt to call this member at the same time.
|
* 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_link(pending_members, call->member);
|
||||||
ao2_unlock(pending_members);
|
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 */
|
/* Again, keep going even if there's an error */
|
||||||
ast_verb(3, "Couldn't call %s\n", tmp->interface);
|
ast_verb(3, "Couldn't call %s\n", tmp->interface);
|
||||||
do_hang(tmp);
|
do_hang(tmp);
|
||||||
pending_members_remove(tmp->member);
|
|
||||||
++*busies;
|
++*busies;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user