summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-07-14 09:45:10 -0300
committerJoshua Colp <jcolp@digium.com>2016-07-14 07:53:07 -0500
commit43b5f8d57ba8a052e2227fa855e16e4d0b077e30 (patch)
tree937027c7631b4dd918a02ef40d5f66f16bc50f14 /apps
parent56668e3e9cbaf4ff4a36138534d3e0c3e979b2cf (diff)
app_queue: Only remove queue member from pending when state changes.
It is possible for a not in use state change to occur multiple times causing a queue member to be removed from the pending call container prematurely. The first not in use state change will remove the queue member from the container. At this moment the member may be called and placed in the pending container. After this another not in use state change can be received which will remove it from the container. Despite being called at this point the code will incorrectly see that there are no pending calls to it. This change only removes it from the pending container if the state has actually changed. ASTERISK-26133 #close patches: app_queue.diff submitted by Richard Miller (license 5685) Change-Id: Ie5a7f17a44f98e9159e9b85009ce3f8393aa78c0
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 3d22f9821..7fd1c6c7d 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -2337,10 +2337,17 @@ static void pending_members_remove(struct member *mem)
*/
static void update_status(struct call_queue *q, struct member *m, const int status)
{
- m->status = status;
-
- /* Whatever the status is clear the member from the pending members pool */
- pending_members_remove(m);
+ if (m->status != status) {
+ m->status = status;
+
+ /* Remove the member from the pending members pool only when the status changes.
+ * This is not done unconditionally because we can occasionally see multiple
+ * device state notifications of not in use after a previous call has ended,
+ * including after we have initiated a new call. This is more likely to
+ * happen when there is latency in the connection to the member.
+ */
+ pending_members_remove(m);
+ }
queue_publish_member_blob(queue_member_status_type(), queue_member_blob_create(q, m));
}