git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@2687 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2006-09-13 19:02:22 +00:00
parent 5c74acbabd
commit dc201d221e
1 changed files with 30 additions and 6 deletions

View File

@ -76,6 +76,8 @@ static struct {
int codec_rates_last;
unsigned int flags;
int fd;
int calls;
switch_mutex_t *mutex;
} globals;
struct private_object {
@ -468,6 +470,9 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
/* Move Channel's State Machine to RING */
switch_channel_set_state(channel, CS_RING);
switch_mutex_lock(globals.mutex);
globals.calls++;
switch_mutex_unlock(globals.mutex);
return SWITCH_STATUS_SUCCESS;
}
@ -538,6 +543,12 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CHANNEL HANGUP\n", switch_channel_get_name(channel));
switch_mutex_lock(globals.mutex);
globals.calls--;
if (globals.calls < 0) {
globals.calls = 0;
}
switch_mutex_unlock(globals.mutex);
return SWITCH_STATUS_SUCCESS;
}
@ -826,6 +837,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
return SWITCH_STATUS_TERM;
}
/* connect my internal structure to the blank pointer passed to me */
*module_interface = &channel_module_interface;
@ -849,7 +861,7 @@ static switch_status_t load_config(void)
switch_xml_t cfg, xml, settings, param;
memset(&globals, 0, sizeof(globals));
switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, module_pool);
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
return SWITCH_STATUS_TERM;
@ -929,15 +941,27 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void)
for (;;) {
if (running == -1) {
break;
}
/* Wait for an event. */
if ((iaxevent = iax_get_event(-1)) == NULL) {
//switch_yield(100);
//continue;
break;
if ((iaxevent = iax_get_event(0)) == NULL) {
int waitlen = 0;
if (globals.calls == 0) {
waitlen = 10000;
} else if (globals.calls == 1) {
waitlen = 1000;
} else if (globals.calls < 10) {
waitlen = 100;
} else {
waitlen = 10;
}
switch_yield(waitlen);
continue;
} else {
struct private_object *tech_pvt = iax_get_private(iaxevent->session);