SCF_USE_AUTO_NAT = (1 << 6),
SCF_EARLY_HANGUP = (1 << 7),
SCF_CALIBRATE_CLOCK = (1 << 8),
- SCF_USE_COND_TIMING = (1 << 9),
+ SCF_USE_HEAVY_TIMING = (1 << 9),
SCF_USE_CLOCK_RT = (1 << 10)
} switch_core_flag_enum_t;
typedef uint32_t switch_core_flag_t;
"\t-hp -- enable high priority settings\n"
"\t-vg -- run under valgrind\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-nocal -- disable clock calibration\n"
"\t-nort -- disable clock clock_realtime\n"
known_opt++;
}
- if (local_argv[x] && !strcmp(local_argv[x], "-vm")) {
- flags |= SCF_USE_COND_TIMING;
+ if (local_argv[x] && !strcmp(local_argv[x], "-heavy-timer")) {
+ flags |= SCF_USE_HEAVY_TIMING;
known_opt++;
}
switch_log_init(runtime.memory_pool, runtime.colorize_console);
+ runtime.tipping_point = 1500;
+ runtime.timer_affinity = -1;
switch_load_core_config("switch.conf");
switch_rtp_init(runtime.memory_pool);
runtime.running = 1;
- runtime.tipping_point = 1000000;
- runtime.timer_affinity = -1;
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);
static int OFFSET = 0;
-static int COND = 0;
+static int COND = 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_MIC = 10000;
static uint32_t TICK_PER_SEC = 1000;
-
static int MS_PER_TICK = 10;
+#endif
static switch_memory_pool_t *module_pool = NULL;
int32_t STARTED;
int32_t use_cond_yield;
switch_mutex_t *mutex;
+ uint32_t timer_count;
} globals;
#ifdef WIN32
SWITCH_DECLARE(void) switch_cond_next(void)
{
- if (session_manager.session_count > runtime.tipping_point) {
+ if (globals.timer_count >= runtime.tipping_point) {
os_yield();
return;
}
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;
}
while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) {
check_roll();
- if (session_manager.session_count > runtime.tipping_point) {
+ if (globals.timer_count >= runtime.tipping_point) {
os_yield();
+ globals.use_cond_yield = 0;
} else {
if (globals.use_cond_yield == 1) {
switch_mutex_lock(TIMER_MATRIX[cond_index].mutex);
if (private_info) {
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;
}
rev_errs = 0;
}
- if (session_manager.session_count > runtime.tipping_point) {
+ if (globals.timer_count >= runtime.tipping_point) {
os_yield();
} else {
do_sleep(1000);
switch_time_set_nanosleep(SWITCH_FALSE);
}
- if (switch_test_flag((&runtime), SCF_USE_COND_TIMING)) {
- switch_time_set_cond_yield(SWITCH_TRUE);
+ if (switch_test_flag((&runtime), SCF_USE_HEAVY_TIMING)) {
+ switch_time_set_cond_yield(SWITCH_FALSE);
}
if (switch_test_flag((&runtime), SCF_CALIBRATE_CLOCK)) {