From f3e33278286fe7843f16fa97540dcf629636eb62 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 26 Aug 2021 19:03:11 -0400 Subject: [PATCH] Asynchronous chat processing in an instance --- .../Components/Chat/ChatManager.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Components/Chat/ChatManager.cs b/src/Tgstation.Server.Host/Components/Chat/ChatManager.cs index a0b651a7f9..b4e822728b 100644 --- a/src/Tgstation.Server.Host/Components/Chat/ChatManager.cs +++ b/src/Tgstation.Server.Host/Components/Chat/ChatManager.cs @@ -752,6 +752,7 @@ namespace Tgstation.Server.Host.Components.Chat { logger.LogTrace("Starting processing loop..."); var messageTasks = new Dictionary>(); + Task activeProcessingTask = Task.CompletedTask; try { Task updatedTask = null; @@ -785,8 +786,17 @@ namespace Tgstation.Server.Host.Components.Chat { var message = await completedMessageTaskKvp.Value.ConfigureAwait(false); var messageNumber = Interlocked.Increment(ref messagesProcessed); - using (LogContext.PushProperty("ChatMessage", messageNumber)) + + async Task WrapProcessMessage() + { + var localActiveProcessingTask = activeProcessingTask; await ProcessMessage(completedMessageTaskKvp.Key, message, cancellationToken).ConfigureAwait(false); + await localActiveProcessingTask.ConfigureAwait(false); + } + + using (LogContext.PushProperty("ChatMessage", messageNumber)) + activeProcessingTask = WrapProcessMessage(); + messageTasks.Remove(completedMessageTaskKvp.Key); } } @@ -799,6 +809,10 @@ namespace Tgstation.Server.Host.Components.Chat { logger.LogError(e, "Message loop crashed!"); } + finally + { + await activeProcessingTask.ConfigureAwait(false); + } logger.LogTrace("Leaving message processing loop"); }