Update of /cvsroot/freenet/freenet/src/freenet/support In directory sc8-pr-cvs1:/tmp/cvs-serv17928/freenet/support
Added Files: BlackLRUQueue.java Log Message: Forgot a file from last commit --- NEW FILE: BlackLRUQueue.java --- package freenet.support; import java.util.Enumeration; import java.util.Hashtable; public class BlackLRUQueue { private long maxQueueTimeMillis=60000; private int maxQueueElements=200; private int maxFailures=3; private final DoublyLinkedListImpl list = new DoublyLinkedListImpl(); private final Hashtable hash = new Hashtable(); /* * This structure is designed for blacklisting things... * if you push an item into it, it is blacklisted for as * long as it is in there, pushing it again moves it to * the head and keeps it in the queue. */ public BlackLRUQueue() { } public BlackLRUQueue(long maxQueueTimeMillis, int maxQueueElements, int maxFailures) { this.maxQueueTimeMillis = maxQueueTimeMillis; this.maxQueueElements = maxQueueElements; this.maxFailures = maxFailures; } /** * push()ing an object that is already in * the queue moves that object to the most * recently used position, and resets it's * blacklist timer, but doesn't add a * duplicate entry in the queue. */ public final synchronized void push(Object obj) { QItem insert = (QItem)hash.get(obj); if (insert == null) { insert = new QItem(obj); hash.put(obj,insert); } else { list.remove(insert); insert.touch(); } list.unshift(insert); } /* This method should be called before checking if an object is still * blacklisted, otherwise you will get false positives. */ public final synchronized void clean() { while ( list.size() > maxQueueElements ) { hash.remove(((QItem)list.pop()).obj); } while ( list.size() > 0 && ((QItem)list.tail()).olderThan(System.currentTimeMillis() - maxQueueTimeMillis) ) { hash.remove(((QItem)list.pop()).obj); } } public final synchronized boolean containsKey(Object obj) { return hash.containsKey(obj); } public final synchronized boolean isBlackListed(Object obj) { QItem temp = (QItem)hash.get(obj); return temp==null?false:temp.worseThan(maxFailures); } // Least recently pushed Object. public final synchronized Object pop() { if ( list.size() > 0 ) { return ((QItem)hash.remove(((QItem)list.pop()).obj)).obj; } else { return null; } } public final int size() { return list.size(); } public final synchronized void remove(Object obj) { list.remove((QItem)hash.remove(obj)); } public Enumeration elements() { return new ItemEnumeration(); } private class ItemEnumeration implements Enumeration { private Enumeration source = list.reverseElements(); public boolean hasMoreElements() { return source.hasMoreElements(); } public Object nextElement() { return ((QItem) source.nextElement()).obj; } } private static class QItem extends DoublyLinkedListImpl.Item { public Object obj; private long lastTouchedTimeMillis; private int failures=0; public boolean olderThan(long oldestBlackList) { return lastTouchedTimeMillis < oldestBlackList; } public boolean worseThan(int maxFailures) { return failures >= maxFailures; } public void touch() { lastTouchedTimeMillis = System.currentTimeMillis(); failures++; } public QItem(Object obj) { this.obj = obj; touch(); } } } _______________________________________________ cvs mailing list [EMAIL PROTECTED] http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs