package rocks.inspectit.server.cache.impl; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import rocks.inspectit.server.cache.IBufferElement; import rocks.inspectit.server.cache.IBufferElement.BufferElementState; import rocks.inspectit.shared.all.communication.DefaultData; /** * Analyze processor. Performs analyzing of element sizes in the buffer. * * @param <E> * Type of data to process. * * @author Ivan Senic * */ class AnalyzeBufferElementProcessor<E extends DefaultData> extends AbstractBufferElementProcessor<E> { /** * Default constructor. * * @param atomicBuffer * {@link AtomicBuffer} to work on. * @param lastProcessed * Reference to the last processed element. * @param lock * Lock to use during operation. * @param condition * Condition to wait on when there s nothing to process. */ public AnalyzeBufferElementProcessor(AtomicBuffer<E> atomicBuffer, AtomicReference<IBufferElement<E>> lastProcessed, Lock lock, Condition condition) { super(atomicBuffer, lastProcessed, lock, condition); } /** * {@inheritDoc} */ @Override public boolean process(IBufferElement<E> elementToProcess, IBufferElement<E> lastProcessedElement) { // only thread that execute compare and set successfully can perform changes if (lastProcessed.compareAndSet(lastProcessedElement, elementToProcess)) { // perform analysis elementToProcess.calculateAndSetBufferElementSize(atomicBuffer.objectSizes); elementToProcess.setBufferElementState(BufferElementState.ANALYZED); atomicBuffer.addToCurrentSize(elementToProcess.getBufferElementSize(), true); atomicBuffer.elementsAnalyzed.incrementAndGet(); return true; } return false; } }