volatile bool g_running; uint64_t g_step_block; void info_impl(const char *restrict fmt, ...) { assert(fmt); printf("\033[1;34m[INFO]\033[0m "); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); printf("\n"); } void warn_impl(const char *restrict fmt, ...) { assert(fmt); printf("\033[1;33m[WARN]\033[0m "); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); printf("\n"); } void sig_handler(int signo) { (void)signo; if (g_running) { g_warn("Signal received, will stop simulator soon..."); g_running = false; } } void step_block() { 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; } g_info("Simulator running on step '%#lx'", g_steps); } int main() { g_info = info_impl; g_warn = warn_impl; #if defined(COMMAND_NEW) salis_init(); #elif defined(COMMAND_LOAD) salis_load(); #endif g_running = true; g_step_block = 1; signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); while (g_running) { step_block(); } g_info("Saving simulation..."); salis_save(SIM_PATH); salis_free(); g_info("Exiting salis..."); return 0; }