package org.python.pydev.shared_core.threaded_objects_pool;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.python.pydev.shared_core.structure.LinkedListWarningOnSlowOperations;
import org.python.pydev.shared_core.structure.Tuple;
/**
* This is a pool where we can have at most maxSize objects in it.
*
* Note that we may have several objects with the same configuration in the
* pool (and we ask for any which matches that configuration and later
* put objects given a configuration).
*
* Clients are responsible for actually creating the objects.
*/
public class ThreadedObjectsPool<X> {
private final int maxSize;
private final List<Tuple<Object, X>> lst;
private final Object lock = new Object();
public ThreadedObjectsPool(int maxSize) {
Assert.isTrue(maxSize > 0);
this.maxSize = maxSize;
lst = new LinkedListWarningOnSlowOperations<>();
}
/**
* Returns null if there's no object for the given configuration.
*/
public X getObject(Object configuration) {
synchronized (lock) {
Iterator<Tuple<Object, X>> iterator = lst.iterator();
while (iterator.hasNext()) {
Tuple<Object, X> tup = iterator.next();
if (tup.o1.equals(configuration)) {
iterator.remove();
return tup.o2;
}
}
}
return null;
}
/**
* Puts some object in the store.
*/
public void putObject(Object configuration, X obj) {
Assert.isNotNull(obj);
synchronized (lock) {
while (lst.size() + 1 > this.maxSize) {
lst.remove(0);
}
lst.add(new Tuple<Object, X>(configuration, obj));
}
}
}