summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2011-01-20 17:14:01 +0000
committerJeff Peeler <jpeeler@digium.com>2011-01-20 17:14:01 +0000
commita4fec286f81e4877b1736428a317d1dfc51fa9d9 (patch)
treeb8bd5a00ab700d56d06eeebaba4eecd249bab3f8 /apps
parent7e42378131440e44c9f93a4a054e3e96c3bdd469 (diff)
Merged revisions 303009 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r303009 | jpeeler | 2011-01-20 11:10:32 -0600 (Thu, 20 Jan 2011) | 21 lines Merged revisions 303008 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r303008 | jpeeler | 2011-01-20 11:07:44 -0600 (Thu, 20 Jan 2011) | 14 lines Merged revisions 303007 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r303007 | jpeeler | 2011-01-20 11:04:08 -0600 (Thu, 20 Jan 2011) | 8 lines Add new queue strategy to preserve behavior for when queue members moved to ao2. Add queue strategy called "rrordered" to mimic old behavior from when queue members were stored in a linked list. ABE-2707 ........ ................ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@303011 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 18e9942b5..6557edd50 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -680,7 +680,8 @@ enum {
QUEUE_STRATEGY_RANDOM,
QUEUE_STRATEGY_RRMEMORY,
QUEUE_STRATEGY_LINEAR,
- QUEUE_STRATEGY_WRANDOM
+ QUEUE_STRATEGY_WRANDOM,
+ QUEUE_STRATEGY_RRORDERED,
};
enum {
@@ -708,6 +709,7 @@ static const struct strategy {
{ QUEUE_STRATEGY_RRMEMORY, "roundrobin" },
{ QUEUE_STRATEGY_LINEAR, "linear" },
{ QUEUE_STRATEGY_WRANDOM, "wrandom"},
+ { QUEUE_STRATEGY_RRORDERED, "rrordered"},
};
static const struct autopause {
@@ -1538,7 +1540,7 @@ static void init_queue(struct call_queue *q)
q->autopause = QUEUE_AUTOPAUSE_OFF;
q->timeoutpriority = TIMEOUT_PRIORITY_APP;
if (!q->members) {
- if (q->strategy == QUEUE_STRATEGY_LINEAR)
+ if (q->strategy == QUEUE_STRATEGY_LINEAR || q->strategy == QUEUE_STRATEGY_RRORDERED)
/* linear strategy depends on order, so we have to place all members in a single bucket */
q->members = ao2_container_alloc(1, member_hash_fn, member_cmp_fn);
else
@@ -3909,6 +3911,7 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
}
tmp->metric += mem->penalty * 1000000 * usepenalty;
break;
+ case QUEUE_STRATEGY_RRORDERED:
case QUEUE_STRATEGY_RRMEMORY:
if (pos < q->rrpos) {
tmp->metric = 1000 + pos;
@@ -4231,7 +4234,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_set_flag(&(bridge_config.features_caller), AST_FEATURE_PARKCALL);
break;
case 'n':
- if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR)
+ if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR || qe->parent->strategy == QUEUE_STRATEGY_RRORDERED)
(*tries)++;
else
*tries = qe->parent->membercount;
@@ -4418,8 +4421,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
}
ast_channel_unlock(qe->chan);
ao2_lock(qe->parent);
- if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
+ if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_RRORDERED) {
store_next_rr(qe, outgoing);
+
}
if (qe->parent->strategy == QUEUE_STRATEGY_LINEAR) {
store_next_lin(qe, outgoing);