Adapt to changes in exceptions policy for TP.
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Wed, 28 Jul 2010 02:32:03 +0000 (22:32 -0400)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 30 Jul 2010 05:54:00 +0000 (01:54 -0400)
These exception were being thrown, sometimes, in a threadpool thread and then
ignored.

mcs/class/System/System.Net/FileWebRequest.cs
mcs/class/System/System.Net/FileWebResponse.cs
mcs/class/System/System.Net/WebConnectionStream.cs
mono/metadata/threadpool.c

index c42b439007f00d65a8255dce40389ae1b906b5ef..08c2d00c075b9294fe7e5872e8a5d11ddf619eda 100644 (file)
@@ -262,8 +262,10 @@ namespace System.Net
                                asyncResult.AsyncWaitHandle.WaitOne ();\r
                        AsyncResult async = (AsyncResult) asyncResult;\r
                        GetResponseCallback cb = (GetResponseCallback) async.AsyncDelegate;\r
-                       WebResponse webResponse = cb.EndInvoke(asyncResult);\r
+                       FileWebResponse webResponse = (FileWebResponse) cb.EndInvoke(asyncResult);\r
                        asyncResponding = false;\r
+                       if (webResponse.HasError)\r
+                               throw webResponse.Error;\r
                        return webResponse;\r
                }\r
                \r
@@ -290,13 +292,12 @@ namespace System.Net
                        }\r
                        FileStream fileStream = null;\r
                        try {\r
-                               fileStream = new FileWebStream (this, FileMode.Open,\r
-                                FileAccess.Read, FileShare.Read);\r
+                               fileStream = new FileWebStream (this, FileMode.Open, FileAccess.Read, FileShare.Read);\r
+                               this.webResponse = new FileWebResponse (this.uri, fileStream);\r
                        } catch (Exception ex) {\r
-                               throw new WebException (ex.Message, ex);\r
+                               this.webResponse = new FileWebResponse (this.uri, new WebException (ex.Message, ex));\r
                        }\r
-                       this.webResponse = new FileWebResponse (this.uri, fileStream);\r
-                       return (WebResponse) this.webResponse;\r
+                       return this.webResponse;\r
                }\r
                \r
                void ISerializable.GetObjectData (SerializationInfo serializationInfo, StreamingContext streamingContext)\r
index 5cb13b41834e39acd416e5f4c563818ceddd4a53..1c9cd126bd2cbb851ef5965be11442af1b0e9cf6 100644 (file)
@@ -39,7 +39,8 @@ namespace System.Net
                private FileStream fileStream;\r
                private long contentLength;\r
                private WebHeaderCollection webHeaders;\r
-               private bool disposed = false;\r
+               private bool disposed;\r
+               Exception exception;\r
                \r
                // Constructors\r
                \r
@@ -56,6 +57,12 @@ namespace System.Net
                                throw new WebException (e.Message, e);\r
                        }\r
                }\r
+\r
+               internal FileWebResponse (Uri responseUri, WebException exception)\r
+               {\r
+                       this.responseUri = responseUri;\r
+                       this.exception = exception;\r
+               }\r
                \r
 #if NET_2_0\r
                [Obsolete ("Serialization is obsoleted for this type", false)]\r
@@ -70,6 +77,13 @@ namespace System.Net
                }\r
                \r
                // Properties\r
+               internal bool HasError {\r
+                       get { return exception != null; }\r
+               }\r
+\r
+               internal Exception Error {\r
+                       get { return exception; }\r
+               }\r
                \r
                public override long ContentLength {\r
                        get {\r
index bafd6e73259da84bd673ebb43c1d6ff324f8cb91..0b71f79044c6f5ba75308321d5d99ecaaf111de6 100644 (file)
@@ -301,7 +301,10 @@ namespace System.Net
                                result.InnerAsyncResult = r;
                                result.DoCallback ();
                        } else {
-                               EndRead (r);
+                               try {
+                                       EndRead (r);
+                               } catch {
+                               }
                        }
                }
 
index 1d42b2cfbb879c76dd7f748e1ad97dff2ba46bde..80316a127c7c4876d6fddd7ed9fb670c5d65558f 100755 (executable)
@@ -1852,7 +1852,7 @@ async_invoke_thread (gpointer data)
                                        if (tp_item_end_func)
                                                tp_item_end_func (tp_item_user_data);
                                        ac = (ASyncCall *) ar->object_data;
-                                       if (ac->msg->exc != NULL)
+                                       if (ac && ac->msg && ac->msg->exc != NULL)
                                                mono_unhandled_exception (ac->msg->exc);
                                        mono_domain_set (mono_get_root_domain (), TRUE);
                                }