activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jgo...@apache.org
Subject svn commit: r1550242 - /activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs
Date Wed, 11 Dec 2013 19:57:05 GMT
Author: jgomes
Date: Wed Dec 11 19:57:05 2013
New Revision: 1550242

URL: http://svn.apache.org/r1550242
Log:
Move the blocking code outside of the lock section to avoid race condition when shutting down.
Fixes [AMQNET-338]. (See https://issues.apache.org/jira/browse/AMQNET-338)

Modified:
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs

Modified: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs?rev=1550242&r1=1550241&r2=1550242&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs
(original)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Transport/Tcp/TcpTransport.cs
Wed Dec 11 19:57:05 2013
@@ -40,8 +40,8 @@ namespace Apache.NMS.Stomp.Transport.Tcp
         private readonly Atomic<bool> closed = new Atomic<bool>(false);
         private volatile bool seenShutdown;
         private readonly Uri connectedUri;
-		private int timeout = -1;
-		private int asynctimeout = -1;
+        private int timeout = -1;
+        private int asynctimeout = -1;
 
         private CommandHandler commandHandler;
         private ExceptionHandler exceptionHandler;
@@ -168,6 +168,8 @@ namespace Apache.NMS.Stomp.Transport.Tcp
 
         public void Close()
         {
+            Thread theReadThread = null;
+
             if(closed.CompareAndSet(false, true))
             {
                 lock(myLock)
@@ -218,24 +220,30 @@ namespace Apache.NMS.Stomp.Transport.Tcp
                     {
                     }
 
-                    if(null != readThread)
-                    {
-                        if(Thread.CurrentThread != readThread
+                    theReadThread = this.readThread;
+                    this.readThread = null;
+                    started = false;
+                }
+            }
+
+            if(null != theReadThread)
+            {
+                try
+                {
+                    if(Thread.CurrentThread != theReadThread
 #if !NETCF
- && readThread.IsAlive
+ && theReadThread.IsAlive
 #endif
 )
+                    {
+                        if(!theReadThread.Join((int) MAX_THREAD_WAIT.TotalMilliseconds))
                         {
-                            if(!readThread.Join((int) MAX_THREAD_WAIT.TotalMilliseconds))
-                            {
-                                readThread.Abort();
-                            }
+                            theReadThread.Abort();
                         }
-
-                        readThread = null;
                     }
-
-                    started = false;
+                }
+                catch
+                {
                 }
             }
         }
@@ -316,27 +324,27 @@ namespace Apache.NMS.Stomp.Transport.Tcp
 
         // Implementation methods
 
-		/// <summary>
-		/// Timeout in milliseconds to wait for sending synchronous messages or commands.
-		/// Set to -1 for infinite timeout.
-		/// </summary>
-		public int Timeout
-		{
-			get { return this.timeout; }
-			set { this.timeout = value; }
-		}
-
-		/// <summary>
-		/// Timeout in milliseconds to wait for sending asynchronous messages or commands.
-		/// Set to -1 for infinite timeout.
-		/// </summary>
-		public int AsyncTimeout
-		{
-			get { return this.asynctimeout; }
-			set { this.asynctimeout = value; }
-		}
+        /// <summary>
+        /// Timeout in milliseconds to wait for sending synchronous messages or commands.
+        /// Set to -1 for infinite timeout.
+        /// </summary>
+        public int Timeout
+        {
+            get { return this.timeout; }
+            set { this.timeout = value; }
+        }
+
+        /// <summary>
+        /// Timeout in milliseconds to wait for sending asynchronous messages or commands.
+        /// Set to -1 for infinite timeout.
+        /// </summary>
+        public int AsyncTimeout
+        {
+            get { return this.asynctimeout; }
+            set { this.asynctimeout = value; }
+        }
 
-		public CommandHandler Command
+        public CommandHandler Command
         {
             get { return commandHandler; }
             set { this.commandHandler = value; }



Mime
View raw message