Add signal queue to Quakey
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user