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)