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;
}