diff options
author | root <root@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-14 23:11:07 +0000 |
---|---|---|
committer | root <root@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-14 23:11:07 +0000 |
commit | 4e719b4078676930cb7f6030a56228fde3f33b79 (patch) | |
tree | 85f8d0e110f7e70fbfaef083d37d41b88e2d6d8e /apps | |
parent | dc25b6fd37bd40faa8eaf78ec8767ef66761dcec (diff) |
automerge commit
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@34192 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_queue.c | 145 |
1 files changed, 71 insertions, 74 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index 6e943f31b..2dc750eb1 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -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. |