Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / System / System.Net.Sockets / Socket.cs
index 52b9a5013f2700deef747ba731ca614392771a3d..763bc3462f422e907943bb3439a3aa1fb0478b2c 100644 (file)
@@ -55,6 +55,7 @@ namespace System.Net.Sockets
        {
                private bool islistening;
                private bool useoverlappedIO;
+               private const int SOCKET_CLOSED = 10004;
 
                static void AddSockets (List<Socket> sockets, IList list, string name)
                {
@@ -543,21 +544,19 @@ namespace System.Net.Sockets
 
                        int error = 0;
                        IntPtr sock = (IntPtr) (-1);
-                       blocking_thread = Thread.CurrentThread;
                        try {
+                               RegisterForBlockingSyscall ();
                                sock = Accept_internal(socket, out error, blocking);
-                       } catch (ThreadAbortException) {
-                               if (disposed) {
-                                       Thread.ResetAbort ();
-                                       error = (int) SocketError.Interrupted;
-                               }
                        } finally {
-                               blocking_thread = null;
+                               UnRegisterForBlockingSyscall ();
+                       }
+
+                       if (error != 0) {
+                               if (closed)
+                                       error = SOCKET_CLOSED;
+                               throw new SocketException(error);
                        }
 
-                       if (error != 0)
-                               throw new SocketException (error);
-                       
                        Socket accepted = new Socket(this.AddressFamily, this.SocketType,
                                this.ProtocolType, sock);
 
@@ -573,21 +572,19 @@ namespace System.Net.Sockets
                        
                        int error = 0;
                        IntPtr sock = (IntPtr)(-1);
-                       blocking_thread = Thread.CurrentThread;
                        
                        try {
+                               RegisterForBlockingSyscall ();
                                sock = Accept_internal (socket, out error, blocking);
-                       } catch (ThreadAbortException) {
-                               if (disposed) {
-                                       Thread.ResetAbort ();
-                                       error = (int)SocketError.Interrupted;
-                               }
                        } finally {
-                               blocking_thread = null;
+                               UnRegisterForBlockingSyscall ();
                        }
                        
-                       if (error != 0)
+                       if (error != 0) {
+                               if (closed)
+                                       error = SOCKET_CLOSED;
                                throw new SocketException (error);
+                       }
                        
                        acceptSocket.address_family = this.AddressFamily;
                        acceptSocket.socket_type = this.SocketType;
@@ -756,8 +753,8 @@ namespace System.Net.Sockets
                        if (offset > buffer.Length)
                                throw new ArgumentOutOfRangeException ("offset", "offset must be <= buffer.Length");
 
-                       if (size < 0)
-                               throw new ArgumentOutOfRangeException ("size", "size must be >= 0")
+                       if (size < 0)                          
+                               throw new ArgumentOutOfRangeException ("size", "size must be >= 0");
                                
                        if (size > buffer.Length - offset)
                                throw new ArgumentOutOfRangeException ("size", "size must be <= buffer.Length - offset");
@@ -1620,10 +1617,9 @@ namespace System.Net.Sockets
                        res.Size = e.Count;
                        res.EndPoint = e.RemoteEndPoint;
                        res.SockFlags = e.SocketFlags;
-                       Worker worker = new Worker (e);
                        int count;
                        lock (readQ) {
-                               readQ.Enqueue (worker);
+                               readQ.Enqueue (e.Worker);
                                count = readQ.Count;
                        }
                        if (count == 1)
@@ -1941,10 +1937,9 @@ namespace System.Net.Sockets
                        res.Size = e.Count;
                        res.SockFlags = e.SocketFlags;
                        res.EndPoint = e.RemoteEndPoint;
-                       Worker worker = new Worker (e);
                        int count;
                        lock (writeQ) {
-                               writeQ.Enqueue (worker);
+                               writeQ.Enqueue (e.Worker);
                                count = writeQ.Count;
                        }
                        if (count == 1)