diff --git a/quakey/include/quakey.h b/quakey/include/quakey.h index ad070cd..24b508e 100644 --- a/quakey/include/quakey.h +++ b/quakey/include/quakey.h @@ -81,6 +81,14 @@ int quakey_schedule_one(Quakey *quakey); // Generate a random u64 QuakeyUInt64 quakey_random(void); +typedef struct { + char name[32]; + int name_len; +} QuakeySignal; + +void quakey_signal(char *name); +int quakey_get_signal(Quakey *quakey, QuakeySignal *signal); + int *mock_errno_ptr(void); #ifdef _WIN32 @@ -139,6 +147,8 @@ void mock_free(void *ptr); #ifdef QUAKEY_ENABLE_MOCKS +#define QUAKEY_SIGNAL(name) quakey_signal(name) + #undef errno #define errno (*mock_errno_ptr()) @@ -191,6 +201,11 @@ void mock_free(void *ptr); #define FindFirstFileA mock_FindFirstFileA #define FindNextFileA mock_FindNextFileA #define FindClose mock_FindClose + +#else + +#define QUAKEY_SIGNAL(name) ((void) (name)) + #endif #endif // QUAKEY_INCLUDED \ No newline at end of file diff --git a/quakey/src/quakey.c b/quakey/src/quakey.c index 44305ea..579044c 100644 --- a/quakey/src/quakey.c +++ b/quakey/src/quakey.c @@ -347,6 +347,8 @@ typedef struct { b32 rst; } TimeEvent; +#define SIM_SIGNAL_LIMIT 8 + struct Sim { uint64_t seed; @@ -366,6 +368,10 @@ struct Sim { int num_events; int max_events; TimeEvent *events; + + int num_signals; + int head_signal; + QuakeySignal signals[SIM_SIGNAL_LIMIT]; }; static void time_event_wakeup(Sim *sim, Nanos time, Host *host); @@ -2213,6 +2219,8 @@ static void sim_init(Sim *sim, uint64_t seed) sim->num_events = 0; sim->max_events = 0; sim->events = NULL; + sim->num_signals = 0; + sim->head_signal = 0; } static void sim_free(Sim *sim) @@ -2360,6 +2368,33 @@ static uint64_t sim_random(Sim *sim) return x; } +static void sim_signal(Sim *sim, char *name) +{ + int tail_signal = (sim->head_signal + sim->num_signals) % SIM_SIGNAL_LIMIT; + QuakeySignal *signal = &sim->signals[tail_signal]; + + int name_len = strlen(name); + if (name_len > (int) sizeof(sim->signals[sim->num_signals].name)) + abort_("Signal name array is too small"); + + memcpy(signal->name, name, name_len); + signal->name_len = name_len; + + sim->num_signals++; +} + +static int sim_get_signal(Sim *sim, QuakeySignal *out) +{ + if (sim->num_signals == 0) + return 0; + + *out = sim->signals[sim->head_signal]; + + sim->head_signal = (sim->head_signal + 1) % SIM_SIGNAL_LIMIT; + sim->num_signals--; + return 1; +} + ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// @@ -2405,10 +2440,28 @@ QuakeyUInt64 quakey_random(void) { Host *host = host___; if (host == NULL) - abort_("Call to mock_errno_ptr() with no node scheduled\n"); + abort_("Call to quakey_random() with no node scheduled\n"); return sim_random(host->sim); } +void quakey_signal(char *name) +{ + Host *host = host___; + if (host == NULL) + abort_("Call to quakey_signal() with no node scheduled\n"); + + Sim *sim = host->sim; + if (sim->num_signals == SIM_SIGNAL_LIMIT) + abort_("Signal array is too small"); + + sim_signal(sim, name); +} + +int quakey_get_signal(Quakey *quakey, QuakeySignal *signal) +{ + return sim_get_signal((Sim*) quakey, signal); +} + ///////////////////////////////////////////////////////////////// // Mock System Calls diff --git a/src/chunk_server.c b/src/chunk_server.c index cae6d81..6e2448f 100644 --- a/src/chunk_server.c +++ b/src/chunk_server.c @@ -29,7 +29,6 @@ static string hash2path(ChunkServer *state, SHA256 hash, char *out) return (string) { out, strlen(out) }; } -// TODO: return an error when bitrot static int load_chunk(ChunkServer *state, SHA256 hash, string *data) { char buf[PATH_MAX]; diff --git a/src/main.c b/src/main.c index 68e52c1..037bb75 100644 --- a/src/main.c +++ b/src/main.c @@ -334,9 +334,18 @@ int main(void) quakey_spawn(quakey, config, "cs --addr 127.0.0.6 --port 8083 --remote-addr 127.0.0.3 --remote-port 8080"); } - while (simulation_running) + while (simulation_running) { + quakey_schedule_one(quakey); + QuakeySignal signal; + while (quakey_get_signal(quakey, &signal)) { + + if (!strcmp(signal.name, "exit")) + simulation_running = false; + } + } + quakey_free(quakey); return 0; } diff --git a/src/test_client.c b/src/test_client.c index 82fbc22..75e697b 100644 --- a/src/test_client.c +++ b/src/test_client.c @@ -619,7 +619,7 @@ int test_client_tick(void *state_, void **ctxs, printf("\n========================================\n"); printf("All %d tests PASSED!\n", client->tests_passed); printf("========================================\n"); - exit(0); + QUAKEY_SIGNAL("exit"); } *timeout = -1;