Author: sandymac
Date: Sat Mar 25 00:01:42 2006
New Revision: 388727

URL: http://svn.apache.org/viewcvs?rev=388727&view=rev
Log:
Made idle object eviction synchronize on just the one idle object and not on 
the whole pool.

Modified:
    
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/EvictorLender.java
    
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/IdleEvictorLender.java
    
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/InvalidEvictorLender.java

Modified: 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/EvictorLender.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/EvictorLender.java?rev=388727&r1=388726&r2=388727&view=diff
==============================================================================
--- 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/EvictorLender.java
 (original)
+++ 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/EvictorLender.java
 Sat Mar 25 00:01:42 2006
@@ -60,8 +60,10 @@
         final EvictorReference ref = (EvictorReference)super.borrow();
         Object obj = null;
         if (ref != null) {
-            obj = ref.get();
-            ref.clear();
+            synchronized (ref) {
+                obj = ref.get();
+                ref.clear();
+            }
         }
         return obj;
     }
@@ -92,7 +94,7 @@
                 final Iterator iter = super.listIterator();
                 while (iter.hasNext()) {
                     final EvictorReference ref = (EvictorReference)iter.next();
-                    if (ref.get() == null) {
+                    if (ref != null && ref.get() == null) {
                         iter.remove();
                     }
                 }
@@ -124,6 +126,9 @@
     /**
      * This is designed to mimick the [EMAIL PROTECTED] Reference} api.
      * The only reason a [EMAIL PROTECTED] Reference} subclass isn't used is 
there is no "StrongReference" implementation.
+     * Because evictors run in a different thread, implementations must be 
thread safe and callers need to
+     * synchronize on the <code>EvictorReference</code> if they need to call 
more than one method in a thread
+     * safe manner.
      */
     protected interface EvictorReference extends LenderReference {
         /**

Modified: 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/IdleEvictorLender.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/IdleEvictorLender.java?rev=388727&r1=388726&r2=388727&view=diff
==============================================================================
--- 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/IdleEvictorLender.java
 (original)
+++ 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/IdleEvictorLender.java
 Sat Mar 25 00:01:42 2006
@@ -100,15 +100,19 @@
         }
 
         public Object get() {
-            return referant;
+            synchronized (this) {
+                return referant;
+            }
         }
 
         public void clear() {
-            task.cancel();
-            if (referant instanceof EvictorReference) {
-                ((EvictorReference)referant).clear();
+            synchronized (this) {
+                task.cancel();
+                if (referant instanceof EvictorReference) {
+                    ((EvictorReference)referant).clear();
+                }
+                referant = null;
             }
-            referant = null;
         }
 
         /**
@@ -120,8 +124,8 @@
              * Evict the idle object.
              */
             public void run() {
-                synchronized(getObjectPool().getPool()) {
-                    referant = null;
+                synchronized(IdleEvictorReference.this) {
+                    clear();
                 }
             }
         }

Modified: 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/InvalidEvictorLender.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/InvalidEvictorLender.java?rev=388727&r1=388726&r2=388727&view=diff
==============================================================================
--- 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/InvalidEvictorLender.java
 (original)
+++ 
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/InvalidEvictorLender.java
 Sat Mar 25 00:01:42 2006
@@ -113,15 +113,19 @@
         }
 
         public Object get() {
-            return referant;
+            synchronized (this) {
+                return referant;
+            }
         }
 
         public void clear() {
-            task.cancel();
-            if (referant instanceof EvictorReference) {
-                ((EvictorReference)referant).clear();
+            synchronized (this) {
+                task.cancel();
+                if (referant instanceof EvictorReference) {
+                    ((EvictorReference)referant).clear();
+                }
+                referant = null;
             }
-            referant = null;
         }
 
         /**
@@ -143,7 +147,7 @@
                 }
 
                 final PoolableObjectFactory factory = 
getObjectPool().getFactory();
-                synchronized(getObjectPool().getPool()) {
+                synchronized (InvalidEvictorReference.this) {
                     // Unwrap any LenderReferences
                     Object r = referant;
                     while (r instanceof LenderReference) {
@@ -151,7 +155,7 @@
                     }
 
                     if (r == null) {
-                        cancel();
+                        clear();
                         return;
                     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to