summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/server.c')
-rw-r--r--src/server/server.c99
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(&params)
- ) < 0
- )
+ if (ZoO_server_initialize(&server, params) < 0)
{
return -1;
}
- ZoO_server_worker_initialize_parameters
- (
- &worker_params,
- &server,
- &msg_buffer,
- &params
- );
-
- 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;
}
}