\param val the command arguement (if needed)
\return 0 on success nonzero on error
*/
-SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, int32_t *val);
+SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void *val);
/*!
\brief Get the output console
SWITCH_DECLARE(void) switch_time_set_cond_yield(switch_bool_t enable);
SWITCH_DECLARE(uint32_t) switch_core_min_dtmf_duration(uint32_t duration);
SWITCH_DECLARE(uint32_t) switch_core_max_dtmf_duration(uint32_t duration);
+SWITCH_DECLARE(double) switch_core_min_idle_cpu(double new_limit);
+SWITCH_DECLARE(double) switch_core_idle_cpu(void);
SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration);
SWITCH_DECLARE(switch_status_t) switch_console_set_complete(const char *string);
SWITCH_DECLARE(switch_status_t) switch_console_set_alias(const char *string);
switch_core_session_ctl(SCSC_SPS, &sps);
stream->write_function(stream, "%d session(s) %d/%d\n", switch_core_session_count(), last_sps, sps);
stream->write_function(stream, "%d session(s) max\n", switch_core_session_limit(0));
+ stream->write_function(stream, "min idle cpu %0.2f/%0.2f\n", switch_core_min_idle_cpu(-1.0), switch_core_idle_cpu());
if (html) {
stream->write_function(stream, "</b>\n");
arg = atoi(argv[1]);
}
switch_core_session_ctl(SCSC_MAX_SESSIONS, &arg);
- stream->write_function(stream, "+OK max sessions: %d\n", arg);
+ stream->write_function(stream, "+OK max sessions: %f\n", arg);
+ } else if (!strcasecmp(argv[0], "min_idle_cpu")) {
+ double d = -1;
+
+ if (argc > 1) {
+ d = atof(argv[1]);
+ }
+
+ switch_core_session_ctl(SCSC_MIN_IDLE_CPU, &d);
+
+ if (d) {
+ stream->write_function(stream, "+OK min idle cpu: %0.2f%\n", d);
+ } else {
+ stream->write_function(stream, "+OK min idle cpu: DISABLED\n", d);
+ }
+
+
} else if (!strcasecmp(argv[0], "max_dtmf_duration")) {
if (argc > 1) {
arg = atoi(argv[1]);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Session-Count", "%u", switch_core_session_count());
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Session-Per-Sec", "%u", runtime.sps);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Session-Since-Startup", "%" SWITCH_SIZE_T_FMT, switch_core_session_id() - 1);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Idle-CPU", "%f", switch_core_idle_cpu());
switch_event_fire(&event);
}
}
switch_time_set_matrix(switch_true(var));
} else if (!strcasecmp(var, "max-sessions") && !zstr(val)) {
switch_core_session_limit(atoi(val));
+ } else if (!strcasecmp(var, "min-idle-cpu") && !zstr(val)) {
+ switch_core_min_idle_cpu(atof(val));
} else if (!strcasecmp(var, "tipping-point") && !zstr(val)) {
runtime.tipping_point = atoi(val);
} else if (!strcasecmp(var, "timer-affinity") && !zstr(val)) {
}
-SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, int32_t *val)
+SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void *val)
{
+ int *intval = (int *) val;
+
if (switch_test_flag((&runtime), SCF_SHUTTING_DOWN)) {
return -1;
}
break;
case SCSC_SYNC_CLOCK:
switch_time_sync();
- *val = 0;
+ *intval = 0;
break;
case SCSC_PAUSE_INBOUND:
- if (*val) {
+ if (*intval) {
switch_set_flag((&runtime), SCF_NO_NEW_SESSIONS);
} else {
switch_clear_flag((&runtime), SCF_NO_NEW_SESSIONS);
win_shutdown();
#endif
- if (*val) {
+ if (*intval) {
switch_set_flag((&runtime), SCF_RESTART);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Restarting\n");
} else {
win_shutdown();
#endif
- if (*val) {
+ if (*intval) {
switch_set_flag((&runtime), SCF_RESTART);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Restarting\n");
} else {
runtime.running = 0;
break;
case SCSC_CHECK_RUNNING:
- *val = runtime.running;
+ *intval = runtime.running;
break;
case SCSC_LOGLEVEL:
- if (*val > -1) {
- runtime.hard_log_level = *val;
+ if (*intval > -1) {
+ runtime.hard_log_level = *intval;
}
if (runtime.hard_log_level > SWITCH_LOG_DEBUG) {
runtime.hard_log_level = SWITCH_LOG_DEBUG;
}
- *val = runtime.hard_log_level;
+ *intval = runtime.hard_log_level;
break;
case SCSC_DEBUG_LEVEL:
- if (*val > -1) {
- if (*val > 10)
- *val = 10;
- runtime.debug_level = *val;
+ if (*intval > -1) {
+ if (*intval > 10)
+ *intval = 10;
+ runtime.debug_level = *intval;
+ }
+ *intval = runtime.debug_level;
+ break;
+ case SCSC_MIN_IDLE_CPU:
+ {
+ double *dval = (double *) val;
+ *dval = switch_core_min_idle_cpu(*dval);
}
- *val = runtime.debug_level;
break;
case SCSC_MAX_SESSIONS:
- *val = switch_core_session_limit(*val);
+ *intval = switch_core_session_limit(*intval);
break;
case SCSC_LAST_SPS:
- *val = runtime.sps_last;
+ *intval = runtime.sps_last;
break;
case SCSC_MAX_DTMF_DURATION:
- *val = switch_core_max_dtmf_duration(*val);
+ *intval = switch_core_max_dtmf_duration(*intval);
break;
case SCSC_MIN_DTMF_DURATION:
- *val = switch_core_min_dtmf_duration(*val);
+ *intval = switch_core_min_dtmf_duration(*intval);
break;
case SCSC_DEFAULT_DTMF_DURATION:
- *val = switch_core_default_dtmf_duration(*val);
+ *intval = switch_core_default_dtmf_duration(*intval);
break;
case SCSC_SPS:
switch_mutex_lock(runtime.throttle_mutex);
- if (*val > 0) {
- runtime.sps_total = *val;
+ if (*intval > 0) {
+ runtime.sps_total = *intval;
}
- *val = runtime.sps_total;
+ *intval = runtime.sps_total;
switch_mutex_unlock(runtime.throttle_mutex);
break;
case SCSC_RECLAIM:
switch_core_memory_reclaim_all();
- *val = 0;
+ *intval = 0;
break;
}
uint32_t x, tick = 0;
switch_time_t ts = 0, last = 0;
int fwd_errs = 0, rev_errs = 0;
+ int profile_tick = 0;
+
+ runtime.profile_timer = switch_new_profile_timer();
+ switch_get_system_idle_time(runtime.profile_timer, &runtime.profile_time);
#ifdef HAVE_CPU_SET_MACROS
if (runtime.timer_affinity > -1) {
tick += STEP_MS;
if (tick >= TICK_PER_SEC) {
+ if (++profile_tick == 1) {
+ switch_get_system_idle_time(runtime.profile_timer, &runtime.profile_time);
+ profile_tick = 0;
+ }
+
if (runtime.sps <= 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Over Session Rate of %d!\n", runtime.sps_total);
}
globals.RUNNING = 0;
switch_mutex_unlock(globals.mutex);
+ switch_delete_profile_timer(&runtime.profile_timer);
+
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Soft timer thread exiting.\n");
return SWITCH_STATUS_TERM;