瀏覽代碼

Returns ansiRequest.Response instead of a variable for more thread safe.

BDisp 9 月之前
父節點
當前提交
7921ae35f7

+ 10 - 9
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -217,8 +217,6 @@ internal class CursesDriver : ConsoleDriver
             return string.Empty;
             return string.Empty;
         }
         }
 
 
-        var response = string.Empty;
-
         try
         try
         {
         {
             lock (ansiRequest._responseLock)
             lock (ansiRequest._responseLock)
@@ -226,8 +224,7 @@ internal class CursesDriver : ConsoleDriver
                 ansiRequest.ResponseFromInput += (s, e) =>
                 ansiRequest.ResponseFromInput += (s, e) =>
                                                  {
                                                  {
                                                      Debug.Assert (s == ansiRequest);
                                                      Debug.Assert (s == ansiRequest);
-
-                                                     ansiRequest.Response = response = e;
+                                                     Debug.Assert (e == ansiRequest.Response);
 
 
                                                      _waitAnsiResponse.Set ();
                                                      _waitAnsiResponse.Set ();
                                                  };
                                                  };
@@ -248,7 +245,8 @@ internal class CursesDriver : ConsoleDriver
         {
         {
             return string.Empty;
             return string.Empty;
         }
         }
-        finally
+
+        lock (ansiRequest._responseLock)
         {
         {
             _mainLoopDriver._forceRead = false;
             _mainLoopDriver._forceRead = false;
 
 
@@ -257,15 +255,18 @@ internal class CursesDriver : ConsoleDriver
                 if (_mainLoopDriver.EscSeqRequests.Statuses.Count > 0
                 if (_mainLoopDriver.EscSeqRequests.Statuses.Count > 0
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                 {
                 {
-                    // Bad request or no response at all
-                    _mainLoopDriver.EscSeqRequests.Statuses.TryDequeue (out _);
+                    lock (request!.AnsiRequest._responseLock)
+                    {
+                        // Bad request or no response at all
+                        _mainLoopDriver.EscSeqRequests.Statuses.TryDequeue (out _);
+                    }
                 }
                 }
             }
             }
 
 
             _waitAnsiResponse.Reset ();
             _waitAnsiResponse.Reset ();
-        }
 
 
-        return response;
+            return ansiRequest.Response;
+        }
     }
     }
 
 
     /// <inheritdoc />
     /// <inheritdoc />

+ 10 - 9
Terminal.Gui/ConsoleDrivers/NetDriver.cs

@@ -1502,8 +1502,6 @@ internal class NetDriver : ConsoleDriver
             return string.Empty;
             return string.Empty;
         }
         }
 
 
-        var response = string.Empty;
-
         try
         try
         {
         {
             lock (ansiRequest._responseLock)
             lock (ansiRequest._responseLock)
@@ -1511,8 +1509,7 @@ internal class NetDriver : ConsoleDriver
                 ansiRequest.ResponseFromInput += (s, e) =>
                 ansiRequest.ResponseFromInput += (s, e) =>
                                                  {
                                                  {
                                                      Debug.Assert (s == ansiRequest);
                                                      Debug.Assert (s == ansiRequest);
-
-                                                     ansiRequest.Response = response = e;
+                                                     Debug.Assert (e == ansiRequest.Response);
 
 
                                                      _waitAnsiResponse.Set ();
                                                      _waitAnsiResponse.Set ();
                                                  };
                                                  };
@@ -1538,7 +1535,8 @@ internal class NetDriver : ConsoleDriver
         {
         {
             return string.Empty;
             return string.Empty;
         }
         }
-        finally
+
+        lock (ansiRequest._responseLock)
         {
         {
             _mainLoopDriver._netEvents._forceRead = false;
             _mainLoopDriver._netEvents._forceRead = false;
 
 
@@ -1547,15 +1545,18 @@ internal class NetDriver : ConsoleDriver
                 if (_mainLoopDriver._netEvents.EscSeqRequests.Statuses.Count > 0
                 if (_mainLoopDriver._netEvents.EscSeqRequests.Statuses.Count > 0
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                 {
                 {
-                    // Bad request or no response at all
-                    _mainLoopDriver._netEvents.EscSeqRequests.Statuses.TryDequeue (out _);
+                    lock (request!.AnsiRequest._responseLock)
+                    {
+                        // Bad request or no response at all
+                        _mainLoopDriver._netEvents.EscSeqRequests.Statuses.TryDequeue (out _);
+                    }
                 }
                 }
             }
             }
 
 
             _waitAnsiResponse.Reset ();
             _waitAnsiResponse.Reset ();
-        }
 
 
-        return response;
+            return ansiRequest.Response;
+        }
     }
     }
 
 
     /// <inheritdoc />
     /// <inheritdoc />

+ 10 - 9
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -1311,8 +1311,6 @@ internal class WindowsDriver : ConsoleDriver
             return string.Empty;
             return string.Empty;
         }
         }
 
 
-        var response = string.Empty;
-
         try
         try
         {
         {
             lock (ansiRequest._responseLock)
             lock (ansiRequest._responseLock)
@@ -1320,8 +1318,7 @@ internal class WindowsDriver : ConsoleDriver
                 ansiRequest.ResponseFromInput += (s, e) =>
                 ansiRequest.ResponseFromInput += (s, e) =>
                                                  {
                                                  {
                                                      Debug.Assert (s == ansiRequest);
                                                      Debug.Assert (s == ansiRequest);
-
-                                                     ansiRequest.Response = response = e;
+                                                     Debug.Assert (e == ansiRequest.Response);
 
 
                                                      _waitAnsiResponse.Set ();
                                                      _waitAnsiResponse.Set ();
                                                  };
                                                  };
@@ -1342,7 +1339,8 @@ internal class WindowsDriver : ConsoleDriver
         {
         {
             return string.Empty;
             return string.Empty;
         }
         }
-        finally
+
+        lock (ansiRequest._responseLock)
         {
         {
             _mainLoopDriver._forceRead = false;
             _mainLoopDriver._forceRead = false;
 
 
@@ -1351,15 +1349,18 @@ internal class WindowsDriver : ConsoleDriver
                 if (_mainLoopDriver.EscSeqRequests.Statuses.Count > 0
                 if (_mainLoopDriver.EscSeqRequests.Statuses.Count > 0
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                 {
                 {
-                    // Bad request or no response at all
-                    _mainLoopDriver.EscSeqRequests.Statuses.TryDequeue (out _);
+                    lock (request!.AnsiRequest._responseLock)
+                    {
+                        // Bad request or no response at all
+                        _mainLoopDriver.EscSeqRequests.Statuses.TryDequeue (out _);
+                    }
                 }
                 }
             }
             }
 
 
             _waitAnsiResponse.Reset ();
             _waitAnsiResponse.Reset ();
-        }
 
 
-        return response;
+            return ansiRequest.Response;
+        }
     }
     }
 
 
     public override void WriteRaw (string ansi)
     public override void WriteRaw (string ansi)