From: Elias Fleckenstein Date: Sun, 13 Feb 2022 15:27:53 +0000 (+0100) Subject: Use dragonstd flags X-Git-Tag: 0.2.2~9 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=fb034b0034a0bf049a7a3c8cebec76284134e01e;p=dragonblocks_alpha.git Use dragonstd flags --- diff --git a/deps/dragonstd b/deps/dragonstd index 39b52e8..4e1758f 160000 --- a/deps/dragonstd +++ b/deps/dragonstd @@ -1 +1 @@ -Subproject commit 39b52e8cfa889d55008f2edd0933d6b421556c34 +Subproject commit 4e1758fbf2261950df0d323460e7fbf35d402dd5 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7c96075..879bec1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,6 +60,7 @@ set(COMMON_SOURCES "${DEPS_DIR}/dragonport/asprintf.c" "${DEPS_DIR}/dragonstd/array.c" "${DEPS_DIR}/dragonstd/bintree.c" + "${DEPS_DIR}/dragonstd/flag.c" "${DEPS_DIR}/dragonstd/list.c" "${DEPS_DIR}/dragonstd/queue.c" "${DEPS_DIR}/linenoise/linenoise.c" @@ -67,10 +68,10 @@ set(COMMON_SOURCES config.c day.c environment.c + interrupt.c map.c node.c perlin.c - signal_handlers.c types.c util.c ) diff --git a/src/client/client.c b/src/client/client.c index 80af198..04364af 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "client/client.h" #include "client/client_auth.h" #include "client/client_map.h" @@ -9,29 +10,23 @@ #include "client/game.h" #include "client/input.h" #include "day.h" -#include "signal_handlers.h" +#include "interrupt.h" #include "perlin.h" #include "types.h" #include "util.h" DragonnetPeer *client; - -static volatile bool finished = false; +static Flag *finish; static bool on_recv(unused DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt) { - while (client_auth.state == AUTH_INIT) - sched_yield(); - return (client_auth.state == AUTH_WAIT) == (type == DRAGONNET_TYPE_ToClientAuth); } static void on_disconnect(unused DragonnetPeer *peer) { - interrupted = true; - - while (! finished) - sched_yield(); + flag_set(interrupt); + flag_wait(finish); } static void on_ToClientAuth(unused DragonnetPeer *peer, ToClientAuth *pkt) @@ -89,7 +84,9 @@ int main(int argc, char **argv) client->on_recv_type[DRAGONNET_TYPE_ToClientPos ] = (void *) &on_ToClientPos; client->on_recv_type[DRAGONNET_TYPE_ToClientTimeOfDay] = (void *) &on_ToClientTimeOfDay; - signal_handlers_init(); + finish = flag_create(); + + interrupt_init(); client_map_init(); client_player_init(); dragonnet_peer_run(client); @@ -104,10 +101,14 @@ int main(int argc, char **argv) client_auth_deinit(); client_player_deinit(); client_map_deinit(); + interrupt_deinit(); pthread_t recv_thread = client->recv_thread; - finished = true; + + flag_set(finish); pthread_join(recv_thread, NULL); + flag_delete(finish); + return EXIT_SUCCESS; } diff --git a/src/client/client_auth.c b/src/client/client_auth.c index 1e76d31..d2db7e0 100644 --- a/src/client/client_auth.c +++ b/src/client/client_auth.c @@ -3,7 +3,7 @@ #include #include "client.h" #include "client_auth.h" -#include "signal_handlers.h" +#include "interrupt.h" #include "types.h" volatile struct ClientAuth client_auth; @@ -13,13 +13,13 @@ static bool name_prompt() if (! (client_auth.name = linenoise("Enter name: "))) return false; + printf("Authenticating as %s...\n", client_auth.name); + client_auth.state = AUTH_WAIT; + dragonnet_peer_send_ToServerAuth(client, &(ToServerAuth) { .name = client_auth.name, }); - printf("Authenticating as %s...\n", client_auth.name); - client_auth.state = AUTH_WAIT; - return true; } @@ -27,7 +27,7 @@ bool client_auth_init() { client_auth.state = AUTH_INIT; - while (! interrupted) { + while (! interrupt->done) { switch (client_auth.state) { case AUTH_INIT: if (name_prompt()) diff --git a/src/client/game.c b/src/client/game.c index 1ea39b3..02216ac 100644 --- a/src/client/game.c +++ b/src/client/game.c @@ -18,7 +18,7 @@ #include "client/sky.h" #include "client/window.h" #include "day.h" -#include "signal_handlers.h" +#include "interrupt.h" int window_width, window_height; @@ -67,7 +67,7 @@ static void game_loop() struct timespec ts, ts_old; clock_gettime(CLOCK_REALTIME, &ts_old); - while (! glfwWindowShouldClose(window.handle) && ! interrupted) { + while (! glfwWindowShouldClose(window.handle) && ! interrupt->done) { clock_gettime(CLOCK_REALTIME, &ts); f64 dtime = (f64) (ts.tv_sec - ts_old.tv_sec) + (f64) (ts.tv_nsec - ts_old.tv_nsec) / 1.0e9; ts_old = ts; diff --git a/src/interrupt.c b/src/interrupt.c new file mode 100644 index 0000000..2fb1d01 --- /dev/null +++ b/src/interrupt.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include "interrupt.h" + +Flag *interrupt; +static struct sigaction sa = {0}; + +static void interrupt_handler(int sig) +{ + fprintf(stderr, "%s\n", strsignal(sig)); + flag_set(interrupt); +} + +void interrupt_init() +{ + interrupt = flag_create(); + + sa.sa_handler = &interrupt_handler; + sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); +} + +void interrupt_deinit() +{ + flag_delete(interrupt); +} diff --git a/src/interrupt.h b/src/interrupt.h new file mode 100644 index 0000000..489a264 --- /dev/null +++ b/src/interrupt.h @@ -0,0 +1,11 @@ +#ifndef _INTERRUPT_H_ +#define _INTERRUPT_H_ + +#include + +extern Flag *interrupt; + +void interrupt_init(); +void interrupt_deinit(); + +#endif diff --git a/src/server/server.c b/src/server/server.c index a3587f2..37974fb 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -1,11 +1,11 @@ #include #include #include +#include "interrupt.h" #include "server/database.h" #include "server/server.h" #include "server/server_map.h" #include "server/server_player.h" -#include "signal_handlers.h" #include "util.h" DragonnetListener *server; @@ -69,23 +69,23 @@ int main(int argc, char **argv) server->on_recv_type[DRAGONNET_TYPE_ToServerPos] = (void *) &on_ToServerPos; server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock; - signal_handlers_init(); - + interrupt_init(); server_player_init(); database_init(); server_map_init(); + server_map_prepare_spawn(); dragonnet_listener_run(server); - while (! interrupted) - sched_yield(); + flag_wait(interrupt); printf("Shutting down\n"); - dragonnet_listener_close(server); + server_map_deinit(); database_deinit(); server_player_deinit(); + interrupt_deinit(); dragonnet_listener_delete(server); diff --git a/src/server/server_map.c b/src/server/server_map.c index 68bd9ec..3cadbc1 100644 --- a/src/server/server_map.c +++ b/src/server/server_map.c @@ -2,12 +2,12 @@ #include #include #include +#include "interrupt.h" #include "map.h" #include "server/database.h" #include "server/mapgen.h" #include "server/server_config.h" #include "server/server_map.h" -#include "signal_handlers.h" #include "util.h" struct ServerMap server_map; @@ -341,7 +341,7 @@ void server_map_prepare_spawn() for (s32 x = -dist; x <= (s32) dist; x++) { for (s32 y = -dist; y <= (s32) dist; y++) { for (s32 z = -dist; z <= (s32) dist; z++) { - if (interrupted) { + if (interrupt->done) { join_mapgen_threads(); return; } diff --git a/src/signal_handlers.c b/src/signal_handlers.c deleted file mode 100644 index fa3a0f7..0000000 --- a/src/signal_handlers.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include "signal_handlers.h" -#include "util.h" - -bool interrupted = false; - -static void interrupt_handler(int sig) -{ - interrupted = true; - fprintf(stderr, "%s\n", strsignal(sig)); -} - -static void silent_handler(unused int sig) -{ -} - -static struct sigaction sigact_interrupt = {0}; -static struct sigaction sigact_silent = {0}; - -void signal_handlers_init() -{ - sigact_interrupt.sa_handler = &interrupt_handler; - sigaction(SIGINT, &sigact_interrupt, NULL); - sigaction(SIGTERM, &sigact_interrupt, NULL); - - sigact_silent.sa_handler = &silent_handler; - sigaction(SIGPIPE, &sigact_silent, NULL); -} diff --git a/src/signal_handlers.h b/src/signal_handlers.h deleted file mode 100644 index f5665d4..0000000 --- a/src/signal_handlers.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SIGNAL_HANDLERS_H_ -#define _SIGNAL_HANDLERS_H_ - -#include - -extern bool interrupted; -void signal_handlers_init(); - -#endif diff --git a/src/util.h b/src/util.h index f8b0459..64e7287 100644 --- a/src/util.h +++ b/src/util.h @@ -1,8 +1,6 @@ #ifndef _UTIL_H_ #define _UTIL_H_ -#define ever (;;) // infinite for loop with style -#define INBRACES(str) (str) ? "(" : "", (str) ? (str) : "", (str) ? ")" : "" // wrapper for printf to optionally add a message in braces if message is not NULL #define CMPBOUNDS(x) ((x) == 0 ? 0 : (x) > 0 ? 1 : -1) // resolves to 1 if x > 0, 0 if x == 0 and -1 if x < 0 #define fallthrough __attribute__ ((fallthrough)) // prevent compiler warning about implicit fallthrough with style #define unused __attribute__ ((unused))