All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.services.transport.protostuff.RecyclableLinkedBuffer Maven / Gradle / Ivy

package io.scalecube.services.transport.protostuff;

import io.netty.util.Recycler;
import io.protostuff.LinkedBuffer;
import java.util.Objects;

/**
 * Facility class for {@link LinkedBuffer}. Based on idea of object pooling (done vian {@link
 * Recycler}). Typical usage:
 *
 * 
 *     RecycleableLinkedBuffer rlb = new RecycleableLinkedBuffer(bufferSize, maxCapacity)
 *     LinkedBuffer lb = rlb.get();
 *     ...
 *     rlb.release();
 * 
*/ final class RecyclableLinkedBuffer implements AutoCloseable { public static final int DEFAULT_BUFFER_SIZE = 512; public static final int DEFAULT_MAX_CAPACITY = 256; private LinkedBuffer buffer; private Recycler.Handle handle; private final Recycler recycler; public RecyclableLinkedBuffer() { this(DEFAULT_BUFFER_SIZE, DEFAULT_MAX_CAPACITY); } /** * Creates new {@link RecyclableLinkedBuffer}. * * @param bufferSize {@link LinkedBuffer}'s buffer size. * @param maxCapacity {@link Recycler}'s. */ public RecyclableLinkedBuffer(final int bufferSize, int maxCapacity) { this.recycler = new Recycler(maxCapacity) { @Override protected RecyclableLinkedBuffer newObject(Handle handle) { RecyclableLinkedBuffer wrapper = new RecyclableLinkedBuffer(); wrapper.buffer = LinkedBuffer.allocate(bufferSize); wrapper.handle = handle; return wrapper; } }; } public LinkedBuffer buffer() { return Objects.requireNonNull(buffer, "Call LinkedBufferWrapper.get() first"); } public RecyclableLinkedBuffer get() { return recycler.get(); } public void release() { Objects.requireNonNull(buffer, "Call LinkedBufferWrapper.get() first"); buffer.clear(); recycler.recycle(this, handle); } @Override public void close() { release(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy