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