From 2e813ae29c3bc0865d31a47296232ce0a62a72a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barra=20=C3=93=20Cath=C3=A1in?= Date: Thu, 9 Nov 2023 23:51:50 +0000 Subject: [PATCH] Added independent output thread. --- .gitignore | 4 +++- Makefile.am | 2 ++ configure.ac | 4 +--- source/server/main.c | 26 ++++---------------------- source/server/output-queue.c | 31 +++++++++++++++++++++++++++++++ source/server/output-queue.h | 2 ++ 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 7d9403b..c9e1630 100644 --- a/.gitignore +++ b/.gitignore @@ -108,4 +108,6 @@ SilverMUDServer SilverMUDClient config.h config.h.in -stamp-h1 \ No newline at end of file +stamp-h1 + +build/ \ No newline at end of file diff --git a/Makefile.am b/Makefile.am index 37985b6..f239522 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,7 @@ bin_PROGRAMS = SilverMUDServer SilverMUDClient dist_doc_DATA = README.org +schemedir = $(pkgdatadir)/scheme +dist_scheme_DATA = lisp SilverMUDServer_CFLAGS = -lgnutls -g $(GUILE_CFLAGS) $(GUILE_LIBS) SilverMUDClient_CFLAGS = -lgnutls -g -lncurses $(GUILE_CFLAGS) $(GUILE_LIBS) diff --git a/configure.ac b/configure.ac index 1151bc2..9e4bdeb 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,6 @@ AC_INIT([SilverMUD], [0.0.1], [barra@ocathain.ie]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) AC_PROG_CC AC_CONFIG_HEADERS([source/config.h]) -AC_CONFIG_FILES([ - Makefile -]) +AC_CONFIG_FILES([Makefile]) PKG_CHECK_MODULES([GUILE], [guile-3.0]) AC_OUTPUT diff --git a/source/server/main.c b/source/server/main.c index fdc4475..50ca891 100644 --- a/source/server/main.c +++ b/source/server/main.c @@ -110,6 +110,10 @@ int main (int argc, char ** argv) scm_c_define_gsubr("push-output-message", 6, 0, 0, &push_output_message); scm_c_define("*globalPlayerList*", scm_from_pointer(globalPlayerList, NULL)); scm_c_define("*globalOutputQueue*", scm_from_pointer(globalOutputQueue, NULL)); + + // Start an output thread: + pthread_t outputThread; + pthread_create(&outputThread, NULL, outputThreadHandler, (void *)globalOutputQueue); // Start a REPL thread: //pthread_t schemeREPLThread; @@ -236,28 +240,6 @@ int main (int argc, char ** argv) } } } - - // Output the queue: - struct OutputMessage * currentMessage = NULL; - while (globalOutputQueue->count != 0) - { - currentMessage = popOutputMessage(globalOutputQueue); - struct PlayerListNode * currentPlayerNode = currentMessage->recepients->head; - - while (currentPlayerNode != NULL) - { - gnutls_record_send(*currentPlayerNode->player->connection->tlsSession, - currentMessage->message, sizeof(struct ServerToClientMessage)); - currentPlayerNode = currentPlayerNode->next; - } - - if (currentMessage->deallocatePlayerList == true) - { - deallocatePlayerList(¤tMessage->recepients); - } - - deallocateOutputMessage(¤tMessage); - } } // Wait for all other threads to terminate: diff --git a/source/server/output-queue.c b/source/server/output-queue.c index 906638f..5e565f9 100644 --- a/source/server/output-queue.c +++ b/source/server/output-queue.c @@ -6,8 +6,39 @@ #include #include #include +#include "player-data.h" #include "output-queue.h" +// A thread handler for constantly outputting messages from an output queue: +void * outputThreadHandler(void * outputQueue) +{ + struct OutputQueue * queue = (struct OutputQueue *)outputQueue; + struct OutputMessage * currentMessage = NULL; + + while (true) + { + currentMessage = popOutputMessage(queue); + if (currentMessage != NULL) + { + struct PlayerListNode * currentPlayerNode = currentMessage->recepients->head; + + while (currentPlayerNode != NULL) + { + gnutls_record_send(*currentPlayerNode->player->connection->tlsSession, + currentMessage->message, sizeof(struct ServerToClientMessage)); + currentPlayerNode = currentPlayerNode->next; + } + + if (currentMessage->deallocatePlayerList == true) + { + deallocatePlayerList(¤tMessage->recepients); + } + + deallocateOutputMessage(¤tMessage); + } + } +} + struct OutputQueue * const createOutputQueue() { // Allocate a new queue: diff --git a/source/server/output-queue.h b/source/server/output-queue.h index b988ba8..ebe7d51 100644 --- a/source/server/output-queue.h +++ b/source/server/output-queue.h @@ -28,6 +28,8 @@ struct OutputQueue struct OutputMessage * front, * back; }; +void * outputThreadHandler(void * outputQueue); + struct OutputQueue * const createOutputQueue(); size_t pushOutputMessage(struct OutputQueue * const queue,