[jboss-cvs] JBossAS SVN: r110066 - branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Dec 21 05:33:34 EST 2010


Author: jesper.pedersen
Date: 2010-12-21 05:33:34 -0500 (Tue, 21 Dec 2010)
New Revision: 110066

Modified:
   branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsManagedConnection.java
   branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsSession.java
Log:
[JBPAPP-5596] Potential dead-lock (JMS)

Modified: branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsManagedConnection.java
===================================================================
--- branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsManagedConnection.java	2010-12-21 10:30:21 UTC (rev 110065)
+++ branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsManagedConnection.java	2010-12-21 10:33:34 UTC (rev 110066)
@@ -144,7 +144,7 @@
    private String pwd;
    private boolean isDestroyed;
 
-   private ReentrantLock lock = new ReentrantLock();
+   private ReentrantLock lock = new ReentrantLock(true);
    
    // Physical JMS connection stuff
    private Connection con;
@@ -359,7 +359,7 @@
       // because it looks too nasty to expect the connection handle
       // to unlock properly in certain race conditions
       // where the dissociation of the managed connection is "random".
-      lock = new ReentrantLock();
+      lock = new ReentrantLock(true);
    }
 
    /**
@@ -414,7 +414,8 @@
    
    protected void unlock()
    {
-      lock.unlock();
+      if (lock.isHeldByCurrentThread())
+         lock.unlock();
    }
 
    /**

Modified: branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsSession.java
===================================================================
--- branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsSession.java	2010-12-21 10:30:21 UTC (rev 110065)
+++ branches/JBPAPP_5_1/connector/src/main/org/jboss/resource/adapter/jms/JmsSession.java	2010-12-21 10:33:34 UTC (rev 110066)
@@ -68,7 +68,9 @@
    private static final Logger log = Logger.getLogger(JmsSession.class);
 
    /** The managed connection for this session. */
-   private JmsManagedConnection mc; // = null;
+   private volatile JmsManagedConnection mc;
+   private JmsManagedConnection lockedMC;
+   private int lockCount;
 
    /** The connection request info */
    private JmsConnectionRequestInfo info;
@@ -107,7 +109,14 @@
    {
       JmsManagedConnection mc = this.mc;
       if (mc != null)
+      {
          mc.tryLock();
+
+         if (lockedMC == null)
+            lockedMC = mc;
+
+         lockCount++;
+      }
       else
          throw new IllegalStateException("Connection is not associated with a managed connection. " + this);
    }
@@ -115,10 +124,11 @@
    protected void unlock()
    {
       JmsManagedConnection mc = this.mc;
+      if (--lockCount == 0)
+         lockedMC = null;
+
       if (mc != null)
          mc.unlock();
-      // We recreate the lock when returned to the pool
-      // so missing the unlock after disassociation is not important
    }
    
    /**



More information about the jboss-cvs-commits mailing list