* LHMCache: New util, replacing several private versions

This commit is contained in:
zzz
2012-09-03 15:33:12 +00:00
parent c965a3dca0
commit 8575437626
6 changed files with 34 additions and 68 deletions

View File

@ -14,7 +14,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -24,6 +23,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
import net.i2p.data.SimpleDataStructure;
import net.i2p.util.LHMCache;
import net.i2p.util.Log;
/**
@ -658,7 +658,7 @@ public class KBucketSet<T extends SimpleDataStructure> {
public Range(T us, int bValue) {
_bValue = bValue;
_bigUs = new BigInteger(1, us.getData());
_distanceCache = new LHM(256);
_distanceCache = new LHMCache(256);
}
/** @return 0 to max-1 or -1 for us */
@ -697,20 +697,6 @@ public class KBucketSet<T extends SimpleDataStructure> {
}
}
private static class LHM<K, V> extends LinkedHashMap<K, V> {
private final int _max;
public LHM(int max) {
super(max, 0.75f, true);
_max = max;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > _max;
}
}
/**
* For Collections.binarySearch.
* getRangeBegin == getRangeEnd.

View File

@ -18,7 +18,6 @@ import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@ -44,6 +43,7 @@ import net.i2p.internal.I2CPMessageQueue;
import net.i2p.internal.InternalClientManager;
import net.i2p.internal.QueuedI2CPMessageReader;
import net.i2p.util.I2PAppThread;
import net.i2p.util.LHMCache;
import net.i2p.util.Log;
import net.i2p.util.SimpleScheduler;
import net.i2p.util.SimpleTimer;
@ -140,7 +140,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
/**
* @since 0.8.9
*/
private static final LookupCache _lookupCache = new LookupCache(16);
private static final Map<Hash, Destination> _lookupCache = new LHMCache(16);
/** SSL interface (only) @since 0.8.3 */
protected static final String PROP_ENABLE_SSL = "i2cp.SSL";
@ -985,21 +985,4 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
buf.append(getPrefix());
return buf.toString();
}
/**
* @since 0.8.9
*/
private static class LookupCache extends LinkedHashMap<Hash, Destination> {
private final int _max;
public LookupCache(int max) {
super(max, 0.75f, true);
_max = max;
}
@Override
protected boolean removeEldestEntry(Map.Entry<Hash, Destination> eldest) {
return size() > _max;
}
}
}

View File

@ -29,6 +29,7 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.util.LHMCache;
import net.i2p.util.Log;
import net.i2p.util.SecureFileOutputStream;
@ -134,7 +135,7 @@ public class BlockfileNamingService extends DummyNamingService {
super(context);
_lists = new ArrayList();
_invalid = new ArrayList();
_negativeCache = new LHM(NEGATIVE_CACHE_SIZE);
_negativeCache = new LHMCache(NEGATIVE_CACHE_SIZE);
BlockFile bf = null;
RAIFile raf = null;
boolean readOnly = false;

View File

@ -7,13 +7,13 @@
*/
package net.i2p.client.naming;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.data.Destination;
import net.i2p.util.LHMCache;
/**
* A Dummy naming service that can only handle base64 and b32 destinations.
@ -30,7 +30,7 @@ class DummyNamingService extends NamingService {
* Classes should take care to call removeCache() for any entries that
* are invalidated.
*/
private static final Map<String, Destination> _cache = new LHM(CACHE_MAX_SIZE);
private static final Map<String, Destination> _cache = new LHMCache(CACHE_MAX_SIZE);
/**
* The naming service should only be constructed and accessed through the
@ -115,18 +115,4 @@ class DummyNamingService extends NamingService {
_cache.clear();
}
}
protected static class LHM<K, V> extends LinkedHashMap<K, V> {
private final int _max;
public LHM(int max) {
super(max, 0.75f, true);
_max = max;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > _max;
}
}
}

View File

@ -6,10 +6,10 @@ import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedHashMap;
import java.util.Map;
import net.i2p.I2PAppContext;
import net.i2p.util.LHMCache;
import net.i2p.util.SimpleByteCache;
/**
@ -71,7 +71,7 @@ public class SDSCache<V extends SimpleDataStructure> {
*/
public SDSCache(Class<V> rvClass, int len, int max) {
int size = (int) (max * FACTOR);
_cache = new LHM(size);
_cache = new LHMCache(size);
_datalen = len;
try {
_rvCon = rvClass.getConstructor(conArg);
@ -181,18 +181,4 @@ public class SDSCache<V extends SimpleDataStructure> {
rv ^= (data[i] << (i*8));
return Integer.valueOf(rv);
}
private static class LHM<K, V> extends LinkedHashMap<K, V> {
private final int _max;
public LHM(int max) {
super(max, 0.75f, true);
_max = max;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > _max;
}
}
}

View File

@ -0,0 +1,24 @@
package net.i2p.util;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* A LinkedHashMap with a maximum size, for use as
* an LRU cache. Unsynchronized.
*
* @since 0.9.3
*/
public class LHMCache<K, V> extends LinkedHashMap<K, V> {
private final int _max;
public LHMCache(int max) {
super(max, 0.75f, true);
_max = max;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > _max;
}
}