[Freeswitch-svn] [commit] r13047 - freeswitch/trunk/src/mod/applications/mod_fifo
FreeSWITCH SVN
anthm at freeswitch.org
Wed Apr 15 15:01:28 PDT 2009
Author: anthm
Date: Wed Apr 15 17:01:27 2009
New Revision: 13047
Log:
fix fifo issues
Modified:
freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c
Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c Wed Apr 15 17:01:27 2009
@@ -38,7 +38,7 @@
SWITCH_MODULE_DEFINITION(mod_fifo, mod_fifo_load, mod_fifo_shutdown, NULL);
#define FIFO_EVENT "fifo::info"
-
+#define FIFO_DELAY_DESTROY 100
static switch_status_t load_config(int reload, int del_all);
#define MAX_PRI 10
@@ -369,13 +369,16 @@
{
fifo_node_t *node;
int x = 0;
+ switch_memory_pool_t *pool;
if (!globals.running) {
return NULL;
}
- node = switch_core_alloc(globals.pool, sizeof(*node));
- node->pool = globals.pool;
+ switch_core_new_memory_pool(&pool);
+
+ node = switch_core_alloc(pool, sizeof(*node));
+ node->pool = pool;
node->name = switch_core_strdup(node->pool, name);
for (x = 0; x < MAX_PRI; x++) {
@@ -387,7 +390,9 @@
switch_thread_rwlock_create(&node->rwlock, node->pool);
switch_mutex_init(&node->mutex, SWITCH_MUTEX_NESTED, node->pool);
node->importance = importance;
+ switch_mutex_lock(globals.mutex);
switch_core_hash_insert(globals.fifo_hash, name, node);
+ switch_mutex_unlock(globals.mutex);
return node;
}
@@ -526,7 +531,7 @@
sql = switch_mprintf("select uuid, fifo_name, originate_string, simo_count, use_count, timeout, lag, "
"next_avail, expires, static, outbound_call_count, outbound_fail_count, hostname "
- "from fifo_outbound where (fifo_name = '%s') and (use_count < simo_count) and (next_avail = 0 or next_avail <= %ld) "
+ "from fifo_outbound where (fifo_name = '%q') and (use_count < simo_count) and (next_avail = 0 or next_avail <= %ld) "
"order by outbound_call_count", node->name, (long) switch_epoch_time_now(NULL));
switch_assert(sql);
@@ -747,6 +752,7 @@
}
}
+
if (!(node = switch_core_hash_find(globals.fifo_hash, nlist[i]))) {
node = create_node(nlist[i], importance);
}
@@ -963,12 +969,15 @@
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", cd.do_orbit ? "timeout" : "abort");
switch_event_fire(&event);
}
+
+ switch_mutex_lock(globals.mutex);
switch_mutex_lock(node->mutex);
node_remove_uuid(node, uuid);
node->caller_count--;
switch_core_hash_delete(node->caller_hash, uuid);
switch_mutex_unlock(node->mutex);
send_presence(node);
+ switch_mutex_unlock(globals.mutex);
}
@@ -1406,6 +1415,19 @@
}
done:
+
+ switch_mutex_lock(globals.mutex);
+ if (node && node->ready == FIFO_DELAY_DESTROY && node->consumer_count == 0 && node->caller_count == 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s removed. (delayed)\n", node->name);
+ switch_core_hash_delete(globals.fifo_hash, node->name);
+ switch_core_hash_destroy(&node->caller_hash);
+ switch_core_hash_destroy(&node->consumer_hash);
+ switch_thread_rwlock_unlock(node->rwlock);
+ switch_core_destroy_memory_pool(&node->pool);
+ }
+ switch_mutex_unlock(globals.mutex);
+
+
switch_channel_clear_app_flag(channel, CF_APP_TAGGED);
switch_core_media_bug_resume(session);
@@ -1460,7 +1482,9 @@
static int xml_outbound(switch_xml_t xml, fifo_node_t *node, char *container, char *tag, int cc_off, int verbose)
{
struct xml_helper h;
- char *sql = "select uuid, fifo_name, originate_string, simo_count, use_count, timeout, lag, next_avail, expires, static, outbound_call_count, outbound_fail_count, hostname from fifo_outbound";
+ char *sql = switch_mprintf("select uuid, fifo_name, originate_string, simo_count, use_count, timeout, "
+ "lag, next_avail, expires, static, outbound_call_count, outbound_fail_count, "
+ "hostname from fifo_outbound where fifo_name = '%q'", node->name);
h.xml = xml;
h.node = node;
@@ -1471,6 +1495,8 @@
fifo_execute_sql_callback(globals.sql_mutex, sql, xml_callback, &h);
+ switch_safe_free(sql);
+
return h.cc_off;
}
@@ -1763,12 +1789,14 @@
switch_hash_index_t *hi;
fifo_node_t *node;
void *val;
+ switch_mutex_lock(globals.mutex);
for (hi = switch_hash_first(NULL, globals.fifo_hash); hi; hi = switch_hash_next(hi)) {
switch_hash_this(hi, NULL, NULL, &val);
if ((node = (fifo_node_t *) val) && node->is_static) {
node->ready = 0;
}
}
+ switch_mutex_unlock(globals.mutex);
}
if (del_all) {
@@ -1869,6 +1897,8 @@
switch_hash_index_t *hi;
void *val, *pop;
fifo_node_t *node;
+ switch_mutex_lock(globals.mutex);
+ top:
for (hi = switch_hash_first(NULL, globals.fifo_hash); hi; hi = switch_hash_next(hi)) {
int x = 0;
switch_hash_this(hi, NULL, NULL, &val);
@@ -1877,8 +1907,8 @@
}
if (node_consumer_wait_count(node) || node->consumer_count || node_idle_consumers(node)) {
- node->ready = 1;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s not removed, still in use.\n", node->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s removal delayed, still in use.\n", node->name);
+ node->ready = FIFO_DELAY_DESTROY;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s removed.\n", node->name);
switch_thread_rwlock_wrlock(node->rwlock);
@@ -1887,12 +1917,16 @@
free(pop);
}
}
-
+
+ switch_core_hash_delete(globals.fifo_hash, node->name);
switch_core_hash_destroy(&node->caller_hash);
switch_core_hash_destroy(&node->consumer_hash);
switch_thread_rwlock_unlock(node->rwlock);
+ switch_core_destroy_memory_pool(&node->pool);
+ goto top;
}
}
+ switch_mutex_unlock(globals.mutex);
}
@@ -1924,7 +1958,8 @@
node->has_outbound = 1;
sql = switch_mprintf("insert into fifo_outbound "
- "(uuid, fifo_name, originate_string, simo_count, use_count, timeout, lag, next_avail, expires, static, outbound_call_count, outbound_fail_count, hostname) "
+ "(uuid, fifo_name, originate_string, simo_count, use_count, timeout, "
+ "lag, next_avail, expires, static, outbound_call_count, outbound_fail_count, hostname) "
"values ('%q','%q','%q',%d,%d,%d,%d,%d,%ld,0,0,0,'%q')",
digest, fifo_name, originate_string, simo_count, 0, timeout, lag, 0, (long)expires, globals.hostname
);
@@ -2088,7 +2123,7 @@
stop_node_thread();
}
-
+ top:
for (hi = switch_hash_first(NULL, globals.fifo_hash); hi; hi = switch_hash_next(hi)) {
int x = 0;
switch_hash_this(hi, NULL, NULL, &val);
@@ -2101,9 +2136,12 @@
}
}
+ switch_core_hash_delete(globals.fifo_hash, node->name);
switch_core_hash_destroy(&node->caller_hash);
switch_core_hash_destroy(&node->consumer_hash);
switch_thread_rwlock_unlock(node->rwlock);
+ switch_core_destroy_memory_pool(&node->pool);
+ goto top;
}
switch_core_hash_destroy(&globals.fifo_hash);
memset(&globals, 0, sizeof(globals));
More information about the Freeswitch-svn
mailing list