#include bool g_running; uint64_t g_step_block; void sig_handler(int signo) { (void)signo; if (g_running) { log_warn("Signal received, will stop simulator soon..."); g_running = false; } } void step_block(void) { clock_t beg = clock(); salis_step(g_step_block - (g_steps % g_step_block)); clock_t end = clock(); if ((end - beg) < (CLOCKS_PER_SEC * 4)) { g_step_block <<= 1; } if ((end - beg) >= (CLOCKS_PER_SEC * 2) && g_step_block != 1) { g_step_block >>= 1; } float secs = (float)(end - beg) / (float)CLOCKS_PER_SEC; float steps_per_sec = (float)g_step_block / secs; log_info("Simulator running on step %#lx @%.1f steps/s", g_steps, steps_per_sec); } int main(void) { g_running = true; g_step_block = 1; signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); #if defined(COMMAND_NEW) salis_init(); #elif defined(COMMAND_LOAD) salis_load(); #endif while (g_running) { step_block(); } log_info("Saving simulation..."); salis_save(SIM_PATH); salis_free(); log_info("Exiting salis..."); return 0; }