1
0
mirror of https://github.com/signalwire/freeswitch.git synced 2025-03-05 18:13:27 +00:00

compromising on timing code, remove -vm and make it default, make new -heavy-timing for previous default, change tipping-point to work of count of active timers rather than sessions, this should statisfy the droves of 'I wish it worked like 1.0.4 people'

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16853 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2010-03-01 19:25:27 +00:00
parent 58d3816e9c
commit 717308a3cf
4 changed files with 39 additions and 13 deletions

@ -246,7 +246,7 @@ typedef enum {
SCF_USE_AUTO_NAT = (1 << 6), SCF_USE_AUTO_NAT = (1 << 6),
SCF_EARLY_HANGUP = (1 << 7), SCF_EARLY_HANGUP = (1 << 7),
SCF_CALIBRATE_CLOCK = (1 << 8), SCF_CALIBRATE_CLOCK = (1 << 8),
SCF_USE_COND_TIMING = (1 << 9), SCF_USE_HEAVY_TIMING = (1 << 9),
SCF_USE_CLOCK_RT = (1 << 10) SCF_USE_CLOCK_RT = (1 << 10)
} switch_core_flag_enum_t; } switch_core_flag_enum_t;
typedef uint32_t switch_core_flag_t; typedef uint32_t switch_core_flag_t;

@ -330,7 +330,7 @@ int main(int argc, char *argv[])
"\t-hp -- enable high priority settings\n" "\t-hp -- enable high priority settings\n"
"\t-vg -- run under valgrind\n" "\t-vg -- run under valgrind\n"
"\t-nosql -- disable internal sql scoreboard\n" "\t-nosql -- disable internal sql scoreboard\n"
"\t-vm -- use possibly more vm-friendly timing code.\n" "\t-heavy-timer -- Heavy Timer, possibly more accurate but at a cost\n"
"\t-nonat -- disable auto nat detection\n" "\t-nonat -- disable auto nat detection\n"
"\t-nocal -- disable clock calibration\n" "\t-nocal -- disable clock calibration\n"
"\t-nort -- disable clock clock_realtime\n" "\t-nort -- disable clock clock_realtime\n"
@ -485,8 +485,8 @@ int main(int argc, char *argv[])
known_opt++; known_opt++;
} }
if (local_argv[x] && !strcmp(local_argv[x], "-vm")) { if (local_argv[x] && !strcmp(local_argv[x], "-heavy-timer")) {
flags |= SCF_USE_COND_TIMING; flags |= SCF_USE_HEAVY_TIMING;
known_opt++; known_opt++;
} }

@ -1286,6 +1286,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
switch_log_init(runtime.memory_pool, runtime.colorize_console); switch_log_init(runtime.memory_pool, runtime.colorize_console);
runtime.tipping_point = 1500;
runtime.timer_affinity = -1;
switch_load_core_config("switch.conf"); switch_load_core_config("switch.conf");
@ -1300,8 +1302,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
switch_rtp_init(runtime.memory_pool); switch_rtp_init(runtime.memory_pool);
runtime.running = 1; runtime.running = 1;
runtime.tipping_point = 1000000;
runtime.timer_affinity = -1;
runtime.initiated = switch_time_now(); runtime.initiated = switch_time_now();
switch_scheduler_add_task(switch_epoch_time_now(NULL), heartbeat_callback, "heartbeat", "core", 0, NULL, SSHF_NONE | SSHF_NO_DEL); switch_scheduler_add_task(switch_epoch_time_now(NULL), heartbeat_callback, "heartbeat", "core", 0, NULL, SSHF_NONE | SSHF_NO_DEL);

