
se.l4.vibe.probes.AbstractSampler Maven / Gradle / Ivy
package se.l4.vibe.probes;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Abstract implementation of {@link Sampler}.
*
* @author Andreas Holstenson
*
* @param
*/
public abstract class AbstractSampler
implements Sampler
{
private static final SampleListener[] EMPTY = new SampleListener[0];
private final Lock listenerLock;
protected volatile SampleListener[] listeners;
public AbstractSampler()
{
listenerLock = new ReentrantLock();
listeners = EMPTY;
}
@Override
public void addListener(SampleListener listener)
{
listenerLock.lock();
try
{
SampleListener[] listeners = this.listeners;
SampleListener[] newListeners = new SampleListener[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(SampleListener listener)
{
listenerLock.lock();
try
{
SampleListener[] listeners = this.listeners;
int index = -1;
for(int i=0, n=listeners.length; i[] newListeners = new SampleListener[listeners.length - 1];
System.arraycopy(listeners, 0, newListeners, 0, index);
if(index < listeners.length - 1)
{
System.arraycopy(listeners, index + 1, newListeners, index, listeners.length- index - 1);
}
this.listeners = newListeners;
}
finally
{
listenerLock.unlock();
}
}
protected Entry createEntry(long time, T value)
{
return new EntryImpl(time, value);
}
public static class EntryImpl
implements Sampler.Entry
{
private final long time;
private final T value;
public EntryImpl(long time, T value)
{
this.time = time;
this.value = value;
}
@Override
public long getTime()
{
return time;
}
@Override
public T getValue()
{
return value;
}
@Override
public String toString()
{
return "Entry{time=" + time + ", value=" + value + "}";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy