You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by bl...@apache.org on 2001/03/05 19:56:45 UTC

cvs commit: jakarta-avalon/src/java/org/apache/avalon/util/thread ThreadContext.java ThreadPool.java WorkerThread.java

bloritsch    01/03/05 10:56:44

  Modified:    src/java/org/apache/avalon/util/pool AbstractPool.java
               src/java/org/apache/avalon/util/pool/test PoolProfile.java
               src/java/org/apache/avalon/util/thread ThreadContext.java
                        ThreadPool.java WorkerThread.java
  Added:       src/java/org/apache/avalon/util/pool
                        HardResourceLimitingPool.java
                        SoftResourceLimitingPool.java
  Removed:     src/java/org/apache/avalon/util/pool ThreadSafePool.java
  Log:
  Fixed completely broken pool implementation
  
  Revision  Changes    Path
  1.3       +19 -49    jakarta-avalon/src/java/org/apache/avalon/util/pool/AbstractPool.java
  
  Index: AbstractPool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/util/pool/AbstractPool.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractPool.java	2001/03/01 20:10:51	1.2
  +++ AbstractPool.java	2001/03/05 18:56:32	1.3
  @@ -7,40 +7,38 @@
    */
   package org.apache.avalon.util.pool;
   
  -import java.util.ArrayList;
  -import java.util.List;
  +import java.util.Vector;
  +import java.util.Stack;
   
   import org.apache.avalon.AbstractLoggable;
   import org.apache.avalon.Initializable;
   import org.apache.avalon.Poolable;
   import org.apache.avalon.Recyclable;
  +import org.apache.avalon.ThreadSafe;
   
   /**
    * This is an <code>Pool</code> that caches Poolable objects for reuse.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    */
  -public class AbstractPool extends AbstractLoggable implements Pool {
  +public class AbstractPool extends AbstractLoggable implements Pool, ThreadSafe {
   
       protected final ObjectFactory  m_factory;
  -    protected final PoolController m_controller;
       protected final int            m_min;
       protected int                  m_max;
       protected int                  m_currentCount  = 0;
  -    protected List                 m_active        = new ArrayList();
  -    protected List                 m_ready         = new ArrayList();
  +    protected Vector               m_active        = new Vector();
  +    protected Stack                m_ready         = new Stack();
   
       /**
        * Create an AbstractPool.  The pool requires a factory, and can
        * optionally have a controller.
        */
       public AbstractPool( final ObjectFactory factory,
  -                         final PoolController controller,
                            final int min,
                            final int max ) throws Exception
       {
           m_factory = factory;
  -        m_controller = controller;
           int t_max = max;
           int t_min = min;
   
  @@ -82,11 +80,16 @@
       {
           for( int i = 0; i < m_min; i++ )
           {
  -            m_ready.add( m_factory.newInstance() );
  +            m_ready.push( m_factory.newInstance() );
               m_currentCount++;
           }
       }
   
  +    public int size() {
  +        int count = this.m_currentCount;
  +        return count;
  +    }
  +
       public synchronized Poolable get()
           throws Exception
       {
  @@ -94,38 +97,16 @@
   
           if( 0 == m_ready.size() )
           {
  -            if( m_currentCount < m_max )
  -            {
  -                int amount = (m_controller == null) ? 1 : m_controller.grow();
  -                obj = m_factory.newInstance();
  -                m_active.add( obj );
  -                m_currentCount++;
  -                amount--;
  -
  -                while ((amount > 0) && (m_currentCount < m_max)) {
  -                    m_ready.add( m_factory.newInstance() );
  -                    m_currentCount++;
  -                    amount--;
  -                    notify();
  -                }
  -            }
  -            else
  -            {
  -                if (this instanceof Resizable) {
  -                    int amount = (m_controller == null) ? 1 : m_controller.grow();
  -                    ((Resizable) this).grow(amount);
  -                    return get();
  -                } else {
  -                    throw new Exception( m_factory.getCreatedClass().getName() + ": not available" );
  -                }
  -            }
  +            obj = m_factory.newInstance();
  +            m_currentCount++;
           }
           else
           {
  -            obj = (Poolable)m_ready.remove( 0 );
  -            m_active.add( obj );
  +            obj = (Poolable)m_ready.pop();
           }
   
  +        m_active.addElement( obj );
  +
           if (getLogger() != null)
               getLogger().debug( m_factory.getCreatedClass().getName() + ": requested from the pool." );
   
  @@ -134,19 +115,8 @@
   
       public synchronized void put( final Poolable obj )
       {
  -        if (! m_active.remove( obj ))
  -        {
  -            try {
  -                m_factory.decommission( obj );
  -            } catch (Exception e) {
  -                if (getLogger() != null)
  -                    getLogger().warn( m_factory.getCreatedClass().getName() + ": error decommissioning object.", e );
  -            }
  -        }
  -        else
  -        {
  -            m_ready.add( obj );
  -        }
  +        m_active.removeElement( obj );
  +        m_ready.push( obj );
   
           if (getLogger() != null)
               getLogger().debug( m_factory.getCreatedClass().getName() + ": returned to the pool." );
  
  
  
  1.1                  jakarta-avalon/src/java/org/apache/avalon/util/pool/HardResourceLimitingPool.java
  
  Index: HardResourceLimitingPool.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.util.pool;
  
  import org.apache.avalon.Initializable;
  import org.apache.avalon.Poolable;
  import org.apache.avalon.Recyclable;
  import org.apache.avalon.ThreadSafe;
  
  /**
   * This is a implementation of  <code>Pool</code> that is thread safe.
   *
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
   */
  public class HardResourceLimitingPool
      extends SoftResourceLimitingPool
      implements ThreadSafe, Initializable
  {
      public final static int           DEFAULT_POOL_SIZE           = 8;
  
      public HardResourceLimitingPool( final ObjectFactory factory, final PoolController controller )
          throws Exception
      {
          super( factory, controller, DEFAULT_POOL_SIZE, DEFAULT_POOL_SIZE );
      }
  
      public HardResourceLimitingPool( final ObjectFactory factory )
          throws Exception
      {
          this( factory, null );
      }
  
      public HardResourceLimitingPool( final ObjectFactory factory,
                             final int initial,
                             final int maximum  )
          throws Exception
      {
          super( factory, null, initial, maximum );
      }
  
      public HardResourceLimitingPool( final ObjectFactory factory, final int initial )
          throws Exception
      {
          this( factory, initial, initial );
      }
  
      public HardResourceLimitingPool( final Class clazz, final int initial, final int maximum )
          throws NoSuchMethodException, Exception
      {
          this( new DefaultObjectFactory( clazz ), initial, maximum );
      }
  
      public HardResourceLimitingPool( final Class clazz, final int initial )
          throws NoSuchMethodException, Exception
      {
          this( clazz, initial, initial );
      }
  
      public void init() {
          try {
              super.init();
          } catch (Exception e) {
              getLogger().debug("Caught init exception", e);
          }
      }
      /**
       * Retrieve an object from pool.
       *
       * @return an object from Pool
       */
      public final synchronized Poolable get() throws Exception
      {
          while ( this.m_ready.size() == 0 || this.m_currentCount > this.m_max )
          {
              try { wait(); }
              catch( final InterruptedException ie ) { }
          }
  
          return super.get();
      }
  
      /**
       * Place an object in pool.
       *
       * @param poolable the object to be placed in pool
       */
      public final synchronized void put( final Poolable poolable )
      {
          super.put( poolable );
  
          notify();
      }
  }
  
  
  
  1.1                  jakarta-avalon/src/java/org/apache/avalon/util/pool/SoftResourceLimitingPool.java
  
  Index: SoftResourceLimitingPool.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.util.pool;
  
  import org.apache.avalon.Poolable;
  import org.apache.avalon.Initializable;
  
  /**
   * This is an <code>Pool</code> that caches Poolable objects for reuse.
   *
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   */
  public class SoftResourceLimitingPool extends AbstractPool implements Resizable {
      protected final PoolController m_controller;
  
      /**
       * Create an SoftResourceLimitingPool.  The pool requires a factory,
       * and can optionally have a controller.
       */
      public SoftResourceLimitingPool( final ObjectFactory factory,
                                       final int min ) throws Exception
      {
          super(factory, min, min * 2);
          this.m_controller = null;
      }
  
      /**
       * Create an SoftResourceLimitingPool.  The pool requires a factory,
       * and can optionally have a controller.
       */
      public SoftResourceLimitingPool( final ObjectFactory factory,
                                       final int min,
                                       final int max ) throws Exception
      {
          super(factory, min, max);
          this.m_controller = null;
      }
  
      /**
       * Create an SoftResourceLimitingPool.  The pool requires a factory,
       * and can optionally have a controller.
       */
      public SoftResourceLimitingPool( final ObjectFactory factory,
                                       final PoolController controller,
                                       final int min,
                                       final int max ) throws Exception
      {
          super(factory, min, max);
          m_controller = controller;
      }
  
      public void init() {
          this.grow(this.m_min);
      }
  
      public synchronized void grow(final int amount) {
          for (int i = 0; i < amount; i++) {
              try {
                  m_ready.push( this.m_factory.newInstance() );
                  this.m_currentCount++;
              } catch (Exception e) {
                  if (getLogger() != null)
                      getLogger().debug( m_factory.getCreatedClass().getName() +
                          ": could not be instantiated.", e );
              }
          }
  
          notify();
      }
  
      public synchronized void shrink(final int amount) {
          for (int i = 0; i < amount; i++) {
              if (this.m_ready.size() > this.m_min) {
                  try {
                      this.m_factory.decommission( (Poolable) this.m_ready.pop() );
                      this.m_currentCount--;
                  } catch (Exception e) {
                      if (getLogger() != null)
                          getLogger().debug( m_factory.getCreatedClass().getName() +
                              ": improperly decommissioned.", e );
                  }
              }
          }
      }
  
      public Poolable get() throws Exception {
          if (this.m_ready.size() == 0) {
              this.grow((this.m_controller == null) ? this.m_max - this.m_min : this.m_controller.grow());
          }
  
          return super.get();
      }
  
      public void put(Poolable obj) {
          if (this.m_ready.size() > this.m_max) {
              this.shrink((this.m_controller == null) ? this.m_ready.size() - (this.m_max + 1) : this.m_controller.shrink());
          }
  
          super.put(obj);
      }
  }
  
  
  1.2       +56 -56    jakarta-avalon/src/java/org/apache/avalon/util/pool/test/PoolProfile.java
  
  Index: PoolProfile.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/util/pool/test/PoolProfile.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PoolProfile.java	2001/02/24 03:59:42	1.1
  +++ PoolProfile.java	2001/03/05 18:56:37	1.2
  @@ -10,7 +10,7 @@
   import org.apache.avalon.Poolable;
   import org.apache.avalon.util.pool.DefaultPool;
   import org.apache.avalon.util.pool.Pool;
  -import org.apache.avalon.util.pool.ThreadSafePool;
  +import org.apache.avalon.util.pool.HardResourceLimitingPool;
   import org.apache.testlet.*;
   
   /**
  @@ -20,7 +20,7 @@
    */
   public final class PoolProfile
       extends AbstractTestlet
  -{ 
  +{
       public static class A
           implements Poolable
       {
  @@ -97,7 +97,7 @@
           for( int i = 0; i < TEST_SIZE; i++ )
           {
               final Poolable a1 = pool1.get();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -124,7 +124,7 @@
               final Poolable a8 = pool2.get();
               final Poolable a9 = pool2.get();
               final Poolable a0 = pool2.get();
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -165,7 +165,7 @@
               final Poolable a13 = pool3.get();
               final Poolable a14 = pool3.get();
               final Poolable a15 = pool3.get();
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -175,7 +175,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -216,7 +216,7 @@
               final Poolable a18 = pool4.get();
               final Poolable a19 = pool4.get();
               final Poolable a20 = pool4.get();
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -226,13 +226,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  @@ -284,7 +284,7 @@
           for( int i = 0; i < TEST_SIZE; i++ )
           {
               final Poolable a1 = pool1.get();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -311,7 +311,7 @@
               final Poolable a8 = pool2.get();
               final Poolable a9 = pool2.get();
               final Poolable a10 = pool2.get();
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -352,7 +352,7 @@
               final Poolable a13 = pool3.get();
               final Poolable a14 = pool3.get();
               final Poolable a15 = pool3.get();
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -362,7 +362,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -403,7 +403,7 @@
               final Poolable a18 = pool4.get();
               final Poolable a19 = pool4.get();
               final Poolable a20 = pool4.get();
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -413,13 +413,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  @@ -469,7 +469,7 @@
           for( int i = 0; i < TEST_SIZE; i++ )
           {
               final Poolable a1 = pool1.get();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -496,7 +496,7 @@
               final Poolable a8 = pool2.get();
               final Poolable a9 = pool2.get();
               final Poolable a10 = pool2.get();
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -537,7 +537,7 @@
               final Poolable a13 = pool3.get();
               final Poolable a14 = pool3.get();
               final Poolable a15 = pool3.get();
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -547,7 +547,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -588,7 +588,7 @@
               final Poolable a18 = pool4.get();
               final Poolable a19 = pool4.get();
               final Poolable a20 = pool4.get();
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -598,13 +598,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  @@ -641,14 +641,14 @@
       {
           System.out.println("SMALL Sized Objects with thread safe pools");
   
  -        final ThreadSafePool pool1 = new ThreadSafePool( A.class, 5, 10 );
  +        final HardResourceLimitingPool pool1 = new HardResourceLimitingPool( A.class, 5, 10 );
           final long pool1Start = System.currentTimeMillis();
           final int pool1Factor = 1;
           final int pool1Loops = TEST_SIZE / pool1Factor;
           for( int i = 0; i < TEST_SIZE; i++ )
           {
               final Poolable a1 = pool1.get();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -659,7 +659,7 @@
   
           System.out.println("FreeMem post 1: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool2 = new ThreadSafePool( A.class, 5, 10 );
  +        final HardResourceLimitingPool pool2 = new HardResourceLimitingPool( A.class, 5, 10 );
           final long pool2Start = System.currentTimeMillis();
           final int pool2Factor = 10;
           final int pool2Loops = TEST_SIZE / pool2Factor;
  @@ -675,7 +675,7 @@
               final Poolable a8 = pool2.get();
               final Poolable a9 = pool2.get();
               final Poolable a0 = pool2.get();
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -695,7 +695,7 @@
   
           System.out.println("FreeMem post 2: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool3 = new ThreadSafePool( A.class, 5, 10 );
  +        final HardResourceLimitingPool pool3 = new HardResourceLimitingPool( A.class, 5, 10 );
           final long pool3Start = System.currentTimeMillis();
           final int pool3Factor = 15;
           final int pool3Loops = TEST_SIZE / pool3Factor;
  @@ -716,7 +716,7 @@
               final Poolable a13 = pool3.get();
               final Poolable a14 = pool3.get();
               final Poolable a15 = pool3.get();
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -726,7 +726,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -741,7 +741,7 @@
   
           System.out.println("FreeMem post 3: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool4 = new ThreadSafePool( A.class, 5, 10 );
  +        final HardResourceLimitingPool pool4 = new HardResourceLimitingPool( A.class, 5, 10 );
           final long pool4Start = System.currentTimeMillis();
           final int pool4Factor = 20;
           final int pool4Loops = TEST_SIZE / pool4Factor;
  @@ -767,7 +767,7 @@
               final Poolable a18 = pool4.get();
               final Poolable a19 = pool4.get();
               final Poolable a20 = pool4.get();
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -777,13 +777,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  @@ -828,14 +828,14 @@
           System.gc();
           Thread.currentThread().sleep(2);
   
  -        final ThreadSafePool pool1 = new ThreadSafePool( B.class, 5, 10 );
  +        final HardResourceLimitingPool pool1 = new HardResourceLimitingPool( B.class, 5, 10 );
           final long pool1Start = System.currentTimeMillis();
           final int pool1Factor = 1;
           final int pool1Loops = TEST_SIZE / pool1Factor;
           for( int i = 0; i < TEST_SIZE; i++ )
           {
               final Poolable a1 = pool1.get();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -846,7 +846,7 @@
   
           System.out.println("FreeMem post 1: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool2 = new ThreadSafePool( B.class, 5, 10 );
  +        final HardResourceLimitingPool pool2 = new HardResourceLimitingPool( B.class, 5, 10 );
           final long pool2Start = System.currentTimeMillis();
           final int pool2Factor = 10;
           final int pool2Loops = TEST_SIZE / pool2Factor;
  @@ -874,7 +874,7 @@
                 a9.build();
                 a10.build();
               */
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -894,7 +894,7 @@
   
           System.out.println("FreeMem post 2: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool3 = new ThreadSafePool( B.class, 5, 10 );
  +        final HardResourceLimitingPool pool3 = new HardResourceLimitingPool( B.class, 5, 10 );
           final long pool3Start = System.currentTimeMillis();
           final int pool3Factor = 15;
           final int pool3Loops = TEST_SIZE / pool3Factor;
  @@ -932,7 +932,7 @@
                 a14.build();
                 a15.build();
               */
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -942,7 +942,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -957,7 +957,7 @@
   
           System.out.println("FreeMem post 3: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool4 = new ThreadSafePool( B.class, 5, 10 );
  +        final HardResourceLimitingPool pool4 = new HardResourceLimitingPool( B.class, 5, 10 );
           final long pool4Start = System.currentTimeMillis();
           final int pool4Factor = 20;
           final int pool4Loops = TEST_SIZE / pool4Factor;
  @@ -1005,7 +1005,7 @@
                 a19.build();
                 a20.build();
               */
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -1015,13 +1015,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  @@ -1064,7 +1064,7 @@
           System.gc();
           Thread.currentThread().sleep(2);
   
  -        final ThreadSafePool pool1 = new ThreadSafePool( C.class, 5, 10 );
  +        final HardResourceLimitingPool pool1 = new HardResourceLimitingPool( C.class, 5, 10 );
           final long pool1Start = System.currentTimeMillis();
           final int pool1Factor = 1;
           final int pool1Loops = TEST_SIZE / pool1Factor;
  @@ -1072,7 +1072,7 @@
           {
               final Poolable a1 = pool1.get();
               //a1.build();
  -            pool1.put(a1);                
  +            pool1.put(a1);
           }
           final long pool1End = System.currentTimeMillis();
           final long pool1Duration = pool1End - pool1Start;
  @@ -1083,7 +1083,7 @@
   
           System.out.println("FreeMem post 1: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool2 = new ThreadSafePool( C.class, 5, 10 );
  +        final HardResourceLimitingPool pool2 = new HardResourceLimitingPool( C.class, 5, 10 );
           final long pool2Start = System.currentTimeMillis();
           final int pool2Factor = 10;
           final int pool2Loops = TEST_SIZE / pool2Factor;
  @@ -1111,7 +1111,7 @@
                 a9.build();
                 a10.build();
               */
  -            pool2.put(a1);                
  +            pool2.put(a1);
               pool2.put(a2);
               pool2.put(a3);
               pool2.put(a4);
  @@ -1131,7 +1131,7 @@
   
           System.out.println("FreeMem post 2: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool3 = new ThreadSafePool( C.class, 5, 10 );
  +        final HardResourceLimitingPool pool3 = new HardResourceLimitingPool( C.class, 5, 10 );
           final long pool3Start = System.currentTimeMillis();
           final int pool3Factor = 15;
           final int pool3Loops = TEST_SIZE / pool3Factor;
  @@ -1169,7 +1169,7 @@
                 a14.build();
                 a15.build();
               */
  -            pool3.put(a1);                
  +            pool3.put(a1);
               pool3.put(a2);
               pool3.put(a3);
               pool3.put(a4);
  @@ -1179,7 +1179,7 @@
               pool3.put(a8);
               pool3.put(a9);
               pool3.put(a10);
  -            pool3.put(a11);                
  +            pool3.put(a11);
               pool3.put(a12);
               pool3.put(a13);
               pool3.put(a14);
  @@ -1194,7 +1194,7 @@
   
           System.out.println("FreeMem post 3: " + Runtime.getRuntime().freeMemory() );
   
  -        final ThreadSafePool pool4 = new ThreadSafePool( C.class, 5, 10 );
  +        final HardResourceLimitingPool pool4 = new HardResourceLimitingPool( C.class, 5, 10 );
           final long pool4Start = System.currentTimeMillis();
           final int pool4Factor = 20;
           final int pool4Loops = TEST_SIZE / pool4Factor;
  @@ -1220,7 +1220,7 @@
               final Poolable a18 = pool4.get();
               final Poolable a19 = pool4.get();
               final Poolable a20 = pool4.get();
  -            pool4.put(a1);                
  +            pool4.put(a1);
               pool4.put(a2);
               pool4.put(a3);
               pool4.put(a4);
  @@ -1230,13 +1230,13 @@
               pool4.put(a8);
               pool4.put(a9);
               pool4.put(a10);
  -            pool4.put(a11);                
  +            pool4.put(a11);
               pool4.put(a12);
               pool4.put(a13);
               pool4.put(a14);
               pool4.put(a15);
               pool4.put(a16);
  -            pool4.put(a17);                
  +            pool4.put(a17);
               pool4.put(a18);
               pool4.put(a19);
               pool4.put(a20);
  
  
  
  1.2       +2 -2      jakarta-avalon/src/java/org/apache/avalon/util/thread/ThreadContext.java
  
  Index: ThreadContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/util/thread/ThreadContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ThreadContext.java	2001/02/24 03:59:42	1.1
  +++ ThreadContext.java	2001/03/05 18:56:40	1.2
  @@ -9,14 +9,14 @@
   
   import org.apache.avalon.Poolable;
   import org.apache.avalon.util.pool.ObjectFactory;
  -import org.apache.avalon.util.pool.ThreadSafePool;
  +import org.apache.avalon.util.pool.SoftResourceLimitingPool;
   
   /**
    * To deal with *current* ThreadContext.
    *
    * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
    */
  -public final class ThreadContext 
  +public final class ThreadContext
   {
       protected final static InheritableThreadLocal   c_context = new InheritableThreadLocal();
   
  
  
  
  1.3       +5 -5      jakarta-avalon/src/java/org/apache/avalon/util/thread/ThreadPool.java
  
  Index: ThreadPool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/util/thread/ThreadPool.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ThreadPool.java	2001/03/01 20:11:01	1.2
  +++ ThreadPool.java	2001/03/05 18:56:41	1.3
  @@ -10,7 +10,7 @@
   import org.apache.avalon.Loggable;
   import org.apache.avalon.Poolable;
   import org.apache.avalon.util.pool.ObjectFactory;
  -import org.apache.avalon.util.pool.ThreadSafePool;
  +import org.apache.avalon.util.pool.SoftResourceLimitingPool;
   import org.apache.log.Logger;
   
   /**
  @@ -25,9 +25,9 @@
       extends ThreadGroup
       implements ObjectFactory, Loggable
   {
  -    protected final ThreadSafePool        m_pool;
  -    protected int                         m_level;
  -    protected Logger                      m_logger;
  +    protected final SoftResourceLimitingPool  m_pool;
  +    protected int                             m_level;
  +    protected Logger                          m_logger;
   
       public ThreadPool( final int capacity )
           throws Exception
  @@ -39,7 +39,7 @@
           throws Exception
       {
           super( name );
  -        m_pool = new ThreadSafePool( this, 0 );
  +        m_pool = new SoftResourceLimitingPool( this, 0 );
           m_pool.init();
       }
   
  
  
  
  1.2       +20 -20    jakarta-avalon/src/java/org/apache/avalon/util/thread/WorkerThread.java
  
  Index: WorkerThread.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/util/thread/WorkerThread.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- WorkerThread.java	2001/02/24 03:59:43	1.1
  +++ WorkerThread.java	2001/03/05 18:56:41	1.2
  @@ -9,7 +9,7 @@
   
   import org.apache.avalon.Loggable;
   import org.apache.avalon.Poolable;
  -import org.apache.avalon.util.pool.ThreadSafePool;
  +import org.apache.avalon.util.pool.SoftResourceLimitingPool;
   import org.apache.log.Logger;
   
   /**
  @@ -18,28 +18,28 @@
    * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
    * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
    */
  -class WorkerThread 
  -    extends Thread 
  +class WorkerThread
  +    extends Thread
       implements Poolable, Loggable
   {
       protected final static boolean  DEBUG          = false;
   
  -    protected Logger                m_logger;
  -    protected ThreadPool            m_threadPool;
  -    protected ThreadSafePool        m_pool;
  +    protected Logger                    m_logger;
  +    protected ThreadPool                m_threadPool;
  +    protected SoftResourceLimitingPool  m_pool;
   
  -    protected Runnable              m_work;
  -    protected boolean               m_alive;
  +    protected Runnable                  m_work;
  +    protected boolean                   m_alive;
   
       /**
        * Allocates a new <code>Worker</code> object.
        */
       protected WorkerThread( final ThreadPool threadPool,
  -                            final ThreadSafePool pool, 
  +                            final SoftResourceLimitingPool pool,
                               final String name )
       {
           super( threadPool, name );
  -        
  +
           m_threadPool = threadPool;
           m_pool = pool;
   
  @@ -61,7 +61,7 @@
           ThreadContext.setCurrentThreadPool( m_threadPool );
   
           if( DEBUG ) m_logger.info( getName() + ": starting." );
  -                
  +
           // Notify the pool this worker started running.
           //notifyAll();
   
  @@ -70,19 +70,19 @@
               waitUntilCondition( true );
   
               if( DEBUG ) m_logger.debug( getName() + ": running." );
  -                
  -            try 
  +
  +            try
               {
                   m_work.run();
  -            } 
  +            }
               catch( final ThreadDeath td )
               {
                   if ( DEBUG ) m_logger.debug( getName() + ": thread has died." );
  -                        
  +
                   // This is to let the thread death propagate to the runtime
                   // enviroment to let it know it must kill this worker
                   throw td;
  -            } 
  +            }
               catch( final Throwable t )
               {
                   // Error thrown while working.
  @@ -94,7 +94,7 @@
   
               m_work = null;
   
  -            //should this be just notify or notifyAll ??? 
  +            //should this be just notify or notifyAll ???
               //It seems to resource intensive option to use notify()
               //notifyAll();
               notify();
  @@ -125,10 +125,10 @@
       {
           while( hasWork == (null == m_work) )
           {
  -            try 
  +            try
               {
                   if( DEBUG ) m_logger.debug( getName() + ": waiting." );
  -                wait(); 
  +                wait();
                   if( DEBUG ) m_logger.debug( getName() + ": notified." );
               }
               catch( final InterruptedException ie ) {}
  @@ -148,7 +148,7 @@
        * does not change the state of the worker (that must be destroyed in other
        * ways).
        */
  -    public void dispose() 
  +    public void dispose()
       {
           if( DEBUG ) m_logger.debug( getName() + ": destroying." );
           m_alive = false;