Add signal queue to Quakey
This commit is contained in:
@@ -81,6 +81,14 @@ int quakey_schedule_one(Quakey *quakey);
|
|||||||
// Generate a random u64
|
// Generate a random u64
|
||||||
QuakeyUInt64 quakey_random(void);
|
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);
|
int *mock_errno_ptr(void);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -139,6 +147,8 @@ void mock_free(void *ptr);
|
|||||||
|
|
||||||
#ifdef QUAKEY_ENABLE_MOCKS
|
#ifdef QUAKEY_ENABLE_MOCKS
|
||||||
|
|
||||||
|
#define QUAKEY_SIGNAL(name) quakey_signal(name)
|
||||||
|
|
||||||
#undef errno
|
#undef errno
|
||||||
#define errno (*mock_errno_ptr())
|
#define errno (*mock_errno_ptr())
|
||||||
|
|
||||||
@@ -191,6 +201,11 @@ void mock_free(void *ptr);
|
|||||||
#define FindFirstFileA mock_FindFirstFileA
|
#define FindFirstFileA mock_FindFirstFileA
|
||||||
#define FindNextFileA mock_FindNextFileA
|
#define FindNextFileA mock_FindNextFileA
|
||||||
#define FindClose mock_FindClose
|
#define FindClose mock_FindClose
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define QUAKEY_SIGNAL(name) ((void) (name))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // QUAKEY_INCLUDED
|
#endif // QUAKEY_INCLUDED
|
||||||
+54
-1
@@ -347,6 +347,8 @@ typedef struct {
|
|||||||
b32 rst;
|
b32 rst;
|
||||||
} TimeEvent;
|
} TimeEvent;
|
||||||
|
|
||||||
|
#define SIM_SIGNAL_LIMIT 8
|
||||||
|
|
||||||
struct Sim {
|
struct Sim {
|
||||||
|
|
||||||
uint64_t seed;
|
uint64_t seed;
|
||||||
@@ -366,6 +368,10 @@ struct Sim {
|
|||||||
int num_events;
|
int num_events;
|
||||||
int max_events;
|
int max_events;
|
||||||
TimeEvent *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);
|
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->num_events = 0;
|
||||||
sim->max_events = 0;
|
sim->max_events = 0;
|
||||||
sim->events = NULL;
|
sim->events = NULL;
|
||||||
|
sim->num_signals = 0;
|
||||||
|
sim->head_signal = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sim_free(Sim *sim)
|
static void sim_free(Sim *sim)
|
||||||
@@ -2360,6 +2368,33 @@ static uint64_t sim_random(Sim *sim)
|
|||||||
return x;
|
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___;
|
Host *host = host___;
|
||||||
if (host == NULL)
|
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);
|
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
|
// Mock System Calls
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ static string hash2path(ChunkServer *state, SHA256 hash, char *out)
|
|||||||
return (string) { out, strlen(out) };
|
return (string) { out, strlen(out) };
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: return an error when bitrot
|
|
||||||
static int load_chunk(ChunkServer *state, SHA256 hash, string *data)
|
static int load_chunk(ChunkServer *state, SHA256 hash, string *data)
|
||||||
{
|
{
|
||||||
char buf[PATH_MAX];
|
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");
|
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);
|
quakey_schedule_one(quakey);
|
||||||
|
|
||||||
|
QuakeySignal signal;
|
||||||
|
while (quakey_get_signal(quakey, &signal)) {
|
||||||
|
|
||||||
|
if (!strcmp(signal.name, "exit"))
|
||||||
|
simulation_running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
quakey_free(quakey);
|
quakey_free(quakey);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -619,7 +619,7 @@ int test_client_tick(void *state_, void **ctxs,
|
|||||||
printf("\n========================================\n");
|
printf("\n========================================\n");
|
||||||
printf("All %d tests PASSED!\n", client->tests_passed);
|
printf("All %d tests PASSED!\n", client->tests_passed);
|
||||||
printf("========================================\n");
|
printf("========================================\n");
|
||||||
exit(0);
|
QUAKEY_SIGNAL("exit");
|
||||||
}
|
}
|
||||||
|
|
||||||
*timeout = -1;
|
*timeout = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user