public int read()

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


    public int read(final RecordHandler handler) {
        final long head = UNSAFE.getLong(headAddress);

        final int index = (int) head & mask;
        final int limit = Math.min(capacity - index, MAX_READ_LENGTH);

        int read = 0;

        try {
            do {
                final int offset = index + read;
                final int length = UNSAFE.getIntVolatile(null, dataAddress + offset);

                if (length == 0) {
                    break;
                }

                if (length < 0) {
                    read += -length;
                    continue;
                }

                read += Util.align(length, LogRecordEncoder.ALIGNMENT);
                handler.onRecord(buffer, offset, length);
            } while (read < limit);
        } finally {
            if (read != 0) {
                UNSAFE.putByte(dataAddress + index, (byte) 0);
                UNSAFE.setMemory(dataAddress + index + 1, read - 1, (byte) 0);
                UNSAFE.putOrderedLong(null, headAddress, head + read);
            }
        }

        return read;
    }