/*
* Copyright (c) 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 10. May 2007 by Joerg Schaible
*/
package com.thoughtworks.xstream.core.util;
/**
* A simple pool implementation.
*
* @author Jörg Schaible
* @author Joe Walnes
*/
public class Pool {
public interface Factory {
public Object newInstance();
}
private final int initialPoolSize;
private final int maxPoolSize;
private final Factory factory;
private transient Object[] pool;
private transient int nextAvailable;
private transient Object mutex = new Object();
public Pool(int initialPoolSize, int maxPoolSize, Factory factory) {
this.initialPoolSize = initialPoolSize;
this.maxPoolSize = maxPoolSize;
this.factory = factory;
}
public Object fetchFromPool() {
Object result;
synchronized (mutex) {
if (pool == null) {
pool = new Object[maxPoolSize];
for (nextAvailable = initialPoolSize; nextAvailable > 0; ) {
putInPool(factory.newInstance());
}
}
while (nextAvailable == maxPoolSize) {
try {
mutex.wait();
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted whilst waiting " +
"for a free item in the pool : " + e.getMessage());
}
}
result = pool[nextAvailable++];
if (result == null) {
result = factory.newInstance();
putInPool(result);
++nextAvailable;
}
}
return result;
}
protected void putInPool(Object object) {
synchronized (mutex) {
pool[--nextAvailable] = object;
mutex.notify();
}
}
private Object readResolve() {
mutex = new Object();
return this;
}
}