Add signal queue to Quakey

This commit is contained in:
2026-01-28 20:57:33 +01:00
parent da3223a725
commit 1d6b11bcc3
5 changed files with 80 additions and 4 deletions
+15
View File
@@ -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
+54 -1
View File
@@ -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
-1
View File
@@ -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];
+10 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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;