Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 407855) +++ apps/app_queue.c (working copy) @@ -8583,6 +8583,26 @@ struct ao2_iterator queue_iter; struct ao2_iterator mem_iter; + if (!ast_strlen_zero(queuefilter)) { /* specific queue */ + if ((q = find_load_queue_rt_friendly(queuefilter))) { + queue_t_unref(q, "Done with temporary pointer"); + } + } else if (ast_check_realtime("queues")) { + /* This block is to find any queues which are defined in realtime but + * which have not yet been added to the in-core container + */ + struct ast_config *cfg = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL); + char *queuename; + if (cfg) { + for (queuename = ast_category_browse(cfg, NULL); !ast_strlen_zero(queuename); queuename = ast_category_browse(cfg, queuename)) { + if ((q = find_load_queue_rt_friendly(queuename))) { + queue_t_unref(q, "Done with temporary pointer"); + } + } + ast_config_destroy(cfg); + } + } + astman_send_ack(s, m, "Queue summary will follow"); time(&now); if (!ast_strlen_zero(id)) { @@ -8590,7 +8610,22 @@ } queue_iter = ao2_iterator_init(queues, 0); while ((q = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) { + struct call_queue *realtime_queue = NULL; + ao2_lock(q); + /* This check is to make sure we don't send information for realtime + * queues which have been deleted from realtime but which have not yet + * been deleted from the in-core container. + */ + if (q->realtime) { + realtime_queue = find_load_queue_rt_friendly(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"); + } /* List queue properties */ if (ast_strlen_zero(queuefilter) || !strcmp(q->name, queuefilter)) { @@ -8658,6 +8693,26 @@ struct ao2_iterator queue_iter; struct ao2_iterator mem_iter; + if (!ast_strlen_zero(queuefilter)) { /* specific queue */ + if ((q = find_load_queue_rt_friendly(queuefilter))) { + queue_t_unref(q, "Done with temporary pointer"); + } + } else if (ast_check_realtime("queues")) { + /* This block is to find any queues which are defined in realtime but + * which have not yet been added to the in-core container + */ + struct ast_config *cfg = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL); + char *queuename; + if (cfg) { + for (queuename = ast_category_browse(cfg, NULL); !ast_strlen_zero(queuename); queuename = ast_category_browse(cfg, queuename)) { + if ((q = find_load_queue_rt_friendly(queuename))) { + queue_t_unref(q, "Done with temporary pointer"); + } + } + ast_config_destroy(cfg); + } + } + astman_send_ack(s, m, "Queue status will follow"); time(&now); if (!ast_strlen_zero(id)) { @@ -8666,7 +8721,22 @@ queue_iter = ao2_iterator_init(queues, 0); while ((q = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) { + struct call_queue *realtime_queue = NULL; + ao2_lock(q); + /* This check is to make sure we don't send information for realtime + * queues which have been deleted from realtime but which have not yet + * been deleted from the in-core container. + */ + if (q->realtime) { + realtime_queue = find_load_queue_rt_friendly(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"); + } /* List queue properties */ if (ast_strlen_zero(queuefilter) || !strcmp(q->name, queuefilter)) {