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]