All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.l4.vibe.internal.timer.TimerImpl Maven / Gradle / Ivy

There is a newer version: 0.4.0
Show newest version
package se.l4.vibe.internal.timer;

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import se.l4.vibe.percentile.PercentileCounter;
import se.l4.vibe.timer.Stopwatch;
import se.l4.vibe.timer.Timer;
import se.l4.vibe.timer.TimerListener;
import se.l4.vibe.timer.TimerSnapshot;

/**
 * Implementation of {@link Timer}.
 * 
 * @author Andreas Holstenson
 *
 */
public class TimerImpl
	implements Timer
{
	private static final TimerListener[] EMPTY = new TimerListener[0];
	
	private final Lock listenerLock;
	protected volatile TimerListener[] listeners;
	
	private final PercentileCounter counter;
	private volatile TimerSnapshot lastSample;

	private final AtomicLong min;
	private final AtomicLong max;
	
	public TimerImpl(PercentileCounter counter)
	{
		this.counter = counter;
		
		listenerLock = new ReentrantLock();
		listeners = EMPTY;
		
		min = new AtomicLong();
		max = new AtomicLong();
	}
	
	@Override
	public void addListener(TimerListener listener)
	{
		listenerLock.lock();
		try
		{
			TimerListener[] listeners = this.listeners;
			TimerListener[] newListeners = new TimerListener[listeners.length + 1];
			System.arraycopy(listeners, 0, newListeners, 0, listeners.length);
			newListeners[listeners.length] = listener;
			
			this.listeners = newListeners;
		}
		finally
		{
			listenerLock.unlock();
		}
	}
	
	@Override
	public void removeListener(TimerListener listener)
	{
		listenerLock.lock();
		try
		{
			TimerListener[] listeners = this.listeners;
			
			int index = -1;
			for(int i=0, n=listeners.length; i c > total ? total : c);
				max.updateAndGet(c -> c < total ? total : c);
				
				TimerListener[] listeners = TimerImpl.this.listeners;
				if(listeners.length > 0)
				{
					for(TimerListener l : listeners)
					{
						l.timerEvent(nowInMs, total);
					}
				}
			}
		};
	}
	
	private TimerSnapshot createSample()
	{
		return new TimerSnapshotImpl(counter.get(), min.get(), max.get());
	}

	@Override
	public TimerSnapshot peek()
	{
		return createSample();
	}
	
	@Override
	public TimerSnapshot read()
	{
		return lastSample;
	}
	
	@Override
	public TimerSnapshot sample()
	{
		lastSample = createSample();
		counter.reset();
		min.set(Long.MAX_VALUE);
		max.set(0);
		return lastSample;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy