diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/salis.c | 89 | ||||
| -rw-r--r-- | core/sql.c | 49 |
2 files changed, 68 insertions, 70 deletions
diff --git a/core/salis.c b/core/salis.c index ed96944..f6d259f 100644 --- a/core/salis.c +++ b/core/salis.c @@ -26,7 +26,6 @@ #define UINT64_HALF 0x8000000000000000ul #if defined(DATA_PUSH) -#define DATA_PUSH_BUSY_TIMEOUT 600000 #define EVENT_ARRAYS(core) \ EVENT_ARRAY(core, 0, aev) /* allocation events array */ \ EVENT_ARRAY(core, 1, eev) /* executions events array */ \ @@ -93,16 +92,20 @@ const struct Proc g_dead_proc; char g_asav_pbuf[AUTOSAVE_NAME_LEN]; #endif +// Each UI must install these logger functions before salis_init() gets invoked +void (*g_info)(const char *fmt, ...); +void (*g_warn)(const char *fmt, ...); + #if defined(DATA_PUSH) -sqlite3 *g_sim_data; +// Include custom SQL wrapper +// This is also used by the data-server +sqlite3 *g_sim_db; +#include "sql.c" + thrd_t g_eva_thrds[CORES][EVENT_ARRAYS_COUNT]; struct DeflateParams g_eva_deflate_params[CORES][EVENT_ARRAYS_COUNT]; #endif -// Each UI must install these logger functions before salis_init() gets invoked -void (*g_info)(const char *fmt, ...); -void (*g_warn)(const char *fmt, ...); - // Each architecture must define these functions #if defined(COMMAND_NEW) void arch_core_init(struct Core *core); @@ -730,63 +733,9 @@ void salis_auto_save(void) { #endif #if defined(DATA_PUSH) -void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) { - assert(sql_format); - - va_list args; - va_start(args, sql_format); - int sql_len = vsnprintf(NULL, 0, sql_format, args) + 1; - char *sql_str = malloc(sql_len); - assert(sql_str); - va_end(args); - - va_start(args, sql_format); - vsprintf(sql_str, sql_format, args); - va_end(args); - - FILE *temp = fopen("/tmp/salis.temp", "a"); - fprintf(temp, "EXECUTING SQL: %s\n", sql_str); - fclose(temp); - - int sql_res; - sqlite3_stmt *sql_stmt; - - sql_res = sqlite3_prepare_v2(g_sim_data, sql_str, -1, &sql_stmt, NULL); - assert(sql_res == SQLITE_OK); - free(sql_str); - - for (int i = 0; i < blob_cnt; ++i) { - assert(blobs[i]); - sql_res = sqlite3_bind_blob(sql_stmt, i + 1, blobs[i], blob_sizes[i], SQLITE_STATIC); - assert(sql_res == SQLITE_OK); - } - - // Only handle SQLITE_BUSY error, in which case we retry the query. - // Setting 'journal_mode=wal;' should help prevent busy database errors. - while (true) { - sql_res = sqlite3_step(sql_stmt); - - if (sql_res == SQLITE_DONE || sql_res == SQLITE_ROW) { - break; - } - - g_warn("SQLite database returned error %d with message:", sql_res); - g_warn(sqlite3_errmsg(g_sim_data)); - - if (sql_res == SQLITE_BUSY) { - g_info("Will retry query..."); - continue; - } - - assert(false); - } - - sqlite3_finalize(sql_stmt); -} - #if defined(COMMAND_NEW) void salis_push_data_header(void) { - assert(g_sim_data); + assert(g_sim_db); g_info("Creating core table in SQLite database"); salis_exec_sql( @@ -820,7 +769,7 @@ void salis_push_data_header(void) { #endif void salis_push_data_line(void) { - assert(g_sim_data); + assert(g_sim_db); // Measure average membory block sizes double amb0[CORES] = { 0 }; @@ -975,11 +924,11 @@ void salis_init(void) { #endif #if defined(DATA_PUSH) - sqlite3_open(DATA_PUSH_PATH, &g_sim_data); - assert(g_sim_data); + sqlite3_open(DATA_PUSH_PATH, &g_sim_db); + assert(g_sim_db); // Install busy handler to retry transactions if DB is locked - sqlite3_busy_timeout(g_sim_data, DATA_PUSH_BUSY_TIMEOUT); + sqlite3_busy_timeout(g_sim_db, DATA_PUSH_BUSY_TIMEOUT); // Enable Write-Ahead Logging (WAL) // This seems to help prevent DB locks when displaying live data. @@ -1046,11 +995,11 @@ void salis_load(void) { #endif #if defined(DATA_PUSH) - sqlite3_open(DATA_PUSH_PATH, &g_sim_data); - assert(g_sim_data); + sqlite3_open(DATA_PUSH_PATH, &g_sim_db); + assert(g_sim_db); // Install busy handler to retry transactions if DB is locked - sqlite3_busy_timeout(g_sim_data, DATA_PUSH_BUSY_TIMEOUT); + sqlite3_busy_timeout(g_sim_db, DATA_PUSH_BUSY_TIMEOUT); #endif } #endif @@ -1182,8 +1131,8 @@ void salis_step(uint64_t ns) { void salis_free(void) { #if defined(DATA_PUSH) - assert(g_sim_data); - sqlite3_close(g_sim_data); + assert(g_sim_db); + sqlite3_close(g_sim_db); #endif for (int i = 0; i < CORES; ++i) { diff --git a/core/sql.c b/core/sql.c new file mode 100644 index 0000000..a03ce5d --- /dev/null +++ b/core/sql.c @@ -0,0 +1,49 @@ +void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) { + assert(sql_format); + + va_list args; + va_start(args, sql_format); + int sql_len = vsnprintf(NULL, 0, sql_format, args) + 1; + char *sql_str = malloc(sql_len); + assert(sql_str); + va_end(args); + + va_start(args, sql_format); + vsprintf(sql_str, sql_format, args); + va_end(args); + + int sql_res; + sqlite3_stmt *sql_stmt; + + sql_res = sqlite3_prepare_v2(g_sim_db, sql_str, -1, &sql_stmt, NULL); + assert(sql_res == SQLITE_OK); + free(sql_str); + + for (int i = 0; i < blob_cnt; ++i) { + assert(blobs[i]); + sql_res = sqlite3_bind_blob(sql_stmt, i + 1, blobs[i], blob_sizes[i], SQLITE_STATIC); + assert(sql_res == SQLITE_OK); + } + + // Only handle SQLITE_BUSY error, in which case we retry the query. + // Setting 'journal_mode=wal;' should help prevent busy database errors. + while (true) { + sql_res = sqlite3_step(sql_stmt); + + if (sql_res == SQLITE_DONE || sql_res == SQLITE_ROW) { + break; + } + + g_warn("SQLite database returned error %d with message:", sql_res); + g_warn(sqlite3_errmsg(g_sim_db)); + + if (sql_res == SQLITE_BUSY) { + g_info("Will retry query..."); + continue; + } + + assert(false); + } + + sqlite3_finalize(sql_stmt); +} |
