Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 332832) +++ apps/app_queue.c (working copy) @@ -1284,7 +1284,7 @@ static inline struct call_queue *queue_unref(struct call_queue *q) { ao2_ref(q, -1); - return q; + return NULL; } #endif @@ -2324,6 +2324,7 @@ return q; } +/*! \note Returns a reference to the loaded realtime queue. */ static struct call_queue *load_realtime_queue(const char *queuename) { struct ast_variable *queue_vars; @@ -2357,17 +2358,15 @@ } if (q) { prev_weight = q->weight ? 1 : 0; + queue_t_unref(q, "Need to find realtime queue"); } ao2_lock(queues); q = find_queue_by_name_rt(queuename, queue_vars, member_config); - if (member_config) { - ast_config_destroy(member_config); - } - if (queue_vars) { - ast_variables_destroy(queue_vars); - } + ast_config_destroy(member_config); + ast_variables_destroy(queue_vars); + /* update the use_weight value if the queue's has gained or lost a weight */ if (q) { if (!q->weight && prev_weight) { @@ -2471,6 +2470,7 @@ *reason = QUEUE_JOINEMPTY; ao2_unlock(q); ao2_unlock(queues); + queue_t_unref(q, "Done with realtime queue"); return res; } } @@ -2534,6 +2534,7 @@ } ao2_unlock(q); ao2_unlock(queues); + queue_t_unref(q, "Done with realtime queue"); return res; } @@ -6947,13 +6948,16 @@ * queues which have been deleted from realtime but which have not yet * been deleted from the in-core container */ - if (q->realtime && !(realtime_queue = load_realtime_queue(q->name))) { - ao2_unlock(q); - queue_t_unref(q, "Done with iterator"); - continue; - } else if (q->realtime) { + if (q->realtime) { + realtime_queue = load_realtime_queue(q->name); + if (!realtime_queue) { + ao2_unlock(q); + queue_t_unref(q, "Done with iterator"); + continue; + } queue_t_unref(realtime_queue, "Queue is already in memory"); } + if (argc == 3 && strcasecmp(q->name, argv[2])) { ao2_unlock(q); queue_t_unref(q, "Done with iterator"); @@ -8246,11 +8250,13 @@ i = ao2_iterator_init(queues, 0); while ((queue = ao2_iterator_next(&i))) { ao2_lock(queue); - if (queue->realtime && !(queue_realtime = load_realtime_queue(queue->name))) { - ao2_unlock(queue); - queue_unref(queue); - continue; - } else if (queue->realtime) { + if (queue->realtime) { + queue_realtime = load_realtime_queue(queue->name); + if (!queue_realtime) { + ao2_unlock(queue); + queue_unref(queue); + continue; + } queue_unref(queue_realtime); } @@ -8258,6 +8264,7 @@ ao2_unlock(queue); queue_unref(queue); } + ao2_iterator_destroy(&i); return 0; }