User: mulder
Date: 00/10/25 09:39:08
Modified: src/main/org/jboss/minerva/pools ObjectPool.java
Log:
Avoid thread problems by creating an external lock for all resize
operations (add/remove) and improve speed by cloning on resize instead
of cloning on search.
Revision Changes Path
1.14 +18 -5 jboss/src/main/org/jboss/minerva/pools/ObjectPool.java
Index: ObjectPool.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/minerva/pools/ObjectPool.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ObjectPool.java 2000/10/19 20:01:20 1.13
+++ ObjectPool.java 2000/10/25 16:39:08 1.14
@@ -28,7 +28,7 @@
* <LI>Shut it down</LI>
* </OL>
* @see org.jboss.minerva.pools.PooledObject
- * @version $Revision: 1.13 $
+ * @version $Revision: 1.14 $
* @author Aaron Mulder ([EMAIL PROTECTED])
*/
public class ObjectPool implements PoolEventListener {
@@ -56,6 +56,7 @@
private boolean trackLastUsed = false;
private boolean invalidateOnError = false;
private PrintWriter logWriter = null;
+ private Object resizeLock = new Object();
/**
* Creates a new pool. It cannot be used until you specify a name and
@@ -639,7 +640,7 @@
((PooledObject)object).removePoolEventListener(this);
factory.returnObject(object);
if(deadObjects.contains(object)) {
- objects.remove(pooled);
+ removeObject(pooled);
try {
factory.deleteObject(pooled);
} catch(Exception e) {
@@ -756,7 +757,7 @@
ObjectRecord rec = (ObjectRecord)it.next();
rec.setInUse(true); // Don't let someone use it while we
destroy it
Object pooled = rec.getObject();
- objects.remove(pooled);
+ removeObject(pooled);
try {
factory.deleteObject(pooled);
} catch(Exception e) {
@@ -775,6 +776,16 @@
}
/**
+ * Removes an object from the pool. Only one thread can add or remove
+ * an object at a time.
+ */
+ private void removeObject(Object pooled) {
+ synchronized(resizeLock) {
+ objects.remove(pooled);
+ }
+ }
+
+ /**
* Creates a new Object.
* @param forImmediateUse If <b>true</b>, then the object is locked and
* translated by the factory, and the resulting object
@@ -785,12 +796,13 @@
Object ob = null;
String message = null;
// Serialize creating new objects
- synchronized(objects) { // Don't let 2 threads add at the same time
+ synchronized(resizeLock) { // Don't let 2 threads add at the same time
if(maxSize == 0 || objects.size() < maxSize) {
ob = factory.createObject();
if (ob != null) { // if factory can create object
ObjectRecord rec = new ObjectRecord(ob, forImmediateUse);
- objects.put(ob, rec);
+ HashMap newMap = (HashMap)objects.clone();
+ newMap.put(ob, rec);
if(forImmediateUse) {
Object result = factory.prepareObject(ob);
if(result != ob) rec.setClientObject(result);
@@ -799,6 +811,7 @@
message = "Pool "+this+" gave out new object: "+result;
ob = result;
} else message = "Pool "+poolName+" created a new object: "+ob;
+ objects = newMap;
} else message = "Pool "+poolName+" factory "+factory+" unable to
create new object!";
} else message = "Pool "+poolName+" is full
("+objects.size()+"/"+maxSize+")!";
}