aboutsummaryrefslogtreecommitdiff
path: root/core/salis.c
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2026-04-24 05:19:57 +0200
committerPaul Oliver <contact@pauloliver.dev>2026-04-28 00:06:26 +0200
commitf7f2d1193758bb9d7a2d467f188cf755c8d5ddc9 (patch)
tree4c8c0f3df3a67204bb0d16670b360bea6518aa81 /core/salis.c
parent397286c87dc9aa3cba458973bdc65b3f3be14657 (diff)
Removes old data server and cleans up python code
Diffstat (limited to 'core/salis.c')
-rw-r--r--core/salis.c146
1 files changed, 47 insertions, 99 deletions
diff --git a/core/salis.c b/core/salis.c
index 6a42bb3..8777d2f 100644
--- a/core/salis.c
+++ b/core/salis.c
@@ -14,7 +14,7 @@
#define MALL_FLAG 0x80
#define UINT64_HALF 0x8000000000000000ul
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
#define EVENT_ARRAYS \
EVENT_ARRAY(0, aev) /* allocation events array */ \
EVENT_ARRAY(1, eev) /* executions events array */ \
@@ -22,7 +22,7 @@
#define EVENT_ARRAYS_COUNT 3
#endif
-#if defined(COMPRESS) || defined(DATA_PUSH_PATH)
+#if COMPRESS == 1 || DATA_PUSH == 1
#include "compress.c"
#endif
@@ -51,7 +51,7 @@ struct Core {
uint64_t *ivav;
uint8_t *iviv;
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
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)
@@ -81,11 +81,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 DATA_PUSH == 1
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 +96,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,7 +127,7 @@ 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 DATA_PUSH == 1
#if defined(COMMAND_NEW)
void arch_push_data_header(void);
#endif
@@ -137,7 +137,7 @@ void arch_push_data_line(void);
// ----------------------------------------------------------------------------
// Memory vector functions
// ----------------------------------------------------------------------------
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
uint64_t mvec_loop(uint64_t addr) {
return addr % MVEC_SIZE;
}
@@ -146,7 +146,7 @@ uint64_t mvec_loop(uint64_t addr) {
bool mvec_is_alloc(const struct Core *core, uint64_t addr) {
assert(core);
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
return core->mvec[mvec_loop(addr)] & MALL_FLAG ? true : false;
#else
if (addr < MVEC_SIZE) {
@@ -161,16 +161,16 @@ void mvec_alloc(struct Core *core, uint64_t addr) {
assert(core);
assert(!mvec_is_alloc(core, addr));
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
core->mvec[mvec_loop(addr)] |= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
// 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 DATA_PUSH == 1
// Record deallocation event
++core->aeva[addr];
#endif
@@ -182,16 +182,16 @@ void mvec_free(struct Core *core, uint64_t addr) {
assert(core);
assert(mvec_is_alloc(core, addr));
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
core->mvec[mvec_loop(addr)] ^= MALL_FLAG;
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
// 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 DATA_PUSH == 1
// Record deallocation event
++core->aeva[addr];
#endif
@@ -202,7 +202,7 @@ void mvec_free(struct Core *core, uint64_t addr) {
uint8_t mvec_get_byte(const struct Core *core, uint64_t addr) {
assert(core);
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
return core->mvec[mvec_loop(addr)];
#else
if (addr < MVEC_SIZE) {
@@ -216,7 +216,7 @@ uint8_t mvec_get_byte(const struct Core *core, uint64_t addr) {
uint8_t mvec_get_inst(const struct Core *core, uint64_t addr) {
assert(core);
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
return core->mvec[mvec_loop(addr)] & INST_MASK;
#else
if (addr < MVEC_SIZE) {
@@ -231,7 +231,7 @@ void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) {
assert(core);
assert(inst < INST_CAP);
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
core->mvec[mvec_loop(addr)] &= MALL_FLAG;
core->mvec[mvec_loop(addr)] |= inst;
#else
@@ -241,7 +241,7 @@ void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) {
#endif
}
-#if defined(MUTA_FLIP)
+#if MUTA_FLIP == 1
void mvec_flip_bit(struct Core *core, uint64_t addr, int bit) {
assert(core);
assert(bit < 8);
@@ -298,7 +298,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);
@@ -338,7 +338,7 @@ void muta_cosmic_ray(struct Core *core) {
uint64_t b = muta_next(core);
if (a < MVEC_SIZE) {
-#if defined(MUTA_FLIP)
+#if MUTA_FLIP == 1
mvec_flip_bit(core, a, (int)(b % 8));
#else
mvec_set_inst(core, a, b & INST_MASK);
@@ -373,14 +373,14 @@ 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 DATA_PUSH == 1
// 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);
for (uint64_t i = 0; i < child_size; i++) {
uint64_t addr = child_addr + i;
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
++core->beva[mvec_loop(addr)];
#else
++core->beva[addr];
@@ -420,7 +420,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 +435,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 DATA_PUSH == 1
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 +446,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 DATA_PUSH == 1
#define EVENT_ARRAY(_, ev) \
fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f);
EVENT_ARRAYS
@@ -457,12 +457,12 @@ 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);
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
uint64_t addr = UINT64_HALF;
#else
uint64_t addr = 0;
@@ -525,7 +525,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 DATA_PUSH == 1
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 +544,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 DATA_PUSH == 1
#define EVENT_ARRAY(_, ev) \
fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f);
EVENT_ARRAYS
@@ -594,7 +594,7 @@ void core_step(struct Core *core) {
if (core->psli != 0) {
core_pull_ipcm(core);
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
// Save execution event locations in database
assert(mvec_proc_is_live(core, core->pcur));
@@ -610,7 +610,7 @@ void core_step(struct Core *core) {
++core->edea;
}
-#if defined(MVEC_LOOP)
+#if MVEC_LOOP == 1
core->eeva[mvec_loop(pcur_ip)]++;
#else
if (pcur_ip < MVEC_SIZE) {
@@ -649,9 +649,9 @@ 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)
+#if COMPRESS == 1
size_t size = 0;
char *in = NULL;
FILE *f = open_memstream(&in, &size);
@@ -669,7 +669,7 @@ void salis_save(const char *path) {
fwrite(&g_syncs, sizeof(uint64_t), 1, f);
fclose(f);
-#if defined(COMPRESS)
+#if COMPRESS == 1
assert(size);
char *out = malloc(size);
@@ -718,7 +718,7 @@ void salis_auto_save(void) {
}
#endif
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) {
assert(sql_format);
@@ -770,7 +770,7 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con
}
#endif
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
#if defined(COMMAND_NEW)
void salis_push_data_header(void) {
assert(g_sim_data);
@@ -981,7 +981,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 +996,7 @@ void salis_init(void) {
salis_auto_save();
#endif
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
sqlite3_open(DATA_PUSH_PATH, &g_sim_data);
assert(g_sim_data);
@@ -1017,7 +1017,7 @@ void salis_init(void) {
#if defined(COMMAND_LOAD)
void salis_load(void) {
-#if defined(COMPRESS)
+#if COMPRESS == 1
FILE *fx = fopen(SIM_PATH, "rb");
assert(fx);
@@ -1062,12 +1062,12 @@ void salis_load(void) {
fread(&g_syncs, sizeof(uint64_t), 1, f);
fclose(f);
-#if defined(COMPRESS)
+#if COMPRESS == 1
free(in);
free(out);
#endif
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
sqlite3_open(DATA_PUSH_PATH, &g_sim_data);
assert(g_sim_data);
@@ -1135,13 +1135,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 DATA_PUSH == 1
if (g_steps % DATA_PUSH_INTERVAL == 0) {
salis_push_data_line();
}
@@ -1203,7 +1203,7 @@ void salis_step(uint64_t ns) {
}
void salis_free(void) {
-#if defined(DATA_PUSH_PATH)
+#if DATA_PUSH == 1
assert(g_sim_data);
sqlite3_close(g_sim_data);
#endif
@@ -1233,58 +1233,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