Author: toad
Date: 2007-09-08 15:58:42 +0000 (Sat, 08 Sep 2007)
New Revision: 15049

Modified:
   trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
   trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
Log:
Unregister plugin from web interface etc before telling it to terminate. Remove 
it from the plugin list only after it has successfully terminated and any 
thread has returned.

Modified: trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
15:53:42 UTC (rev 15048)
+++ trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
15:58:42 UTC (rev 15049)
@@ -81,6 +81,7 @@
                                        System.err.println("Caught Throwable 
while running plugin: "+t);
                                        t.printStackTrace();
                                }
+                               pm.unregisterPlugin(pi); // If not already 
unregistered
                                if(!(plugin instanceof FredPluginThreadless))
                                        pm.removePlugin(pi);
                        } else {

Modified: trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java      
2007-09-08 15:53:42 UTC (rev 15048)
+++ trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java      
2007-09-08 15:58:42 UTC (rev 15049)
@@ -93,6 +93,7 @@
         * or else a value in milliseconds.
         **/
        public void stopPlugin(PluginManager manager, int maxWaitTime) {
+               manager.unregisterPlugin(this);
                plug.terminate();
                stopping = true;
                if(thread != null) {

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-09-08 
15:53:42 UTC (rev 15048)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-09-08 
15:58:42 UTC (rev 15049)
@@ -168,14 +168,21 @@
        }

        /**
-        * Remove a plugin from the plugin list, unregister it from anywhere it 
may 
-        * have registered. This is eventually called whenever any plugin is 
removed.
-        * @param t
+        * Remove a plugin from the plugin list.
         */
        public void removePlugin(PluginInfoWrapper pi) {
                synchronized (pluginWrappers) {
                        if(!pluginWrappers.remove(pi)) return;
                }
+               core.storeConfig();
+       }
+       
+       /**
+        * Unregister a plugin from any user interface or other callbacks it 
may be
+        * registered with. Call this before removePlugin(): the plugin becomes
+        * unvisitable immediately, but it may take time for it to shut down 
completely.
+        */
+       public void unregisterPlugin(PluginInfoWrapper pi) {
                synchronized (toadletList) {
                        try {
                                toadletList.remove(pi.getPluginClassName());


Reply via email to