public void resetCapacity(int length) { // Ensure previous buffer has been recycled. if (!isRecycled) { throw new IllegalStateException("ResizableBuffer needs to be recycled before reset."); } // Ensure memory segment has enough capacity. if (segment != null && segment.size() >= length) { buffer.clear(); } else { if (segment == null) { segment = HeapMemorySegment.FACTORY.wrapPooledHeapMemory(new byte[length], this); } else if (segment.size() < length) { segment.pointTo(new byte[length], this); } buffer = new NetworkBuffer(segment, emptyBufferRecycler); } isRecycled = false; }
@Override HeapMemorySegment allocateNewSegment(Object owner) { return HeapMemorySegment.FACTORY.allocateUnpooledSegment(segmentSize, owner); }
@Override HeapMemorySegment requestSegmentFromPool(Object owner) { byte[] buf = availableMemory.remove(); return HeapMemorySegment.FACTORY.wrapPooledHeapMemory(buf, owner); }