| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/server/server.c')
| -rw-r--r-- | src/server/server.c | 99 |
1 files changed, 54 insertions, 45 deletions
diff --git a/src/server/server.c b/src/server/server.c index 8a75615..874f5eb 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -1,72 +1,81 @@ #include <signal.h> +#include <string.h> #include <stdio.h> #include "../parameters/parameters.h" #include "server.h" -volatile char ZoO_SERVER_IS_RUNNING = (char) 1; - -static void request_termination (int const signo) +int ZoO_server_main +( + const struct ZoO_parameters params [const restrict static 1] +) { - if ((signo == SIGINT) || (signo == SIGTERM)) + struct ZoO_server server; + ZoO_index retries; + + if (ZoO_server_set_signal_handlers < 0) { - ZoO_SERVER_IS_RUNNING = (char) 0; + return -1; } -} -int ZoO_server_main (const struct ZoO_parameters params) -{ - struct ZoO_server server; - struct ZoO_server_message msg_buffer; - struct ZoO_server_worker_parameters worker_params; - - if - ( - ZoO_server_initialize - ( - &server, - ZoO_parameters_get_session_name(¶ms) - ) < 0 - ) + if (ZoO_server_initialize(&server, params) < 0) { return -1; } - ZoO_server_worker_initialize_parameters - ( - &worker_params, - &server, - &msg_buffer, - ¶ms - ); - - while ((ZoO_SERVER_IS_RUNNING == (char) 1) || (server.running_threads > 0)) + while (ZoO_server_is_running()) { - if (ZoO_server_receive_message(&server, &msg_buffer) < 0) + switch (ZoO_server_wait_for_new_event(&server)) { - ZoO_server_no_mq_termination(&server); + case 0: /* Timed out or signal'd. */ + ZoO_server_handle_joining_threads(&server); + + retries = 0; + + break; + + case 1: /* New client attempted connection. */ + ZoO_server_handle_joining_threads(&server); + (void) ZoO_server_handle_new_connection(&server); - break; + retries = 0; + + break; + + case -1: /* Something bad happened. */ + retries += 1; + + if (retries == ZoO_SERVER_MAX_RETRIES) + { + ZoO_server_finalize(&server); + + return -1; + } + + break; } + } - switch (msg_buffer.type) + /* Waiting for the threads to join... */ + while (server.workers.currently_running > 0) + { + switch (ZoO_server_wait_for_new_event(&server)) { - case 'C': /* Client request */ - ZoO_server_add_worker(&server, &worker_params); + case 0: /* Timed out. */ + case 1: /* New client attempted connection. */ + ZoO_server_handle_joining_threads(&server); break; - case 'J': /* Join request */ - ZoO_server_finalize_worker(&server, &msg_buffer); - break; + case -1: /* Something bad happened. */ + retries += 1; + + if (retries == ZoO_SERVER_MAX_RETRIES) + { + ZoO_server_finalize(&server); - default: - fprintf - ( - stderr, - "[W] Received message with unknown type '%c'.\n", - msg_buffer.type - ); + return -1; + } break; } } |


