Author: toad
Date: 2007-09-26 20:01:30 +0000 (Wed, 26 Sep 2007)
New Revision: 15358

Modified:
   trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
Log:
Run all IP detection plugins in parallel. As soon as one has completed it can 
be restarted, if it is decided that it is useful to do so.
So JSTUN won't have to wait for the often very slow UPnP plugin to finish.

Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-09-26 
19:57:28 UTC (rev 15357)
+++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-09-26 
20:01:30 UTC (rev 15358)
@@ -1,6 +1,7 @@
 package freenet.node;

 import java.net.InetAddress;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
@@ -16,6 +17,7 @@
 import freenet.pluginmanager.ForwardPort;
 import freenet.pluginmanager.ForwardPortCallback;
 import freenet.pluginmanager.ForwardPortStatus;
+import freenet.pluginmanager.FredPlugin;
 import freenet.pluginmanager.FredPluginIPDetector;
 import freenet.pluginmanager.FredPluginPortForward;
 import freenet.support.HTMLNode;
@@ -196,6 +198,7 @@
         * Remove a plugin.
         */
        public void unregisterDetectorPlugin(FredPluginIPDetector d) {
+               DetectorRunner runningDetector;
                synchronized(this) {
                        int count = 0;
                        for(int i=0;i<plugins.length;i++) {
@@ -208,7 +211,9 @@
                                if(plugins[i] != d) newPlugins[x++] = 
plugins[i];
                        }
                        plugins = newPlugins;
+                       runningDetector = (DetectorRunner) runners.get(d);
                }
+               runningDetector.kill();
        }


@@ -244,7 +249,7 @@
         * (To detect new IP address)
         */ 

-       private DetectorRunner runner;
+       private HashMap /*<FredIPDetectorPlugin,DetectorRunner>*/ runners;
        private boolean lastDetectAttemptFailed;
        private long lastDetectAttemptEndedTime;
        private long firstTimeMaybeFakePeers;
@@ -266,10 +271,11 @@
                                detector.hasDetectedPM();
                                return;
                        }
-                       if(runner != null) {
+                       if(runners.size() < plugins.length) {
                                if(logMINOR) Logger.minor(this, "Already 
running IP detection plugins");
                                return;
-                       }
+                       } // FIXME what about detectors that take ages vs 
detectors that are fast?
+                       
                        // If detect attempt failed to produce an IP in the 
last 5 minutes, don't
                        // try again yet.
                        if(lastDetectAttemptFailed) {
@@ -487,13 +493,28 @@
        private void startDetect() {
                if(logMINOR) Logger.minor(this, "Detecting...");
                synchronized(this) {
-                       runner = new DetectorRunner();
-                       node.executor.execute(runner, "Plugin detector runner");
+                       for(int i=0;i<plugins.length;i++) {
+                               FredPluginIPDetector plugin = plugins[i];
+                               if(runners.containsKey(plugin)) continue;
+                               DetectorRunner d = new 
DetectorRunner(plugins[i]);
+                               runners.put(plugin, d);
+                               node.executor.execute(d, "Plugin detector 
runner for "+plugins[i].getClass());
+                       }
                }
        }

        public class DetectorRunner implements Runnable {
+               
+               final FredPluginIPDetector plugin;

+               public DetectorRunner(FredPluginIPDetector detector) {
+                       plugin = detector;
+               }
+
+               public void kill() {
+                       node.pluginManager.killPlugin((FredPlugin)plugin, 0);
+               }
+
                public void run() {
                        freenet.support.Logger.OSThread.logPID(this);
                        try {
@@ -508,12 +529,10 @@
                public void realRun() {
                        if(logMINOR) Logger.minor(this, "Running plugin 
detection");
                        try {
-                               FredPluginIPDetector[] run = plugins;
                                Vector v = new Vector();
-                               for(int i=0;i<run.length;i++) {
                                        DetectedIP[] detected = null;
                                        try {
-                                               detected = run[i].getAddress();
+                                               detected = plugin.getAddress();
                                        } catch (Throwable t) {
                                                Logger.error(this, "Caught "+t, 
t);
                                        }
@@ -521,7 +540,6 @@
                                                for(int 
j=0;j<detected.length;j++)
                                                        v.add(detected[j]);
                                        }
-                               }
                                synchronized(IPDetectorPluginManager.this) {
                                        lastDetectAttemptEndedTime = 
System.currentTimeMillis();
                                        boolean failed = false;
@@ -621,7 +639,9 @@
                                }
                                detector.processDetectedIPs(list);
                        } finally {
-                               runner = null;
+                               synchronized(IPDetectorPluginManager.this) {
+                                       runners.remove(plugin);
+                               }
                                detector.hasDetectedPM();
                        }
                }


Reply via email to