Author: rmannibucau Date: Sat May 17 13:19:50 2014 New Revision: 1595473 URL: http://svn.apache.org/r1595473 Log: revert for Thiago, shouldn't have changed anything excepted under contention where it would have added surely more locks ;) + fixing compilation error in ejbd module
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java?rev=1595473&r1=1595472&r2=1595473&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Pool.java Sat May 17 13:19:50 2014 @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.openejb.util; import org.apache.openejb.core.ParentClassLoaderFinder; @@ -25,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.NoSuchElementException; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; @@ -105,7 +105,7 @@ public class Pool<T> { greater("MaxAge", maxAge, "IdleTimeout", idleTimeout); } this.executor = executor != null ? executor : createExecutor(); - this.supplier = supplier != null ? supplier : new NoSupplier<T>(); + this.supplier = supplier != null ? supplier : new NoSupplier(); this.available = strict ? new Semaphore(max) : new Overdraft(max); this.minimum = new Semaphore(min); this.instances = new Semaphore(max); @@ -202,22 +202,30 @@ public class Pool<T> { throw new TimeoutException("Waited " + timeout + " " + unit); } - synchronized (pool) { - while (!pool.isEmpty()) { - final Entry entry = pool.removeFirst(); - final Pool<T>.Entry.Instance instance = entry.soft.get(); - if (instance != null) { - final boolean notBusy = entry.active.compareAndSet(null, instance); - if (notBusy) { - return entry; - } - } else { - // the SoftReference was garbage collected - instances.release(); + Entry entry; + do { + synchronized (pool) { + try { + entry = pool.removeFirst(); + } catch (final NoSuchElementException e) { + return null; } } - } - return null; + + final Pool<T>.Entry.Instance instance = entry.soft.get(); + + if (instance != null) { + + final boolean notBusy = entry.active.compareAndSet(null, instance); + + if (notBusy) { + return entry; + } + } else { + // the SoftReference was garbage collected + instances.release(); + } + } while (true); } /** @@ -867,13 +875,13 @@ public class Pool<T> { } - private static class NoSupplier<T> implements Supplier<T> { + private static class NoSupplier implements Supplier { @Override public void discard(final Object o, final Event reason) { } @Override - public T create() { + public Object create() { return null; } }