소스 검색

Switch to ConcurrentQueue for all drivers.

BDisp 9 달 전
부모
커밋
967cbc205a
2개의 변경된 파일10개의 추가작업 그리고 6개의 파일을 삭제
  1. 5 3
      Terminal.Gui/ConsoleDrivers/NetDriver/NetMainLoop.cs
  2. 5 3
      Terminal.Gui/ConsoleDrivers/WindowsDriver/WindowsMainLoop.cs

+ 5 - 3
Terminal.Gui/ConsoleDrivers/NetDriver/NetMainLoop.cs

@@ -1,5 +1,7 @@
 #nullable enable
 
+using System.Collections.Concurrent;
+
 namespace Terminal.Gui;
 
 /// <summary>
@@ -18,7 +20,7 @@ internal class NetMainLoop : IMainLoopDriver
     internal readonly ManualResetEventSlim _waitForProbe = new (false);
     private readonly CancellationTokenSource _eventReadyTokenSource = new ();
     private readonly CancellationTokenSource _inputHandlerTokenSource = new ();
-    private readonly Queue<NetEvents.InputResult> _resultQueue = new ();
+    private readonly ConcurrentQueue<NetEvents.InputResult> _resultQueue = new ();
     private MainLoop? _mainLoop;
     bool IMainLoopDriver._forceRead { get; set; }
     ManualResetEventSlim IMainLoopDriver._waitForInput { get; set; } = new (false);
@@ -89,9 +91,9 @@ internal class NetMainLoop : IMainLoopDriver
 
     void IMainLoopDriver.Iteration ()
     {
-        while (_resultQueue.Count > 0)
+        while (_resultQueue.TryDequeue (out NetEvents.InputResult inputRecords))
         {
-            ProcessInput?.Invoke (_resultQueue.Dequeue ());
+            ProcessInput?.Invoke (inputRecords);
         }
     }
 

+ 5 - 3
Terminal.Gui/ConsoleDrivers/WindowsDriver/WindowsMainLoop.cs

@@ -1,5 +1,7 @@
 #nullable enable
 
+using System.Collections.Concurrent;
+
 namespace Terminal.Gui;
 
 /// <summary>
@@ -20,7 +22,7 @@ internal class WindowsMainLoop : IMainLoopDriver
     private readonly ManualResetEventSlim _eventReady = new (false);
 
     // The records that we keep fetching
-    private readonly Queue<WindowsConsole.InputRecord> _resultQueue = new ();
+    private readonly ConcurrentQueue<WindowsConsole.InputRecord> _resultQueue = new ();
     ManualResetEventSlim IMainLoopDriver._waitForInput { get; set; } = new (false);
     private readonly WindowsConsole? _winConsole;
     private CancellationTokenSource _eventReadyTokenSource = new ();
@@ -102,9 +104,9 @@ internal class WindowsMainLoop : IMainLoopDriver
 
     void IMainLoopDriver.Iteration ()
     {
-        while (_resultQueue.Count > 0)
+        while (_resultQueue.TryDequeue (out WindowsConsole.InputRecord inputRecords))
         {
-            ((WindowsDriver)_consoleDriver).ProcessInput (_resultQueue.Dequeue ());
+            ((WindowsDriver)_consoleDriver).ProcessInput (inputRecords);
         }
 #if HACK_CHECK_WINCHANGED
         if (_winChanged)