public int claim()

in gflog-core/src/main/java/com/epam/deltix/gflog/core/service/LogBuffer.java [113:144]


    public int claim(final int length, final BackpressureCallback callback) {
        final int required = Util.align(length, LogRecordEncoder.ALIGNMENT);

        while (true) {
            final long tail = UNSAFE.getAndAddLong(null, tailAddress, required);
            final long tailNext = tail + required;

            final int offset = (int) tail & mask;
            final int continuous = capacity - offset;

            long head = UNSAFE.getLongVolatile(null, headCacheAddress);

            if (tailNext - head > capacity) {
                head = UNSAFE.getLongVolatile(null, headAddress);

                while (tailNext - head > capacity) {
                    callback.onBackpressure();
                    head = UNSAFE.getLongVolatile(null, headAddress);
                }

                UNSAFE.putOrderedLong(null, headCacheAddress, head);
            }

            if (required > continuous) {
                UNSAFE.putOrderedInt(null, dataAddress + offset, -continuous);
                UNSAFE.putOrderedInt(null, dataAddress, continuous - required);
                continue;
            }

            return offset;
        }
    }