automerge commit

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@34192 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Automerge script
2006-06-14 23:11:07 +00:00
parent 05c3bd0de5
commit 4d1ed8bde0
2 changed files with 95 additions and 110 deletions

View File

@@ -472,8 +472,7 @@ static void *changethread(void *data)
technology = ast_strdupa(sc->dev);
loc = strchr(technology, '/');
if (loc) {
*loc = '\0';
loc++;
*loc++ = '\0';
} else {
free(sc);
return NULL;
@@ -486,43 +485,44 @@ static void *changethread(void *data)
}
AST_LIST_UNLOCK(&interfaces);
if (curint) {
if (option_debug)
ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
ast_mutex_lock(&qlock);
for (q = queues; q; q = q->next) {
ast_mutex_lock(&q->lock);
cur = q->members;
while(cur) {
if (!strcasecmp(sc->dev, cur->interface)) {
if (cur->status != sc->state) {
cur->status = sc->state;
if (!q->maskmemberstatus) {
manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
"Queue: %s\r\n"
"Location: %s\r\n"
"Membership: %s\r\n"
"Penalty: %d\r\n"
"CallsTaken: %d\r\n"
"LastCall: %d\r\n"
"Status: %d\r\n"
"Paused: %d\r\n",
q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
}
}
}
cur = cur->next;
}
ast_mutex_unlock(&q->lock);
}
ast_mutex_unlock(&qlock);
} else {
if (!curint) {
if (option_debug)
ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", technology, loc, sc->state, devstate2str(sc->state));
free(sc);
return NULL;
}
free(sc);
if (option_debug)
ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
ast_mutex_lock(&qlock);
for (q = queues; q; q = q->next) {
ast_mutex_lock(&q->lock);
for (cur = q->members; cur; cur = cur->next) {
if (strcasecmp(sc->dev, cur->interface))
continue;
if (cur->status != sc->state) {
cur->status = sc->state;
if (q->maskmemberstatus)
continue;
manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
"Queue: %s\r\n"
"Location: %s\r\n"
"Membership: %s\r\n"
"Penalty: %d\r\n"
"CallsTaken: %d\r\n"
"LastCall: %d\r\n"
"Status: %d\r\n"
"Paused: %d\r\n",
q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
}
}
ast_mutex_unlock(&q->lock);
}
ast_mutex_unlock(&qlock);
return NULL;
}
@@ -534,17 +534,18 @@ static int statechange_queue(const char *dev, int state, void *ign)
pthread_t t;
pthread_attr_t attr;
sc = malloc(sizeof(struct statechange) + strlen(dev) + 1);
if (sc) {
sc->state = state;
strcpy(sc->dev, dev);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (ast_pthread_create(&t, &attr, changethread, sc)) {
ast_log(LOG_WARNING, "Failed to create update thread!\n");
free(sc);
}
if (!(sc = malloc(sizeof(*sc) + strlen(dev) + 1)))
return 0;
sc->state = state;
strcpy(sc->dev, dev);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (ast_pthread_create(&t, &attr, changethread, sc)) {
ast_log(LOG_WARNING, "Failed to create update thread!\n");
free(sc);
}
return 0;
}
@@ -620,7 +621,7 @@ static void clear_queue(struct ast_call_queue *q)
static int add_to_interfaces(char *interface)
{
struct ast_member_interfaces *curint, *newint;
struct ast_member_interfaces *curint;
if (!interface)
return 0;
@@ -631,19 +632,22 @@ static int add_to_interfaces(char *interface)
break;
}
if (!curint) {
if (option_debug)
ast_log(LOG_DEBUG, "Adding %s to the list of interfaces that make up all of our queue members.\n", interface);
if (curint) {
AST_LIST_UNLOCK(&interfaces);
return 0;
}
if ((newint = malloc(sizeof(*newint)))) {
memset(newint, 0, sizeof(*newint));
ast_copy_string(newint->interface, interface, sizeof(newint->interface));
AST_LIST_INSERT_HEAD(&interfaces, newint, list);
}
if (option_debug)
ast_log(LOG_DEBUG, "Adding %s to the list of interfaces that make up all of our queue members.\n", interface);
if ((curint = malloc(sizeof(*curint)))) {
memset(curint, 0, sizeof(*curint));
ast_copy_string(curint->interface, interface, sizeof(curint->interface));
AST_LIST_INSERT_HEAD(&interfaces, curint, list);
}
AST_LIST_UNLOCK(&interfaces);
return 0;
return 0;
}
static int interface_exists_global(char *interface)
@@ -658,13 +662,9 @@ static int interface_exists_global(char *interface)
ast_mutex_lock(&qlock);
for (q = queues; q && !ret; q = q->next) {
ast_mutex_lock(&q->lock);
mem = q->members;
while(mem) {
if (!strcasecmp(interface, mem->interface)) {
for (mem = q->members; mem && !ret; mem = mem->next) {
if (!strcasecmp(interface, mem->interface))
ret = 1;
break;
}
mem = mem->next;
}
ast_mutex_unlock(&q->lock);
}
@@ -673,7 +673,6 @@ static int interface_exists_global(char *interface)
return ret;
}
static int remove_from_interfaces(char *interface)
{
struct ast_member_interfaces *curint;
@@ -683,11 +682,14 @@ static int remove_from_interfaces(char *interface)
AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
if (!strcasecmp(curint->interface, interface) && !interface_exists_global(interface)) {
if (option_debug)
ast_log(LOG_DEBUG, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
AST_LIST_REMOVE_CURRENT(&interfaces, list);
free(curint);
if (!strcasecmp(curint->interface, interface)) {
if (!interface_exists_global(interface)) {
if (option_debug)
ast_log(LOG_DEBUG, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
AST_LIST_REMOVE_CURRENT(&interfaces, list);
free(curint);
}
break;
}
}
AST_LIST_TRAVERSE_SAFE_END;
@@ -701,14 +703,9 @@ static void clear_and_free_interfaces(void)
struct ast_member_interfaces *curint;
AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
AST_LIST_REMOVE_CURRENT(&interfaces, list);
while ((curint = AST_LIST_REMOVE_HEAD(&interfaces, list)))
free(curint);
}
AST_LIST_TRAVERSE_SAFE_END;
AST_LIST_UNLOCK(&interfaces);
return;
}
/*! \brief Configure a queue parameter.