aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_queue.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-04 16:27:20 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-04 16:27:20 +0000
commita9d8c976bb57a3075225870216dcc5c4f4a1bcd4 (patch)
tree3ddd9ee10e9b8f1cb244fb4d2c7e2c4a8a9230ad /apps/app_queue.c
parentddfb7d87eca04cf7c62a1c3a1aefae8dcb31559f (diff)
Bug 7023 - reload should not unpause members
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@24706 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r--apps/app_queue.c62
1 files changed, 47 insertions, 15 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 6889c6642..763febfa1 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -298,7 +298,8 @@ struct member {
int status; /*!< Status of queue member */
int paused; /*!< Are we paused (not accepting calls)? */
time_t lastcall; /*!< When last successful call was hungup */
- int dead; /*!< Used to detect members deleted in realtime */
+ unsigned int dead:1; /*!< Used to detect members deleted in realtime */
+ unsigned int delme:1; /*!< Flag to delete entry on reload */
struct member *next; /*!< Next member */
};
@@ -3161,7 +3162,7 @@ static void reload_queues(void)
struct ast_config *cfg;
char *cat, *tmp;
struct ast_variable *var;
- struct member *prev, *cur;
+ struct member *prev, *cur, *newm;
int new;
char *general_val = NULL;
char interface[80];
@@ -3209,15 +3210,13 @@ static void reload_queues(void)
/* Re-initialize the queue, and clear statistics */
init_queue(q);
clear_queue(q);
- free_members(q, 0);
- prev = q->members;
- if (prev) {
- /* find the end of any dynamic members */
- while(prev->next)
- prev = prev->next;
+ for (cur = q->members; cur; cur = cur->next) {
+ if (!cur->dynamic) {
+ cur->delme = 1;
+ }
}
var = ast_variable_browse(cfg, cat);
- while(var) {
+ while (var) {
if (!strcasecmp(var->name, "member")) {
/* Add a new member */
ast_copy_string(interface, var->value, sizeof(interface));
@@ -3230,19 +3229,52 @@ static void reload_queues(void)
}
} else
penalty = 0;
- cur = create_queue_member(interface, penalty, 0);
+
+ /* Find the old position in the list */
+ for (prev = NULL, cur = q->members; cur; prev = cur, cur = cur->next) {
+ if (!strcmp(cur->interface, interface)) {
+ break;
+ }
+ }
+
+ newm = create_queue_member(interface, penalty, cur ? cur->paused : 0);
+
if (cur) {
- if (prev)
- prev->next = cur;
- else
- q->members = cur;
- prev = cur;
+ /* Delete it now */
+ newm->next = cur->next;
+ if (prev) {
+ prev->next = newm;
+ } else {
+ q->members = newm;
+ }
+ free(cur);
+ } else {
+ newm->next = q->members;
+ q->members = newm;
}
} else {
queue_set_param(q, var->name, var->value, var->lineno, 1);
}
var = var->next;
}
+
+ /* Free remaining members marked as delme */
+ for (prev = NULL, newm = NULL, cur = q->members; cur; prev = cur, cur = cur->next) {
+ if (newm) {
+ free(newm);
+ newm = NULL;
+ }
+
+ if (cur->delme) {
+ if (prev) {
+ prev->next = cur->next;
+ newm = cur;
+ } else {
+ q->members = cur->next;
+ newm = cur;
+ }
+ }
+ }
if (!new)
ast_mutex_unlock(&q->lock);
if (new) {