// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.pooling;

import org.pmw.tinylog.Logger;

import java.nio.ByteBuffer;

public class ByteBufferPool extends LinkedObjectPool<ByteBuffer> {

    private final int defaultBufferSize;

    public ByteBufferPool(int defaultBufferSize) {
        super(ObjectPool.DEFAULT_SIZE);
        this.defaultBufferSize = defaultBufferSize;
    }

    public ByteBufferPool(int size, int defaultBufferSize) {
        super(size);
        this.defaultBufferSize = defaultBufferSize;
    }

    @Override
    protected ByteBuffer makeNewObject() {
        return ByteBuffer.allocate(defaultBufferSize);
    }

    @Override
    protected void resetObject(ByteBuffer obj) {
        obj.clear();
    }

    @Override
    public ByteBuffer get() {
        // Logger.debug("ByteBufferPool.get() BB.capacity(): " + bb.capacity()
        // + ", bb.pos(): " + bb.position() + ". Pool.size() is now: "
        // + this.getPoolSize());
        return super.get();
    }

    @Override
    public void put(ByteBuffer bb) {
        if (bb.isDirect())
            super.put(bb);
        // Logger.debug("ByteBufferPool.put() BB.capacity(): " + bb.capacity()
        // + ", bb.pos(): " + bb.position() + ". Pool.size() is now: "
        // + this.getPoolSize());
    }

    @Override
    protected void handlePoolExhaustion() {
        Logger.debug("ByteBufferPool(" + defaultBufferSize
                + ") exhausted, making more objects.");

        // If none exist, make (and pool) a few
        // Dont sync the loop, let the makeNewObject()
        // call return before locking the pool object
        for (int i = 0; i < 5; ++i)
            this.makeAndAdd();
    }

}
