private UnexpandableByteBuffer allocate0(int capacity, boolean direct) { ExpiringStack[] bufferStacks = direct ? directBufferStacks : heapBufferStacks; int idx = getBufferStackIndex(bufferStacks, capacity); ExpiringStack stack = bufferStacks[idx]; UnexpandableByteBuffer buf; synchronized (stack) { buf = (UnexpandableByteBuffer) stack.pop(); } if (buf == null) { java.nio.ByteBuffer nioBuf = direct ? java.nio.ByteBuffer .allocateDirect(MINIMUM_CAPACITY << idx) : java.nio.ByteBuffer.allocate(MINIMUM_CAPACITY << idx); buf = new UnexpandableByteBuffer(nioBuf); } buf.init(); return buf; }
protected void capacity0(int requestedCapacity) { if (buf.isDerived()) { throw new IllegalStateException( "Derived buffers cannot be expanded."); } int newCapacity = MINIMUM_CAPACITY; while (newCapacity < requestedCapacity) { newCapacity <<= 1; } UnexpandableByteBuffer oldBuf = this.buf; boolean direct = isDirect(); UnexpandableByteBuffer newBuf; try { newBuf = allocate0(newCapacity, direct); } catch (OutOfMemoryError e) { if (direct) { newBuf = allocate0(newCapacity, false); } else { throw e; } } newBuf.buf().clear(); oldBuf.buf().clear(); newBuf.buf().put(oldBuf.buf()); this.buf = newBuf; oldBuf.release(); } }
public void release() { if (isDerived()) { parentBuf.release(); return; } synchronized (this) { if (refCount <= 0) { refCount = 0; throw new IllegalStateException( "Already released buffer. You released the buffer too many times."); } refCount--; if (refCount > 0) { return; } } // No need to return buffers to the pool if it is disposed already. if (disposed) { return; } if (pooled) { if (parentBuf != null) { release0(parentBuf); } else { release0(this); } } }
public void release() { synchronized (this) { if (refCount <= 0) { refCount = 0; throw new IllegalStateException( "Already released buffer. You released the buffer too many times."); } refCount--; if (refCount > 0) { return; } } // No need to return buffers to the pool if it is disposed already. if (disposed) { return; } buf.release(); }
public boolean isPooled() { return buf.isPooled(); }
public java.nio.ByteBuffer buf() { return buf.buf(); }
public void setPooled(boolean pooled) { buf.setPooled(pooled); }
public ByteBuffer asReadOnlyBuffer() { PooledByteBuffer newBuf = allocateContainer(); newBuf.init(new UnexpandableByteBuffer(buf().asReadOnlyBuffer(), buf), false); return newBuf; }
public ByteBuffer slice() { PooledByteBuffer newBuf = allocateContainer(); newBuf.init(new UnexpandableByteBuffer(buf().slice(), buf), false); return newBuf; }
protected UnexpandableByteBuffer(java.nio.ByteBuffer buf, UnexpandableByteBuffer parentBuf) { parentBuf.acquire(); this.buf = buf; this.parentBuf = parentBuf; }
public ByteBuffer duplicate() { PooledByteBuffer newBuf = allocateContainer(); newBuf.init(new UnexpandableByteBuffer(buf().duplicate(), buf), false); return newBuf; }
public ByteBuffer wrap(java.nio.ByteBuffer nioBuffer) { ensureNotDisposed(); PooledByteBuffer buf = allocateContainer(); buf.init(new UnexpandableByteBuffer(nioBuffer), false); buf.buf.init(); buf.setPooled(false); return buf; }