Merge pull request #2373 from akoeplinger/servicemodel-tcpreplychannel-race
authorJoão Matos <joao@tritao.eu>
Mon, 21 Dec 2015 17:44:41 +0000 (17:44 +0000)
committerJoão Matos <joao@tritao.eu>
Mon, 21 Dec 2015 17:44:41 +0000 (17:44 +0000)
[ServiceModel] Make TcpReplyChannel.OnClose thread-safe

mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpReplyChannel.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels.NetTcp/TcpReplyChannel.cs

index 03e7cad1f1c4f7eff0afaab6e7c41ebd1801f848..098b622aa836a1ca86cba5c3fd4e1872fbc0aee8 100644 (file)
@@ -104,12 +104,15 @@ namespace System.ServiceModel.Channels.Http
                }
 
                bool close_started;
+               object close_lock = new object ();
 
                protected override void OnClose (TimeSpan timeout)
                {
-                       if (close_started)
-                               return;
-                       close_started = true;
+                       lock (close_lock) {
+                               if (close_started)
+                                       return;
+                               close_started = true;
+                       }
                        DateTime start = DateTime.Now;
 
                        // FIXME: consider timeout
index f597167e9d179208b468a7eed16c2fa12caff5c1..b005ad6c18a06fef5ffcb22513f9eb31f318e041 100644 (file)
@@ -135,9 +135,18 @@ namespace System.ServiceModel.Channels.NetTcp
                {
                        throw new NotImplementedException ();
                }
+               
+               bool close_started;
+               object close_lock = new object ();
 
                protected override void OnClose (TimeSpan timeout)
                {
+                       lock (close_lock) {
+                               if (close_started)
+                                       return;
+                               close_started = true;
+                       }
+
                        client.Close ();
                        client = null;
                        base.OnClose (timeout);