mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-24 14:56:58 +00:00
automerge commit
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@24742 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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,15 +3210,13 @@ 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) {
|
||||||
if (!strcasecmp(var->name, "member")) {
|
if (!strcasecmp(var->name, "member")) {
|
||||||
/* Add a new member */
|
/* Add a new member */
|
||||||
ast_copy_string(interface, var->value, sizeof(interface));
|
ast_copy_string(interface, var->value, sizeof(interface));
|
||||||
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user