[jboss-cvs] JBossAS SVN: r110063 - projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Dec 21 04:59:01 EST 2010


Author: jesper.pedersen
Date: 2010-12-21 04:59:01 -0500 (Tue, 21 Dec 2010)
New Revision: 110063

Modified:
   projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnection.java
   projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrappedConnection.java
Log:
[JBJCA-483] Potential dead lock

Modified: projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnection.java
===================================================================
--- projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnection.java	2010-12-21 09:51:09 UTC (rev 110062)
+++ projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnection.java	2010-12-21 09:59:01 UTC (rev 110063)
@@ -82,7 +82,7 @@
 
    private final boolean readOnly;
 
-   private ReentrantLock lock = new ReentrantLock();
+   private ReentrantLock lock = new ReentrantLock(true);
 
    private final Collection<ConnectionEventListener> cels = new ArrayList<ConnectionEventListener>();
 
@@ -300,7 +300,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);
    }
 
    /**
@@ -340,7 +340,8 @@
     */
    protected void unlock()
    {
-      lock.unlock();
+      if (lock.isHeldByCurrentThread())
+         lock.unlock();
    }
 
    /**

Modified: projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrappedConnection.java
===================================================================
--- projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrappedConnection.java	2010-12-21 09:51:09 UTC (rev 110062)
+++ projects/jboss-jca/trunk/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrappedConnection.java	2010-12-21 09:59:01 UTC (rev 110063)
@@ -49,7 +49,9 @@
 {
    private static Logger log = Logger.getLogger(WrappedConnection.class);
 
-   private BaseWrapperManagedConnection mc;
+   private volatile BaseWrapperManagedConnection mc;
+   private BaseWrapperManagedConnection lockedMC;
+   private int lockCount;
 
    private WrapperDataSource dataSource;
 
@@ -90,6 +92,10 @@
       if (mc != null)
       {
          mc.tryLock();
+         if (lockedMC == null)
+            lockedMC = mc;
+
+         lockCount++ ;
       }
       else
       {
@@ -102,12 +108,12 @@
     */
    protected void unlock()
    {
-      BaseWrapperManagedConnection mc = this.mc;
+      BaseWrapperManagedConnection mc = this.lockedMC;
+      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