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+")!";
           }
  
  
  

Reply via email to