package org.playorm.nio.impl.cm.basic;
import java.nio.ByteBuffer;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.playorm.nio.impl.util.BufferListener;
import org.playorm.nio.impl.util.DataChunkImpl;
import org.playorm.nio.impl.util.ProcessedListener;
public class BufferPool implements BufferListener {
public Set<ByteBuffer> freePackets = new HashSet<ByteBuffer>();
public synchronized DataChunkImpl nextBuffer(Object id, ProcessedListener l) {
ByteBuffer b = null;
Iterator<ByteBuffer> iter = freePackets.iterator();
if(iter.hasNext()) {
b = iter.next();
iter.remove();
} else
b = ByteBuffer.allocateDirect(1000);
DataChunkImpl impl = new DataChunkImpl(id, b, this);
impl.setListener(l);
return impl;
}
public synchronized void releaseBuffer(ByteBuffer buffer) {
if(freePackets.size() > 300)
return; //we discard more than 300 buffers as we don't want to take up too much memory
freePackets.add(buffer);
}
}