diff --git a/apps/app_queue.c b/apps/app_queue.c index da24c51d62a02d9254e29f95a7a06beeaf2a8f9a..344e9c1a5b508867871f8105299054f5a098a7cc 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -9206,33 +9206,22 @@ static void reload_single_queue(struct ast_config *cfg, struct ast_flags *mask, queue_t_unref(q, "Expiring creation reference"); } -static int remove_members_and_mark_unfound(void *obj, void *arg, int flags) +static int mark_unfound(void *obj, void *arg, int flags) { struct call_queue *q = obj; char *queuename = arg; if (!q->realtime && (ast_strlen_zero(queuename) || !strcasecmp(queuename, q->name))) { q->found = 0; - } return 0; } -static int mark_dead_and_unfound(void *obj, void *arg, int flags) +static int kill_if_unfound(void *obj, void *arg, int flags) { struct call_queue *q = obj; char *queuename = arg; - if (!q->realtime && (ast_strlen_zero(queuename) || !strcasecmp(queuename, q->name))) { + if (!q->realtime && !q->found && (ast_strlen_zero(queuename) || !strcasecmp(queuename, q->name))) { q->dead = 1; - q->found = 0; - } - return 0; -} - -static int kill_dead_queues(void *obj, void *arg, int flags) -{ - struct call_queue *q = obj; - char *queuename = arg; - if ((ast_strlen_zero(queuename) || !strcasecmp(queuename, q->name)) && q->dead) { return CMP_MATCH; } else { return 0; @@ -9257,7 +9246,6 @@ static int reload_queues(int reload, struct ast_flags *mask, const char *queuena char *cat; struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; const int queue_reload = ast_test_flag(mask, QUEUE_RELOAD_PARAMETERS); - const int member_reload = ast_test_flag(mask, QUEUE_RELOAD_MEMBER); if (!(cfg = ast_config_load("queues.conf", config_flags))) { ast_log(LOG_NOTICE, "No call queueing config file (queues.conf), so no call queues\n"); @@ -9272,18 +9260,10 @@ static int reload_queues(int reload, struct ast_flags *mask, const char *queuena /* We've made it here, so it looks like we're doing operations on all queues. */ ao2_lock(queues); - /* Mark all queues as dead for the moment if we're reloading queues. - * For clarity, we could just be reloading members, in which case we don't want to mess - * with the other queue parameters at all*/ - if (queue_reload) { - ao2_callback(queues, OBJ_NODATA | OBJ_NOLOCK, mark_dead_and_unfound, (char *) queuename); - } - - if (member_reload) { - ao2_callback(queues, OBJ_NODATA, remove_members_and_mark_unfound, (char *) queuename); - } + /* Mark non-realtime queues not found at the beginning. */ + ao2_callback(queues, OBJ_NODATA, mark_unfound, (char *) queuename); - /* Chug through config file */ + /* Chug through config file. */ cat = NULL; while ((cat = ast_category_browse(cfg, cat)) ) { if (!strcasecmp(cat, "general") && queue_reload) { @@ -9295,9 +9275,9 @@ static int reload_queues(int reload, struct ast_flags *mask, const char *queuena } ast_config_destroy(cfg); - /* Unref all the dead queues if we were reloading queues */ if (queue_reload) { - ao2_callback(queues, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK | OBJ_NOLOCK, kill_dead_queues, (char *) queuename); + /* Unlink and mark dead all non-realtime queues that were not found in the configuration file. */ + ao2_callback(queues, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK | OBJ_NOLOCK, kill_if_unfound, (char *) queuename); } ao2_unlock(queues); return 0;