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<char[][]> pools_ = new PoolThreadLocal();
private static int slot_ = 0;
public CharArrayPool() {
}
public static char[] getCharArray(int size) {
if(MAX > size) {
final char[][] pool = pools_.get();
for(int i = 0; i < pool.length; i++) {
if(pool[i] != null && pool[i].length == size) {
final 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 = 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<char[][]> {
protected char[][] initialValue() {
return new char[POOL_SIZE][];
}
}
}