package org.exist.util;
/**
* A pool for char arrays.
*
* This pool is used by class XMLString. Whenever an XMLString needs to
* reallocate the backing char[], the old array is released into the pool. However,
* only char[] with length < MAX are kept in the pool. Larger char[] are rarely reused.
*
* The pool is bound to the current thread.
*/
public class CharArrayPool {
public static final int POOL_SIZE = 128;
public static final int MAX = 128;
public static final ThreadLocal pools_ = new PoolThreadLocal();
private static int slot_ = 0;
public CharArrayPool() {
}
public static char[] getCharArray(int size) {
if(MAX > size) {
final char[][] pool = (char[][])pools_.get();
for(int i = 0; i < pool.length; i++) {
if(pool[i] != null && pool[i].length == size) {
char[] b = pool[i];
pool[i] = null;
return b;
}
}
}
//System.out.println("creating new char[" + size + "]");
return new char[size];
}
public static void releaseCharArray(final char[] b) {
if(b == null || b.length > MAX)
return;
final char[][] pool = (char[][]) pools_.get();
for(int i = 0; i < pool.length; i++) {
if(pool[i] == null) {
pool[i] = b;
return;
}
}
int s = slot_++;
if (s < 0)
s = -s;
pool[s % pool.length] = b;
}
private static final class PoolThreadLocal extends ThreadLocal {
protected Object initialValue() {
return new char[POOL_SIZE][];
}
}
}