package ch.ethz.syslab.telesto.common.network; import java.nio.ByteBuffer; import ch.ethz.syslab.telesto.common.config.CONFIG; public class DoubleBuffer { public ByteBuffer writeView; public ByteBuffer readView; private boolean acquired; private int startPosition = 0; public DoubleBuffer(int capacity) { writeView = ByteBuffer.allocateDirect(CONFIG.MW_READ_BUFFER_SIZE); readView = writeView.duplicate(); } public synchronized boolean acquire() { if (acquired) { return false; } acquired = true; return acquired; } public void release() { acquired = false; } public void prepare() { startPosition = readView.position(); } public int bytesAvailable() { return writeView.position() - readView.position(); } public void limit(int limit) { readView.limit(readView.position() + limit); } public int bytesRead() { return readView.position() - startPosition; } public boolean dataRemaining() { return writeView.position() != readView.position(); } public void cleanup() { if (writeView.position() * 4 > writeView.capacity() * 3 && readView.position() * 4 > readView.capacity()) { readView.limit(writeView.position()); readView.compact(); writeView.position(readView.position()); readView.flip(); } } }