public int tryClaim()

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


    public int tryClaim(final int length) {
        final int required = Util.align(length, LogRecordEncoder.ALIGNMENT);
        long head = UNSAFE.getLongVolatile(null, headCacheAddress);

        int offset;
        int padding;

        while (true) {
            final long tail = UNSAFE.getLongVolatile(null, tailAddress);
            offset = (int) tail & mask;

            final int continuous = capacity - offset;

            padding = (required > continuous) ? continuous : 0;
            final long tailNext = tail + required + padding;

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

                if (tailNext - head > capacity) {
                    return INSUFFICIENT_SPACE;
                }

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

            if (UNSAFE.compareAndSwapLong(null, tailAddress, tail, tailNext)) {
                break;
            }
        }

        if (padding != 0) {
            UNSAFE.putOrderedInt(null, dataAddress + offset, -padding);
            offset = 0;
        }

        return offset;
    }