From 3309c034c4cd2088c18d5a9483cfb8f8656d98f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barra=20=C3=93=20Cath=C3=A1in?= Date: Mon, 20 Nov 2023 21:26:21 +0000 Subject: [PATCH] Update output queue to not pin the CPU (proper waiting) --- source/server/output-queue.c | 42 +++++++++++++++++++++--------------- source/server/output-queue.h | 2 ++ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/source/server/output-queue.c b/source/server/output-queue.c index 5e565f9..ba97b69 100644 --- a/source/server/output-queue.c +++ b/source/server/output-queue.c @@ -17,25 +17,30 @@ void * outputThreadHandler(void * outputQueue) while (true) { - currentMessage = popOutputMessage(queue); - if (currentMessage != NULL) + if (queue->count == 0) + { + pthread_cond_wait(&queue->updated, &queue->waitMutex); + } + + currentMessage = popOutputMessage(queue); + if (currentMessage != NULL) + { + struct PlayerListNode * currentPlayerNode = currentMessage->recepients->head; + + while (currentPlayerNode != 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); + gnutls_record_send(*currentPlayerNode->player->connection->tlsSession, + currentMessage->message, sizeof(struct ServerToClientMessage)); + currentPlayerNode = currentPlayerNode->next; } + + if (currentMessage->deallocatePlayerList == true) + { + deallocatePlayerList(¤tMessage->recepients); + } + + deallocateOutputMessage(¤tMessage); + } } } @@ -46,6 +51,7 @@ struct OutputQueue * const createOutputQueue() // Initialize it: pthread_mutex_init(&newQueue->mutex, NULL); + pthread_cond_init(&newQueue->updated, NULL); newQueue->count = 0; newQueue->front = NULL; newQueue->back = NULL; @@ -101,6 +107,8 @@ size_t pushOutputMessage(struct OutputQueue * const queue, // Leaving critical section - Unlock the queue: pthread_mutex_unlock(&queue->mutex); + pthread_cond_signal(&queue->updated); + return queue->count; } diff --git a/source/server/output-queue.h b/source/server/output-queue.h index ebe7d51..2af4768 100644 --- a/source/server/output-queue.h +++ b/source/server/output-queue.h @@ -24,6 +24,8 @@ struct OutputMessage struct OutputQueue { pthread_mutex_t mutex; + pthread_mutex_t waitMutex; + pthread_cond_t updated; size_t count; struct OutputMessage * front, * back; };