]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 371313 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Wed, 15 Aug 2012 23:22:06 +0000 (23:22 +0000)
committerAutomerge script <automerge@asterisk.org>
Wed, 15 Aug 2012 23:22:06 +0000 (23:22 +0000)
file:///srv/subversion/repos/asterisk/branches/10

................
  r371313 | mmichelson | 2012-08-15 18:19:09 -0500 (Wed, 15 Aug 2012) | 20 lines

  Fix bug where final queue member would not be removed from memory.

  If a static queue had realtime members, then there could be a potential
  for those realtime members not to be properly deleted from memory.

  If the queue's members were loaded from realtime and then all the
  members were deleted from the backend, then the queue would still
  think these members existed. The reason was that there was a short-
  circuit in code such that if there were no members found in the
  backend, then the queue would not be updated to reflect this.

  Note that this only affected static queues with realtime members.
  Realtime queues with realtime members were unaffected by this issue.

  (closes issue ASTERISK-19793)
  reported by Marcus Haas
  ........

  Merged revisions 371306 from http://svn.asterisk.org/svn/asterisk/branches/1.8
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@371323 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index 3c486ca12dbf0a625866c1184b44d1f523db84f9..dcb48893eb0df0a5cd66ad0af26398d47a967287 100644 (file)
@@ -2466,8 +2466,19 @@ static void update_realtime_members(struct call_queue *q)
        struct ao2_iterator mem_iter;
 
        if (!(member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", q->name , SENTINEL))) {
-               /*This queue doesn't have realtime members*/
+               /* This queue doesn't have realtime members. If the queue still has any realtime
+                * members in memory, they need to be removed.
+                */
+               ao2_lock(q);
+               mem_iter = ao2_iterator_init(q->members, 0);
+               while ((m = ao2_iterator_next(&mem_iter))) {
+                       if (m->realtime) {
+                               ao2_unlink(q->members, m);
+                       }
+                       ao2_ref(m, -1);
+               }
                ast_debug(3, "Queue %s has no realtime members defined. No need for update\n", q->name);
+               ao2_unlock(q);
                return;
        }