[sdb] Fix deadlock in case of runtime disconnect while fetching frames(Bug 24434)
authorDavid Karlaš <david.karlas@xamarin.com>
Sat, 17 Jan 2015 15:14:52 +0000 (16:14 +0100)
committerDavid Karlaš <david.karlas@xamarin.com>
Sat, 17 Jan 2015 15:24:30 +0000 (16:24 +0100)
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ThreadMirror.cs

index 5350491dc0be8e5288cf2915ef9e765049223ac9..5499fef1cf6f3c2e025e5de0b880db253af50393 100644 (file)
@@ -1216,6 +1216,8 @@ namespace Mono.Debugger.Soft
 
                bool disconnected;
 
+               internal ManualResetEvent DisconnectedEvent = new ManualResetEvent (false);
+
                void receiver_thread_main () {
                        while (!closed) {
                                try {
@@ -1232,6 +1234,7 @@ namespace Mono.Debugger.Soft
 
                        lock (reply_packets_monitor) {
                                disconnected = true;
+                               DisconnectedEvent.Set ();
                                Monitor.PulseAll (reply_packets_monitor);
                                TransportClose ();
                        }
@@ -2475,6 +2478,7 @@ namespace Mono.Debugger.Soft
                {
                        closed = true;
                        disconnected = true;
+                       DisconnectedEvent.Set ();
                        TransportClose ();
                }
        }
index 541118d66d6cc1ad4b6c4f0f8bdc681891d68b58..5dbe5eb1fb55ca07d0d30e5f8a4bd57d399dd1bf 100644 (file)
@@ -22,7 +22,9 @@ namespace Mono.Debugger.Soft
 
                public StackFrame[] GetFrames () {
                        FetchFrames (true);
-                       fetchingEvent.WaitOne ();
+                       if (WaitHandle.WaitAny (new []{ vm.conn.DisconnectedEvent, fetchingEvent }) == 0) {
+                               throw new VMDisconnectedException ();
+                       }
                        return frames;
                }