/** * Called from the {@link Receiver} thread to processing any pending loss of packets. * * @return number of work items processed. */ int processPendingLoss() { int workCount = 0; final long changeNumber = endLossChange; if (changeNumber != lastLossChangeNumber) { final int termId = lossTermId; final int termOffset = lossTermOffset; final int length = lossLength; UNSAFE .loadFence(); // LoadLoad required so previous loads don't move past version check below. if (changeNumber == beginLossChange) { if (isReliable) { channelEndpoint.sendNakMessage( controlAddress, sessionId, streamId, termId, termOffset, length); nakMessagesSent.orderedIncrement(); } else { final UnsafeBuffer termBuffer = termBuffers[indexByTerm(initialTermId, termId)]; if (tryFillGap(rawLog.logMetaData(), termBuffer, termId, termOffset, length)) { lossGapFills.orderedIncrement(); } } lastLossChangeNumber = changeNumber; workCount = 1; } } return workCount; }