Adapt to new exception in threadpool behavior.
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Wed, 11 Aug 2010 17:13:11 +0000 (13:13 -0400)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Wed, 11 Aug 2010 17:15:39 +0000 (13:15 -0400)
Since an exception in the threadpool can kill the application,
silently ignore it when we know it is not harmful.

mcs/class/Mono.Posix/Mono.Remoting.Channels.Unix/UnixClientTransportSink.cs
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs
mcs/class/System.Web/System.Web/HttpRuntime.cs
mcs/class/System.Web/Test/TestMonoWeb/AsyncOperation.cs
mcs/class/System.Web/Test/mainsoft/NunitWeb/NunitWeb/MyHost.cs
mcs/class/System/System.Net/WebConnection.cs
mcs/class/corlib/System.Runtime.Remoting.Channels/CrossAppDomainChannel.cs
mcs/class/corlib/System.Runtime.Remoting.Messaging/StackBuilderSink.cs
mcs/class/corlib/System.Threading/RegisteredWaitHandle.cs
mcs/class/corlib/System.Threading/Timer.cs

index 11cd0fdd62c4f5a1f6259341641dc46dd37c9a67..4b5a1aa2a2a299f1c064ddc81ae221c0780c7699 100644 (file)
@@ -87,7 +87,11 @@ namespace Mono.Remoting.Channels.Unix
                                if (!isOneWay) 
                                {
                                        sinkStack.Push (this, connection);
-                                       ThreadPool.QueueUserWorkItem (new WaitCallback(ReadAsyncUnixMessage), sinkStack);
+                                       ThreadPool.QueueUserWorkItem (new WaitCallback(data => {
+                                               try {
+                                                       ReadAsyncUnixMessage (data);
+                                               } catch {}
+                                               }), sinkStack);
                                }
                                else
                                        connection.Release();
index 03f4a97176cbf73a52a76ee89775274e82ddc363..df0f08501bddd3c8a13dacc27262484deb372c26 100644 (file)
@@ -99,7 +99,11 @@ namespace System.Runtime.Remoting.Channels.Tcp
                                if (!isOneWay) 
                                {
                                        sinkStack.Push (this, connection);
-                                       ThreadPool.QueueUserWorkItem (new WaitCallback(ReadAsyncTcpMessage), sinkStack);
+                                       ThreadPool.QueueUserWorkItem (new WaitCallback(data => {
+                                               try {
+                                                       ReadAsyncTcpMessage (data);
+                                               } catch {}
+                                               }), sinkStack);
                                }
                                else
                                        connection.Release();
index 1e184ba3974e5f69908c830447521266e0a5dd54..f960e70fdf79ca1557361dd4f49175ce76453e83 100644 (file)
@@ -154,7 +154,11 @@ namespace System.Web
                        internalCache = new Cache ();
                        internalCache.DependencyCache = internalCache;
 #endif
-                       do_RealProcessRequest = new WaitCallback (RealProcessRequest);
+                       do_RealProcessRequest = new WaitCallback (state => {
+                               try {
+                                       RealProcessRequest (state);
+                               } catch {}
+                               });
                }
                
 #region AppDomain handling
index 0188aea855a76780f4e80c28ee2bb61016c10457..0dea47886783990dbfa60259c2fce561618b3696 100644 (file)
@@ -36,7 +36,9 @@ namespace TestMonoWeb
                        // Just for testing..
                        Thread.Sleep(100);
                        _completed = true;
-                       _callback(this);
+                       try {
+                               _callback(this);
+                       } catch {}
                }
        }
 }
index 2465a7976d5e7433c4215256e370e2d61272fc64..0b1254fa5ea893be677c4e74d039c91de9eef0ef 100644 (file)
@@ -35,7 +35,11 @@ namespace MonoTests.SystemWeb.Framework
                {
                        _done = new AutoResetEvent (false);
                        _doNext = new AutoResetEvent (false);
-                       ThreadPool.QueueUserWorkItem (new WaitCallback (AsyncRun), null);
+                       ThreadPool.QueueUserWorkItem (new WaitCallback (param => {
+                               try {
+                                       AsyncRun (param);
+                               } catch {}
+                               }), null);
                }
 
                public AppDomain AppDomain
index 6cb5e1c7f2d9786bd07c435051c29cc80561f57e..421bbec42bc9440a009aa5331e34c6b72e1b05f9 100644 (file)
@@ -100,7 +100,11 @@ namespace System.Net
                        buffer = new byte [4096];
                        readState = ReadState.None;
                        Data = new WebConnectionData ();
-                       initConn = new WaitCallback (InitConnection);
+                       initConn = new WaitCallback (state => {
+                               try {
+                                       InitConnection (state);
+                               } catch {}
+                               });
                        queue = group.Queue;
                        abortHelper = new AbortHelper ();
                        abortHelper.Connection = this;
index 033977fb79c17b464cc33647a063830f5c65caca..9fc2f723a1fb5fb930cd8321dfe1b07636893d1d 100644 (file)
@@ -267,7 +267,12 @@ namespace System.Runtime.Remoting.Channels
                public virtual IMessageCtrl AsyncProcessMessage (IMessage reqMsg, IMessageSink replySink) 
                {
                        AsyncRequest req = new AsyncRequest (reqMsg, replySink);
-                       ThreadPool.QueueUserWorkItem (new WaitCallback (SendAsyncMessage), req);
+                       ThreadPool.QueueUserWorkItem (new WaitCallback ((data) => {
+                               try {
+                                       SendAsyncMessage (data);
+                               } catch {}
+                               }
+                               ), req);
                        return null;
                }
                
index ed064e430643ee5c0beef8393de236f6228684ff..4ff584de5c4b22f8f911227513cde5be0556545e 100644 (file)
@@ -62,7 +62,12 @@ namespace System.Runtime.Remoting.Messaging
                public IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink)
                {
                        object[] parms = new object[] {msg, replySink};
-                       ThreadPool.QueueUserWorkItem (new WaitCallback (ExecuteAsyncMessage), parms);
+                       ThreadPool.QueueUserWorkItem (new WaitCallback ((data) => {
+                               try {
+                                       ExecuteAsyncMessage (data);
+                               } catch {}
+                               }
+                               ), parms);
                        return null;
                }
                
index 3c2fbfa156d69e109a8320cb0bced64c19d14ef3..62e349e648b1060b33c4877794da5cff0cff6efd 100644 (file)
@@ -88,8 +88,11 @@ namespace System.Threading
 
                private void DoCallBack (object timedOut)
                {
-                       if (_callback != null)
-                               _callback (_state, (bool)timedOut); 
+                       if (_callback != null) {
+                               try {
+                                       _callback (_state, (bool)timedOut); 
+                               } catch {}
+                       }
 
                        lock (this) 
                        {
index d0f9a6562354699d9bea9fdf3ab996f06612a008..ab2193b95feb8620ad79d09e7233adcdafc86fcf 100644 (file)
@@ -288,7 +288,11 @@ namespace System.Threading
                                                        list.RemoveAt (i);
                                                        count--;
                                                        i--;
-                                                       ThreadPool.QueueUserWorkItem (new WaitCallback (timer.callback), timer.state);
+                                                       ThreadPool.QueueUserWorkItem (new WaitCallback (data => {
+                                                               try {
+                                                                       timer.callback (data);
+                                                               } catch {}
+                                                               }), timer.state);
                                                        long period = timer.period_ms;
                                                        long due_time = timer.due_time_ms;
                                                        bool no_more = (period == -1 || ((period == 0 || period == Timeout.Infinite) && due_time != Timeout.Infinite));