X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fio.c;h=0cf2c056782aa2c56846580afb01676ec61f266d;hb=2b2a1e0169b3a863fd87b679d789a4e2b789eb67;hp=c2a3354fd8f9c63d5b689fc9b3369f0ec822ce63;hpb=cdd22bc79aafb8261af4785f58425d8535e57a5b;p=plomrogue diff --git a/src/server/io.c b/src/server/io.c index c2a3354..0cf2c05 100644 --- a/src/server/io.c +++ b/src/server/io.c @@ -9,15 +9,16 @@ #include "io.h" #include /* global errno */ #include /* PIPE_BUF */ -#include /* size_t, NULL */ +#include /* NULL */ #include /* uint8_t, uint16_t, uint32_t, UINT8_MAX */ -#include /* defines EOF, FILE, sprintf(), fprintf() */ +#include /* defines FILE, sprintf(), fprintf() */ #include /* free() */ #include /* strlen(), snprintf(), memcpy(), memset(), strchr() */ #include /* time_t */ #include /* time(), nanosleep() */ #include "../common/readwrite.h" /* atomic_write_start(), atomic_write_finish(), - * try_fwrite(), try_fputc(), try_fgetc() + * get_message_from_queue(), try_fwrite(), + * read_file_into_queue(), try_fputc() */ #include "../common/rexit.h" /* exit_trouble() */ #include "../common/try_malloc.h" /* try_malloc() */ @@ -40,17 +41,10 @@ static void write_key_space_string(FILE * file, char * key, char * string); /* Write to "file" \n-delimited line of "key" + space + "value" as string. */ static void write_thing(FILE * file, struct Thing * t); -/* Cut out and return first \0-terminated string from world.queue and - * appropriately reduce world.queue_size. Return NULL if queue is empty. - * Superfluous \0 bytes after the string are also cut out. Should the queue - * start with \0 bytes, those are cut out before returning anything after them. - */ -static char * get_message_from_queue(); - /* Poll input file for world.queue input. Wait a few seconds until giving up; * poll only every 0.03 seconds. Translate '\n' chars in input file into '\0'. */ -static void read_file_into_queue(); +static void try_growing_queue(); /* Write world state as visible to clients to its file. Write single dot line to * server output file to satisfy client ping mechanisms. @@ -187,77 +181,25 @@ static void write_thing(FILE * file, struct Thing * t) -static char * get_message_from_queue() -{ - char * message = NULL; - if (world.queue_size) - { - size_t cutout_len = strlen(world.queue); - uint8_t is_nullbyte_chunk = !cutout_len; - if (0 < cutout_len) - { - cutout_len++; - message = try_malloc(cutout_len, __func__); - memcpy(message, world.queue, cutout_len); - } - for (; - cutout_len != world.queue_size && '\0' == world.queue[cutout_len]; - cutout_len++); - world.queue_size = world.queue_size - cutout_len; - if (0 == world.queue_size) - { - free(world.queue); /* NULL so read_file_into_queue() may free() */ - world.queue = NULL; /* this every time, even when it's */ - } /* un-allocated first. */ - else - { - char * new_queue = try_malloc(world.queue_size, __func__); - memcpy(new_queue, &(world.queue[cutout_len]), world.queue_size); - free(world.queue); - world.queue = new_queue; - if (is_nullbyte_chunk) - { - return get_message_from_queue(); - } - } - } - return message; -} - - - -static void read_file_into_queue() +static void try_growing_queue() { uint8_t wait_seconds = 5; time_t now = time(0); struct timespec dur; dur.tv_sec = 0; dur.tv_nsec = 33333333; - int test; - while (EOF == (test = try_fgetc(world.file_in, __func__))) + while (1) { - nanosleep(&dur, NULL); - if (time(0) > now + wait_seconds) + if (read_file_into_queue(world.file_in, &world.queue,&world.queue_size)) { return; } - } - do - { - char c = (char) test; - if ('\n' == c) + nanosleep(&dur, NULL); + if (time(0) > now + wait_seconds) { - c = '\0'; + return; } - char * new_queue = try_malloc(world.queue_size + 1, __func__); - memcpy(new_queue, world.queue, world.queue_size); - char * new_pos = new_queue + world.queue_size; - * new_pos = c; - world.queue_size++; - free(world.queue); - world.queue = new_queue; } - while (EOF != (test = try_fgetc(world.file_in, __func__))); } @@ -274,10 +216,6 @@ static void update_worldstate_file() write_value_as_line(player->pos.x, file); write_value_as_line(world.map.length, file); write_map(player, file); - if (world.log) - { - try_fwrite(world.log, strlen(world.log), 1, file, __func__); - } atomic_write_finish(file, s[S_PATH_WORLDSTATE], path_tmp); set_cleanup_flag(CLEANUP_WORLDSTATE); char * dot = ".\n"; @@ -413,24 +351,15 @@ extern char * io_round() { if (0 < world.queue_size) { - return get_message_from_queue(); + return get_message_from_queue(&world.queue, &world.queue_size); } if (world.do_update) { update_worldstate_file(); world.do_update = 0; } - read_file_into_queue(); - if (world.queue_size && '\0' != world.queue[world.queue_size - 1]) - { - char * new_queue = try_malloc(world.queue_size + 1, __func__); - memcpy(new_queue, world.queue, world.queue_size); - new_queue[world.queue_size] = '\0'; - world.queue_size++; - free(world.queue); - world.queue = new_queue; - } - return get_message_from_queue(); + try_growing_queue(); + return get_message_from_queue(&world.queue, &world.queue_size); }