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]