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