@ -63,15 +63,22 @@ static int NANO = 0;
static int OFFSET = 0; static int OFFSET = 0;
static int COND = 0; static int COND = 1;
static int MATRIX = 1; static int MATRIX = 1;
#define ONEMS
#ifdef ONEMS
static int STEP_MS = 1;
static int STEP_MIC = 1000;
static uint32_t TICK_PER_SEC = 10000;
static int MS_PER_TICK = 1;
#else
static int STEP_MS = 10; static int STEP_MS = 10;
static int STEP_MIC = 10000; static int STEP_MIC = 10000;
static uint32_t TICK_PER_SEC = 1000; static uint32_t TICK_PER_SEC = 1000;
static int MS_PER_TICK = 10; static int MS_PER_TICK = 10;
#endif
static switch_memory_pool_t *module_pool = NULL; static switch_memory_pool_t *module_pool = NULL;
@ -80,6 +87,7 @@ static struct {
int32_t STARTED; int32_t STARTED;
int32_t use_cond_yield; int32_t use_cond_yield;
switch_mutex_t *mutex; switch_mutex_t *mutex;
uint32_t timer_count;
} globals; } globals;
#ifdef WIN32 #ifdef WIN32
@ -375,7 +383,7 @@ SWITCH_DECLARE(void) switch_sleep(switch_interval_time_t t)
SWITCH_DECLARE(void) switch_cond_next(void) SWITCH_DECLARE(void) switch_cond_next(void)
{ {
if (session_manager.session_count > runtime.tipping_point) { if (globals.timer_count >= runtime.tipping_point) {
os_yield(); os_yield();
return; return;
} }
@ -451,6 +459,13 @@ static switch_status_t timer_init(switch_timer_t *timer)
switch_time_sync(); switch_time_sync();
} }
switch_mutex_lock(globals.mutex);
globals.timer_count++;
if (globals.timer_count == (runtime.tipping_point + 1)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Crossed tipping point of %u, shifting into high-gear.\n", runtime.tipping_point);
}
switch_mutex_unlock(globals.mutex);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
@ -532,8 +547,9 @@ static switch_status_t timer_next(switch_timer_t *timer)
while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) { while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) {
check_roll(); check_roll();
if (session_manager.session_count > runtime.tipping_point) { if (globals.timer_count >= runtime.tipping_point) {
os_yield(); os_yield();
globals.use_cond_yield = 0;
} else { } else {
if (globals.use_cond_yield == 1) { if (globals.use_cond_yield == 1) {
switch_mutex_lock(TIMER_MATRIX[cond_index].mutex); switch_mutex_lock(TIMER_MATRIX[cond_index].mutex);
@ -594,6 +610,16 @@ static switch_status_t timer_destroy(switch_timer_t *timer)
if (private_info) { if (private_info) {
private_info->ready = 0; private_info->ready = 0;
} }
switch_mutex_lock(globals.mutex);
if (globals.timer_count) {
globals.timer_count--;
if (globals.timer_count == (runtime.tipping_point - 1)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Fell Below tipping point of %u, shifting into low-gear.\n", runtime.tipping_point);
}
}
switch_mutex_unlock(globals.mutex);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
@ -676,7 +702,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime)
rev_errs = 0; rev_errs = 0;
} }
if (session_manager.session_count > runtime.tipping_point) { if (globals.timer_count >= runtime.tipping_point) {
os_yield(); os_yield();
} else { } else {
do_sleep(1000); do_sleep(1000);
@ -987,8 +1013,8 @@ SWITCH_MODULE_LOAD_FUNCTION(softtimer_load)
switch_time_set_nanosleep(SWITCH_FALSE); switch_time_set_nanosleep(SWITCH_FALSE);
} }
if (switch_test_flag((&runtime), SCF_USE_COND_TIMING)) { if (switch_test_flag((&runtime), SCF_USE_HEAVY_TIMING)) {
switch_time_set_cond_yield(SWITCH_TRUE); switch_time_set_cond_yield(SWITCH_FALSE);
} }
if (switch_test_flag((&runtime), SCF_CALIBRATE_CLOCK)) { if (switch_test_flag((&runtime), SCF_CALIBRATE_CLOCK)) {