From 9b09f6992e34997720061669a5dbe183b885e405 Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Sat, 9 Dec 2017 17:49:11 -0800 Subject: [PATCH] Fix transmit queue synchronization bug --- Ooui/Client.js | 2 +- Ooui/UI.cs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Ooui/Client.js b/Ooui/Client.js index e796069..4709ced 100644 --- a/Ooui/Client.js +++ b/Ooui/Client.js @@ -1,5 +1,5 @@ -var debug = false; +var debug = true; const nodes = {}; diff --git a/Ooui/UI.cs b/Ooui/UI.cs index c8e0dd7..768d992 100644 --- a/Ooui/UI.cs +++ b/Ooui/UI.cs @@ -671,6 +671,7 @@ namespace Ooui // // Add it to the queue // + //Console.WriteLine ($"QM {message.MessageType} {message.TargetId} {message.Key} {message.Value}"); queuedMessages.Add (message); } @@ -689,19 +690,24 @@ namespace Ooui // Dequeue as many messages as we can // var messagesToSend = new List (); + System.Runtime.CompilerServices.ConfiguredTaskAwaitable task; lock (queuedMessages) { messagesToSend.AddRange (queuedMessages); queuedMessages.Clear (); - } - if (messagesToSend.Count == 0) - return; - // - // Now actually send this message - // - var json = Newtonsoft.Json.JsonConvert.SerializeObject (messagesToSend); - var outputBuffer = new ArraySegment (Encoding.UTF8.GetBytes (json)); - await webSocket.SendAsync (outputBuffer, WebSocketMessageType.Text, true, token).ConfigureAwait (false); + if (messagesToSend.Count == 0) + return; + + // + // Now actually send this message + // Do this while locked to make sure SendAsync is called in the right order + // + var json = Newtonsoft.Json.JsonConvert.SerializeObject (messagesToSend); + var outputBuffer = new ArraySegment (Encoding.UTF8.GetBytes (json)); + //Console.WriteLine ("TRANSMIT " + json); + task = webSocket.SendAsync (outputBuffer, WebSocketMessageType.Text, true, token).ConfigureAwait (false); + } + await task; } catch (Exception ex) { Error ("Failed to send queued messages, aborting session", ex);