On 5/31/07, toad at freenetproject.org <toad at freenetproject.org> wrote: > Author: toad > Date: 2007-05-31 21:20:48 +0000 (Thu, 31 May 2007) > New Revision: 13423 > > Modified: > trunk/freenet/src/freenet/io/comm/MessageFilter.java > trunk/freenet/src/freenet/io/comm/UdpSocketManager.java > Log: > Refactoring on MessageFilter/USM. Reduces locking a bit. Will introduce > asynchronous MessageFilter API soon. > > Modified: trunk/freenet/src/freenet/io/comm/MessageFilter.java > =================================================================== > --- trunk/freenet/src/freenet/io/comm/MessageFilter.java 2007-05-31 > 20:50:31 UTC (rev 13422) > +++ trunk/freenet/src/freenet/io/comm/MessageFilter.java 2007-05-31 > 21:20:48 UTC (rev 13423) > @@ -200,4 +200,19 @@ > _droppedConnection = ctx; > } > } > + > + /** > + * Notify waiters that we have been matched. > + * Hopefully no locks will be held at this point by the caller. > + */ > + public synchronized void onMatched() { > + notifyAll(); > + } > + > + /** > + * Notify waiters that we have timed out. > + */ > + public synchronized void onTimedOut() { > + notifyAll(); > + } > } > > Modified: trunk/freenet/src/freenet/io/comm/UdpSocketManager.java > =================================================================== > --- trunk/freenet/src/freenet/io/comm/UdpSocketManager.java 2007-05-31 > 20:50:31 UTC (rev 13422) > +++ trunk/freenet/src/freenet/io/comm/UdpSocketManager.java 2007-05-31 > 21:20:48 UTC (rev 13423) > @@ -155,6 +155,7 @@ > // } > // Only used for debugging, no need to seed from Yarrow > dropRandom = new Random(); > + _timedOutFilters = new Vector(32); > logMINOR = Logger.shouldLog(Logger.MINOR, this); > } > > @@ -294,17 +295,24 @@ > return true; > } > > + /** Only used by removeTimedOutFilters() - if future code uses this > elsewhere, we need to > + * reconsider its locking. */ > + private final Vector _timedOutFilters; > + > + /** > + * Remove timed out filters. > + * Only called by realRun(), so it can move timed out filters to the > _timedOutFilters array, > + * and then tell them that they are timed out without holding locks. > + * > + */ > private void removeTimedOutFilters() { > long tStart = System.currentTimeMillis(); > synchronized (_filters) { > for (ListIterator i = _filters.listIterator(); > i.hasNext();) { > MessageFilter f = (MessageFilter) i.next(); > if (f.timedOut()) { > - f.setMessage(null); > - synchronized (f) { > - i.remove(); > - f.notifyAll(); > - } > + i.remove(); > + _timedOutFilters.add(f); > } else { // Because _filters are in order of > timeout, we > // can abort the iteration as soon as > we find one that > // doesn't timeout > @@ -312,6 +320,17 @@ > } > } > } > + > + for(int i=0;i<_timedOutFilters.size();i++) { > + MessageFilter f = (MessageFilter) > _timedOutFilters.get(i); > + f.setMessage(null); > + f.onTimedOut(); > + synchronized (f) { > + f.notifyAll(); > + } > + } > + _timedOutFilters.clear(); > + > long tEnd = System.currentTimeMillis(); > if(tEnd - tStart > 50) { > if(tEnd - tStart > 3000) > @@ -343,14 +362,15 @@ > + m.getSource() + " : " + m); > } > } > + MessageFilter match = null; > synchronized (_filters) { > for (ListIterator i = _filters.listIterator(); > i.hasNext();) { > MessageFilter f = (MessageFilter) i.next(); > if (f.match(m)) { > matched = true; > - f.setMessage(m); > + i.remove(); > + match = f; > synchronized (f) { > - i.remove(); > f.notifyAll(); > } > if(logMINOR) Logger.minor(this, > "Matched: "+f); > @@ -358,6 +378,8 @@ > } > } > } > + match.setMessage(m); > + match.onMatched(); > // Feed unmatched messages to the dispatcher > if ((!matched) && (_dispatcher != null)) { > try { > @@ -397,11 +419,8 @@ > MessageFilter f = (MessageFilter) > i.next(); > if (f.match(m)) { > matched = true; > - f.setMessage(m); > - synchronized (f) { > - i.remove(); > - f.notifyAll(); > - } > + match = f; > + i.remove(); > if(logMINOR) > Logger.minor(this, "Matched: "+f); > break; // Only one match > permitted per message > } > @@ -420,6 +439,10 @@ > if(logMINOR) Logger.minor(this, "Done"); > } > } > + if(match != null) { > + match.setMessage(m); > + match.onMatched(); > + } > } > long tEnd = System.currentTimeMillis(); > if(tEnd - tStart > 50) { >
This gives me a NPE Jun 01, 2007 04:25:01:906 (freenet.io.comm.UdpSocketManager, UdpSocketManager packet receiver thread on port 10692, ERROR): Caught java.lang.NullPointerException from freenet.node.FNPPacketMangler at 75d758 java.lang.NullPointerException at freenet.io.comm.UdpSocketManager.checkFilters(UdpSocketManager.java:381) at freenet.node.FNPPacketMangler.processDecryptedData(FNPPacketMangler.java:890) at freenet.node.FNPPacketMangler.tryProcess(FNPPacketMangler.java:718) at freenet.node.FNPPacketMangler.process(FNPPacketMangler.java:118) at freenet.io.comm.UdpSocketManager.realRun(UdpSocketManager.java:245) at freenet.io.comm.UdpSocketManager.runLoop(UdpSocketManager.java:212) at freenet.io.comm.UdpSocketManager.run(UdpSocketManager.java:168)