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 8cc412c..c4d0572 100644 --- a/source/server/main.c +++ b/source/server/main.c @@ -205,6 +205,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; @@ -334,28 +338,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,