You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2010/04/01 15:25:49 UTC

svn commit: r929961 - in /openejb/trunk/openejb3/container/openejb-core/src: main/java/org/apache/openejb/util/Pool.java test/java/org/apache/openejb/util/PoolTest.java

Author: dblevins
Date: Thu Apr  1 13:25:49 2010
New Revision: 929961

URL: http://svn.apache.org/viewvc?rev=929961&view=rev
Log:
Still more pooling fixes.
When creating the Discard task, ensure we'll have an object for the event.  Seems in some cases it's already cleared from the Entry object, so just grab it in the constructor to ensure we have one.
With strict pooling off, ensure that rejected instances have the discard method called on them.

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/PoolTest.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java?rev=929961&r1=929960&r2=929961&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java Thu Apr  1 13:25:49 2010
@@ -309,6 +309,8 @@ public class Pool<T> {
         if (instances.tryAcquire()){
             return push(new Entry<T>(obj, offset, poolVersion.get()));
         }
+
+        if (obj != null) supplier.discard(obj);
         return false;
     }
 
@@ -701,14 +703,16 @@ public class Pool<T> {
     }
 
     private class Discard implements Runnable {
-        private final Entry<T> expired;
+        private final T expired;
 
         private Discard(Entry<T> expired) {
-            this.expired = expired;
+            this.expired = expired.get();
+
+            if (expired == null) throw new NullPointerException("entry.get() cannot be null");
         }
 
         public void run() {
-            supplier.discard(expired.get());
+            supplier.discard(expired);
         }
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/PoolTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/PoolTest.java?rev=929961&r1=929960&r2=929961&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/PoolTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/util/PoolTest.java Thu Apr  1 13:25:49 2010
@@ -101,6 +101,36 @@ public class PoolTest extends TestCase {
 
     }
 
+    public void testNonStrictDiscard() throws Exception {
+        System.out.println("PoolTest.testNonStrictDiscard");
+
+        final Pool.Builder builder = new Pool.Builder();
+        builder.setPoolMin(0);
+        builder.setPoolMax(0);
+        builder.setStrictPooling(false);
+        builder.setSupplier(new Pool.Supplier<Bean>() {
+            public void discard(Bean bean) {
+                bean.discard();
+            }
+
+            public Bean create() {
+                // Should never be called
+                return new Bean();
+            }
+        });
+
+
+        final Pool pool = builder.build().start();
+
+        assertNull(pool.pop(0, TimeUnit.MILLISECONDS));
+
+        final Bean bean = new Bean();
+
+        assertFalse(pool.push(bean));
+
+        assertTrue(bean.discarded > 0);
+    }
+
     private <T> void drainCheckPush(int max, int min, Pool<T> pool) throws InterruptedException {
         final List<Pool.Entry<T>> list = drain(pool);
         checkMax(max, list);