Bug 7023 - reload should not unpause members

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@24706 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2
Tilghman Lesher 19 years ago
parent 092055c3a5
commit c7ee76b69f

@ -298,7 +298,8 @@ struct member {
int status; /*!< Status of queue member */ int status; /*!< Status of queue member */
int paused; /*!< Are we paused (not accepting calls)? */ int paused; /*!< Are we paused (not accepting calls)? */
time_t lastcall; /*!< When last successful call was hungup */ 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 */ struct member *next; /*!< Next member */
}; };
@ -3161,7 +3162,7 @@ static void reload_queues(void)
struct ast_config *cfg; struct ast_config *cfg;
char *cat, *tmp; char *cat, *tmp;
struct ast_variable *var; struct ast_variable *var;
struct member *prev, *cur; struct member *prev, *cur, *newm;
int new; int new;
char *general_val = NULL; char *general_val = NULL;
char interface[80]; char interface[80];
@ -3209,12 +3210,10 @@ static void reload_queues(void)
/* Re-initialize the queue, and clear statistics */ /* Re-initialize the queue, and clear statistics */
init_queue(q); init_queue(q);
clear_queue(q); clear_queue(q);
free_members(q, 0); for (cur = q->members; cur; cur = cur->next) {
prev = q->members; if (!cur->dynamic) {
if (prev) { cur->delme = 1;
/* find the end of any dynamic members */ }
while(prev->next)
prev = prev->next;
} }
var = ast_variable_browse(cfg, cat); var = ast_variable_browse(cfg, cat);
while (var) { while (var) {
@ -3230,19 +3229,52 @@ static void reload_queues(void)
} }
} else } else
penalty = 0; 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 (cur) {
if (prev) /* Delete it now */
prev->next = cur; newm->next = cur->next;
else if (prev) {
q->members = cur; prev->next = newm;
prev = cur; } else {
q->members = newm;
}
free(cur);
} else {
newm->next = q->members;
q->members = newm;
} }
} else { } else {
queue_set_param(q, var->name, var->value, var->lineno, 1); queue_set_param(q, var->name, var->value, var->lineno, 1);
} }
var = var->next; 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) if (!new)
ast_mutex_unlock(&q->lock); ast_mutex_unlock(&q->lock);
if (new) { if (new) {

Loading…
Cancel
Save