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());