Author: toad
Date: 2007-09-08 17:31:12 +0000 (Sat, 08 Sep 2007)
New Revision: 15063

Modified:
   trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
Log:
More refactoring: make PluginStarter a Runnable.

Modified: trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
17:27:20 UTC (rev 15062)
+++ trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
17:31:12 UTC (rev 15063)
@@ -22,25 +22,27 @@
        public static PluginInfoWrapper startPlugin(PluginManager pm, String 
filename, FredPlugin plug, PluginRespirator pr) {
                final PluginInfoWrapper pi = new PluginInfoWrapper(plug, 
filename);
                final PluginStarter ps = new PluginStarter(pr, pi);
-               if(!pi.isThreadlessPlugin()) // No point otherwise
-                       pi.setThread(ps);
-               
                ps.setPlugin(pm, plug);
-               // Run after startup
-               // FIXME this is horrible, wastes a thread, need to make 
PluginStarter a Runnable 
-               // not a Thread, and then deal with the consequences of that 
(removePlugin(Thread)) ...
-               pm.getTicker().queueTimedJob(new Runnable() {
-                       public void run() {
-                               if (!pi.isThreadlessPlugin())
-                                       ps.start();
-                               else
-                                       ps.run();
-                       }
-               }, 0);
+               // We must start the plugin *after startup has finished*
+               Runnable job;
+               if(!pi.isThreadlessPlugin()) {
+                       final Thread t = new Thread(ps);
+                       t.setDaemon(true);
+                       pi.setThread(t);
+                       job = new Runnable() {
+                               public void run() {
+                                       t.start();
+                               }
+                       };
+               } else {
+                       job = ps;
+               }
+               // Run immediately after startup
+               pm.getTicker().queueTimedJob(job, 0);
                return pi;
        }

-       private static class PluginStarter extends Thread {
+       private static class PluginStarter implements Runnable {
                private Object plugin = null;
                private PluginRespirator pr;
                private PluginManager pm = null;
@@ -49,7 +51,6 @@
                public PluginStarter(PluginRespirator pr, PluginInfoWrapper pi) 
{
                        this.pr = pr;
                        this.pi = pi;
-                       setDaemon(true);
                }

                public void setPlugin(PluginManager pm, Object plugin) {


Reply via email to