add some goodies to mod_fifo

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8028 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-04-04 21:37:53 +00:00
parent 5abcb22486
commit 1d03e2b814
1 changed files with 36 additions and 8 deletions

View File

@ -315,6 +315,11 @@ static void pres_event_handler(switch_event_t *event)
switch_safe_free(dup_to);
}
typedef enum {
STRAT_MORE_PPL,
STRAT_WAITING_LONGER,
} fifo_strategy_t;
#define MAX_NODES_PER_CONSUMER 25
#define FIFO_DESC "Fifo for stacking parked calls."
#define FIFO_USAGE "<fifo name> [in [<announce file>|undef] [<music file>|undef] | out [wait|nowait] [<announce file>|undef] [<music file>|undef]]"
@ -602,6 +607,20 @@ SWITCH_STANDARD_APP(fifo_function)
const char *fifo_consumer_wrapup_key = NULL;
const char *my_id;
char buf[5] = "";
const char *strat_str = switch_channel_get_variable(channel, "fifo_strategy");
fifo_strategy_t strat = STRAT_WAITING_LONGER;
if (!switch_strlen_zero(strat_str)) {
if (!strcasecmp(strat_str, "more_ppl")) {
strat = STRAT_MORE_PPL;
} else if (!strcasecmp(strat_str, "waiting_longer")) {
strat = STRAT_WAITING_LONGER;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invaid strategy\n");
return;
}
}
if (argc > 2) {
@ -631,7 +650,7 @@ SWITCH_STANDARD_APP(fifo_function)
}
switch_channel_answer(channel);
}
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Name", "%s", argv[0]);
@ -664,8 +683,8 @@ SWITCH_STANDARD_APP(fifo_function)
while(switch_channel_ready(channel)) {
int x = 0, winner = -1;
switch_time_t longest = 0xFFFFFFFFFFFFFFFF / 2;
uint32_t importance = 0;
uint32_t importance = 0, waiting = 0, most_waiting = 0;
pop = NULL;
if (moh && do_wait) {
@ -680,15 +699,24 @@ SWITCH_STANDARD_APP(fifo_function)
continue;
}
if (node_consumer_wait_count(node)) {
if (!importance && node->start_waiting < longest) {
longest = node->start_waiting;
winner = i;
if ((waiting = node_consumer_wait_count(node))) {
if (!importance || node->importance > importance) {
if (strat == STRAT_WAITING_LONGER) {
if (node->start_waiting < longest) {
longest = node->start_waiting;
winner = i;
}
} else {
if (waiting > most_waiting) {
most_waiting = waiting;
winner = i;
}
}
}
if (node->importance > importance) {
importance = node->importance;
winner = i;
}
}