aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/logger.c45
-rw-r--r--core/render.c91
-rw-r--r--core/salis.c159
3 files changed, 80 insertions, 215 deletions
diff --git a/core/logger.c b/core/logger.c
index 38ac8ed..e088c55 100644
--- a/core/logger.c
+++ b/core/logger.c
@@ -3,35 +3,44 @@
enum LogLevel {
LOG_INFO,
LOG_WARN,
- LOG_ERRO,
};
char g_log_buff[LOG_LINE_SIZE];
-void log_msg_to_buff(char *out, int size, enum LogLevel level, const char *format, va_list args) {
+void log_msg_to_buff(char *out, int size, enum LogLevel level, bool colored, const char *format, va_list args) {
assert(out);
assert(size);
- assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO);
+ assert(level == LOG_INFO || level == LOG_WARN);
assert(format);
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long msec = ts.tv_nsec / 1000000;
struct tm tm = *localtime(&ts.tv_sec);
- int pid = getpid();
+ pid_t pid = getpid();
char *level_str = NULL;
switch (level) {
case LOG_INFO: level_str = "INFO"; break;
case LOG_WARN: level_str = "WARN"; break;
- case LOG_ERRO: level_str = "ERRO"; break;
default: assert(false);
}
+ char *color_code = NULL;
+ if (colored) {
+ switch (level) {
+ case LOG_INFO: color_code = "\033[1;32m"; break;
+ case LOG_WARN: color_code = "\033[1;33m"; break;
+ default: assert(false);
+ }
+ }
+
+ // Imitate formatting style configured in 'salis.py'
int col = snprintf(
out,
size,
- "%d-%02d-%02d %02d:%02d:%02d.%03ld %d [%s] ",
+ "%s%d-%02d-%02d %02d:%02d:%02d,%03ld %07d [%s]%s ",
+ colored ? color_code : "",
tm.tm_year + 1900,
tm.tm_mon + 1,
tm.tm_mday,
@@ -40,17 +49,18 @@ void log_msg_to_buff(char *out, int size, enum LogLevel level, const char *forma
tm.tm_sec,
msec,
pid,
- level_str
+ level_str,
+ colored ? "\033[0m" : ""
);
vsnprintf(out + col, size - col, format, args);
}
-void log_msg(enum LogLevel level, const char *format, va_list args) {
- assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO);
+void log_msg(enum LogLevel level, bool colored, const char *format, va_list args) {
+ assert(level == LOG_INFO || level == LOG_WARN);
assert(format);
- log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, format, args);
+ log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, colored, format, args);
printf("\r%s\n", g_log_buff);
}
@@ -59,7 +69,7 @@ void log_info(const char *format, ...) {
va_list args;
va_start(args, format);
- log_msg(LOG_INFO, format, args);
+ log_msg(LOG_INFO, true, format, args);
va_end(args);
}
@@ -68,17 +78,6 @@ void log_warn(const char *format, ...) {
va_list args;
va_start(args, format);
- log_msg(LOG_WARN, format, args);
- va_end(args);
-}
-
-void log_erro(const char *format, ...) {
- assert(format);
-
- va_list args;
- va_start(args, format);
- log_msg(LOG_ERRO, format, args);
+ log_msg(LOG_WARN, true, format, args);
va_end(args);
-
- exit(1);
}
diff --git a/core/render.c b/core/render.c
deleted file mode 100644
index f42e821..0000000
--- a/core/render.c
+++ /dev/null
@@ -1,91 +0,0 @@
-#include <sqlite3ext.h>
-SQLITE_EXTENSION_INIT1
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <zlib.h>
-
-#include "compress.c"
-
-void eva_render(sqlite3_context *context, int argc, sqlite3_value **argv) {
- assert(context);
- assert(argc == 4);
- assert(argv);
-
- (void)argc;
-
- size_t left = (size_t)sqlite3_value_int(argv[0]);
-#if defined(MVEC_LOOP)
- left %= MVEC_SIZE;
-#endif
-
- size_t px_count = (size_t)sqlite3_value_int(argv[1]);
- size_t px_pow = (size_t)sqlite3_value_int(argv[2]);
- size_t px_res = 1 << px_pow;
-#if !defined(MVEC_LOOP)
-#if !defined(NDEBUG)
- size_t right = left + px_res * px_count;
-#endif
- assert(left < MVEC_SIZE);
- assert(right <= MVEC_SIZE);
-#endif
-
- const void *blob = sqlite3_value_blob(argv[3]);
- size_t blob_size = (size_t)sqlite3_value_bytes(argv[3]);
-
- // Inflate blob
- size_t out_size = sizeof(uint64_t) * px_count;
- uint64_t *eva = sqlite3_malloc(EVA_SIZE);
- uint64_t *out = sqlite3_malloc(out_size);
-
- struct InflateParams params = {
- .avail_in = blob_size,
- .size = EVA_SIZE,
- .in = (Bytef *)blob,
- .out = (Bytef *)eva,
- };
-
- salis_inflate(&params);
- salis_inflate_end(&params);
-
- // Render image
- for (size_t i = 0; i < px_count; i++) {
- out[i] = 0;
-
- for (size_t j = 0; j < px_res; j++) {
- size_t in_coord = left + i * px_res + j;
-#if defined(MVEC_LOOP)
- in_coord %= MVEC_SIZE;
-#endif
- out[i] += eva[in_coord];
- }
- }
-
- sqlite3_free(eva);
-
- // Transform rendered image into textual representation
- // A comma-separated list of hexadecimal integers
- char *csv = sqlite3_malloc(px_count * 17 + 1);
- char *ptr = csv;
-
- for (size_t i = 0; i < px_count; i++) {
- ptr += sprintf(ptr, "%lx ", out[i]);
- }
-
- *(--ptr) = '\0';
- sqlite3_free(out);
-
- sqlite3_result_text(context, csv, -1, sqlite3_free);
-}
-
-int sqlite3_render_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi) {
- assert(db);
- assert(pzErrMsg);
- assert(pApi);
-
- (void)pzErrMsg;
-
- SQLITE_EXTENSION_INIT2(pApi);
- return sqlite3_create_function(db, "eva_render", 4, SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS | SQLITE_UTF8, NULL, eva_render, NULL, NULL);
-}
diff --git a/core/salis.c b/core/salis.c
index 6a42bb3..135fa4a 100644
--- a/core/salis.c
+++ b/core/salis.c
@@ -1,20 +1,32 @@
#include <assert.h>
-#include <stdarg.h>
#include <stdbool.h>
-#include <stddef.h>
#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <threads.h>
-#define DATA_PUSH_BUSY_TIMEOUT 600000
+#if defined(DATA_PUSH)
+#include <sqlite3.h>
+#include <zlib.h>
+#endif
+
+#if defined(COMPRESS)
+#include <zlib.h>
+#endif
+
+#if defined(COMPRESS) || defined(DATA_PUSH)
+#include "compress.c"
+#endif
+
#define INST_CAP 0x80
#define INST_MASK 0x7f
#define IPC_FLAG 0x80
#define MALL_FLAG 0x80
#define UINT64_HALF 0x8000000000000000ul
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
+#define DATA_PUSH_BUSY_TIMEOUT 600000
#define EVENT_ARRAYS \
EVENT_ARRAY(0, aev) /* allocation events array */ \
EVENT_ARRAY(1, eev) /* executions events array */ \
@@ -22,10 +34,6 @@
#define EVENT_ARRAYS_COUNT 3
#endif
-#if defined(COMPRESS) || defined(DATA_PUSH_PATH)
-#include "compress.c"
-#endif
-
struct Proc {
#define PROC_FIELD(type, name) type name;
PROC_FIELDS
@@ -51,7 +59,7 @@ struct Core {
uint64_t *ivav;
uint8_t *iviv;
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
uint64_t emb0; // executions within mb0 counter
uint64_t emb1; // executions within mb1 counter
uint64_t eliv; // executions within not-owned live code counter (parasites)
@@ -61,12 +69,12 @@ struct Core {
EVENT_ARRAYS
#undef EVENT_ARRAY
-#define CORE_DATA_FIELD(type, name, suff) type name suff;
+#define CORE_DATA_FIELD(type, name) type name;
CORE_DATA_FIELDS
-#undef CORE_FIELD
+#undef CORE_DATA_FIELD
#endif
-#define CORE_FIELD(type, name, suff) type name suff;
+#define CORE_FIELD(type, name) type name;
CORE_FIELDS
#undef CORE_FIELD
@@ -81,11 +89,11 @@ uint64_t g_steps;
uint64_t g_syncs;
const struct Proc g_dead_proc;
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
char g_asav_pbuf[AUTOSAVE_NAME_LEN];
#endif
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
sqlite3 *g_sim_data;
thrd_t g_eva_thrds[CORES][EVENT_ARRAYS_COUNT];
struct DeflateParams g_eva_deflate_params[CORES][EVENT_ARRAYS_COUNT];
@@ -96,13 +104,13 @@ void (*g_info)(const char *fmt, ...);
void (*g_warn)(const char *fmt, ...);
// Each architecture must define these functions
-#if defined(COMMAND_BENCH) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW)
void arch_core_init(struct Core *core);
#endif
void arch_core_free(struct Core *core);
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
void arch_core_save(FILE *f, const struct Core *core);
#endif
@@ -127,12 +135,10 @@ void arch_validate_proc(const struct Core *core, uint64_t pix);
wchar_t arch_symbol(uint8_t inst);
const char *arch_mnemonic(uint8_t inst);
-#if defined(DATA_PUSH_PATH)
#if defined(COMMAND_NEW)
void arch_push_data_header(void);
#endif
void arch_push_data_line(void);
-#endif
// ----------------------------------------------------------------------------
// Memory vector functions
@@ -163,14 +169,15 @@ void mvec_alloc(struct Core *core, uint64_t addr) {
#if defined(MVEC_LOOP)
core->mvec[mvec_loop(addr)] |= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
// Record deallocation event
++core->aeva[mvec_loop(addr)];
#endif
#else
assert(addr < MVEC_SIZE);
core->mvec[addr] |= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+
+#if defined(DATA_PUSH)
// Record deallocation event
++core->aeva[addr];
#endif
@@ -184,14 +191,16 @@ void mvec_free(struct Core *core, uint64_t addr) {
#if defined(MVEC_LOOP)
core->mvec[mvec_loop(addr)] ^= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+
+#if defined(DATA_PUSH)
// Record deallocation event
++core->aeva[mvec_loop(addr)];
#endif
#else
assert(addr < MVEC_SIZE);
core->mvec[addr] ^= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+
+#if defined(DATA_PUSH)
// Record deallocation event
++core->aeva[addr];
#endif
@@ -283,6 +292,9 @@ bool mvec_is_proc_owner(const struct Core *core, uint64_t addr, uint64_t pix) {
uint64_t mvec_get_owner(const struct Core *core, uint64_t addr) {
assert(core);
+#if !defined(MVEC_LOOP)
+ assert(addr < MVEC_SIZE);
+#endif
assert(mvec_is_alloc(core, addr));
for (uint64_t pix = core->pfst; pix <= core->plst; ++pix) {
@@ -298,7 +310,7 @@ uint64_t mvec_get_owner(const struct Core *core, uint64_t addr) {
// ----------------------------------------------------------------------------
// Mutator functions
// ----------------------------------------------------------------------------
-#if defined(COMMAND_BENCH) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW)
uint64_t muta_smix(uint64_t *seed) {
assert(seed);
@@ -373,7 +385,7 @@ void proc_new(struct Core *core, const struct Proc *proc) {
core->plst++;
memcpy(&core->pvec[core->plst % core->pcap], proc, sizeof(struct Proc));
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
// Store birth event in database
uint64_t child_addr = arch_proc_mb0_addr(core, core->plst);
uint64_t child_size = arch_proc_mb0_size(core, core->plst);
@@ -420,7 +432,7 @@ struct Proc *proc_fetch(struct Core *core, uint64_t pix) {
// ----------------------------------------------------------------------------
// Core functions
// ----------------------------------------------------------------------------
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
void core_save(FILE *f, const struct Core *core) {
assert(f);
assert(core);
@@ -435,7 +447,7 @@ void core_save(FILE *f, const struct Core *core) {
fwrite(&core->pcur, sizeof(uint64_t), 1, f);
fwrite(&core->psli, sizeof(uint64_t), 1, f);
fwrite(&core->ivpt, sizeof(uint64_t), 1, f);
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
fwrite(&core->emb0, sizeof(uint64_t), 1, f);
fwrite(&core->emb1, sizeof(uint64_t), 1, f);
fwrite(&core->eliv, sizeof(uint64_t), 1, f);
@@ -446,7 +458,7 @@ void core_save(FILE *f, const struct Core *core) {
fwrite(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f);
fwrite(core->pvec, sizeof(struct Proc), core->pcap, f);
fwrite(core->mvec, sizeof(uint8_t), MVEC_SIZE, f);
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
#define EVENT_ARRAY(_, ev) \
fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f);
EVENT_ARRAYS
@@ -457,7 +469,7 @@ void core_save(FILE *f, const struct Core *core) {
}
#endif
-#if defined(COMMAND_BENCH) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW)
#if defined(ANC_BYTES)
void core_assemble_ancestor(struct Core *core) {
assert(core);
@@ -525,7 +537,7 @@ void core_load(FILE *f, struct Core *core) {
fread(&core->pcur, sizeof(uint64_t), 1, f);
fread(&core->psli, sizeof(uint64_t), 1, f);
fread(&core->ivpt, sizeof(uint64_t), 1, f);
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
fread(&core->emb0, sizeof(uint64_t), 1, f);
fread(&core->emb1, sizeof(uint64_t), 1, f);
fread(&core->eliv, sizeof(uint64_t), 1, f);
@@ -544,7 +556,7 @@ void core_load(FILE *f, struct Core *core) {
fread(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f);
fread(core->pvec, sizeof(struct Proc), core->pcap, f);
fread(core->mvec, sizeof(uint8_t), MVEC_SIZE, f);
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
#define EVENT_ARRAY(_, ev) \
fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f);
EVENT_ARRAYS
@@ -594,7 +606,7 @@ void core_step(struct Core *core) {
if (core->psli != 0) {
core_pull_ipcm(core);
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
// Save execution event locations in database
assert(mvec_proc_is_live(core, core->pcur));
@@ -649,7 +661,7 @@ void core_step(struct Core *core) {
// ----------------------------------------------------------------------------
// Main salis functions
// ----------------------------------------------------------------------------
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
void salis_save(const char *path) {
#if defined(COMPRESS)
size_t size = 0;
@@ -671,7 +683,6 @@ void salis_save(const char *path) {
#if defined(COMPRESS)
assert(size);
-
char *out = malloc(size);
assert(out);
@@ -713,12 +724,12 @@ void salis_auto_save(void) {
assert(rem >= 0);
assert(rem < AUTOSAVE_NAME_LEN);
- g_info("Saving simulation state on step '%#lx'", g_steps);
+ g_info("Saving simulation state on step %#lx", g_steps);
salis_save(g_asav_pbuf);
}
#endif
-#if defined(DATA_PUSH_PATH)
+#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);
@@ -755,7 +766,7 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con
break;
}
- g_warn("SQLite database returned error '%d' with message:", sql_res);
+ g_warn("SQLite database returned error %d with message:", sql_res);
g_warn(sqlite3_errmsg(g_sim_data));
if (sql_res == SQLITE_BUSY) {
@@ -768,14 +779,12 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con
sqlite3_finalize(sql_stmt);
}
-#endif
-#if defined(DATA_PUSH_PATH)
#if defined(COMMAND_NEW)
void salis_push_data_header(void) {
assert(g_sim_data);
- g_info("Creating 'general' table in SQLite database");
+ g_info("Creating general table in SQLite database");
salis_exec_sql(
0, NULL, NULL,
"create table general ("
@@ -810,7 +819,7 @@ void salis_push_data_header(void) {
default: assert(false);
}
- g_info("Creating '%s_%d' table in SQLite database", pref, i);
+ g_info("Creating %s_%d table in SQLite database", pref, i);
salis_exec_sql(
0, NULL, NULL,
"create table %s_%d ("
@@ -849,7 +858,7 @@ void salis_push_data_line(void) {
amb1[i] /= core->pnum;
}
- g_info("Pushing row to 'general' table in SQLite database");
+ g_info("Pushing row to general table in SQLite database");
salis_exec_sql(
0, NULL, NULL,
"insert into general ("
@@ -935,7 +944,7 @@ void salis_push_data_line(void) {
const void *blob = params->out;
int blob_size = params->strm.total_out;
- g_info("Pushing row to '%s_%d' table in SQLite database", pref, i);
+ g_info("Pushing row to %s_%d table in SQLite database", pref, i);
salis_exec_sql(
1, &blob, &blob_size,
"insert into %s_%d ("
@@ -981,7 +990,7 @@ void salis_push_data_line(void) {
}
#endif
-#if defined(COMMAND_BENCH) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW)
void salis_init(void) {
assert(g_info);
assert(g_warn);
@@ -996,7 +1005,7 @@ void salis_init(void) {
salis_auto_save();
#endif
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
sqlite3_open(DATA_PUSH_PATH, &g_sim_data);
assert(g_sim_data);
@@ -1067,7 +1076,7 @@ void salis_load(void) {
free(out);
#endif
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
sqlite3_open(DATA_PUSH_PATH, &g_sim_data);
assert(g_sim_data);
@@ -1135,13 +1144,13 @@ void salis_loop(uint64_t ns, uint64_t dt) {
salis_run_thread(dt);
salis_sync();
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
if (g_steps % AUTOSAVE_INTERVAL == 0) {
salis_auto_save();
}
#endif
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
if (g_steps % DATA_PUSH_INTERVAL == 0) {
salis_push_data_line();
}
@@ -1203,7 +1212,7 @@ void salis_step(uint64_t ns) {
}
void salis_free(void) {
-#if defined(DATA_PUSH_PATH)
+#if defined(DATA_PUSH)
assert(g_sim_data);
sqlite3_close(g_sim_data);
#endif
@@ -1233,58 +1242,6 @@ void salis_free(void) {
// ----------------------------------------------------------------------------
// UI
// ----------------------------------------------------------------------------
-#if defined(COMMAND_LOAD) || defined(COMMAND_NEW)
+#if defined(COMMAND_NEW) || defined(COMMAND_LOAD)
#include "ui.c"
#endif
-
-// ----------------------------------------------------------------------------
-// Benchmark
-// ----------------------------------------------------------------------------
-#if defined(COMMAND_BENCH)
-void log_impl(const char *format, ...) {
- va_list args;
- va_start(args, format);
- vprintf(format, args);
- va_end(args);
-}
-
-int main(void) {
- g_info = log_impl;
- g_warn = log_impl;
-
- g_info("Salis Benchmark Test\n\n");
-
- salis_init();
- salis_step(STEPS);
-
- g_info("seed => %#lx\n", SEED);
- g_info("g_steps => %#lx\n", g_steps);
- g_info("g_syncs => %#lx\n", g_syncs);
-
- for (int i = 0; i < CORES; ++i) {
- g_info("\n");
- g_info("core %d mall => %#lx\n", i, g_cores[i].mall);
- g_info("core %d mut0 => %#lx\n", i, g_cores[i].muta[0]);
- g_info("core %d mut1 => %#lx\n", i, g_cores[i].muta[1]);
- g_info("core %d mut2 => %#lx\n", i, g_cores[i].muta[2]);
- g_info("core %d mut3 => %#lx\n", i, g_cores[i].muta[3]);
- g_info("core %d pnum => %#lx\n", i, g_cores[i].pnum);
- g_info("core %d pcap => %#lx\n", i, g_cores[i].pcap);
- g_info("core %d pfst => %#lx\n", i, g_cores[i].pfst);
- g_info("core %d plst => %#lx\n", i, g_cores[i].plst);
- g_info("core %d pcur => %#lx\n", i, g_cores[i].pcur);
- g_info("core %d psli => %#lx\n", i, g_cores[i].psli);
- g_info("core %d cycl => %#lx\n", i, g_cores[i].cycl);
- g_info("core %d ivpt => %#lx\n", i, g_cores[i].ivpt);
- g_info("\n");
-
- for (int j = 0; j < 32; ++j) {
- g_info("%02x ", g_cores[i].mvec[j]);
- }
-
- g_info("\n");
- }
-
- salis_free();
-}
-#endif