Work around plugins being garbage collected once enabled twice.

When a plugin is enabled, disabled and then enabled again, on that second enable, that instance is being garbage collected causing the loading of the plugin to fail. Work around that until we can narrow down why is this is happening on the second enable.
This commit is contained in:
Pedro Algarvio 2011-06-05 22:28:37 +01:00
parent bc56b749ee
commit 2f71ef4264
3 changed files with 25 additions and 5 deletions

View File

@ -97,10 +97,11 @@ class Component(object):
self._component_starting_deferred = None
self._component_stopping_deferred = None
_ComponentRegistry.register(self)
log.debug("Component '%s' initialized", self._component_name)
def __del__(self):
_ComponentRegistry.deregister(self._component_name)
def _component_start_timer(self):
if hasattr(self, "update"):
self._component_timer = LoopingCall(self.update)
@ -149,7 +150,7 @@ class Component(object):
self._component_stopping_deferred = None
log.error(result)
return result
if self._component_state != "Stopped" and self._component_state != "Stopping":
if hasattr(self, "stop"):
self._component_state = "Stopping"
@ -250,6 +251,18 @@ class ComponentRegistry(object):
else:
return succeed(None)
def registered(self, name):
"""
Check if a component is registered with the us
:param name: the Component name to check
:type name: string
:returns: True or False
:rtype: bolean
"""
return name in self.components
def start(self, names=[]):
"""
Starts Components that are currently in a Stopped state and their
@ -392,7 +405,9 @@ class ComponentRegistry(object):
_ComponentRegistry = ComponentRegistry()
register = _ComponentRegistry.register
deregister = _ComponentRegistry.deregister
registered = _ComponentRegistry.registered
start = _ComponentRegistry.start
stop = _ComponentRegistry.stop
pause = _ComponentRegistry.pause

View File

@ -166,8 +166,13 @@ class PluginManagerBase:
DeprecationWarning,
instance.__module__, 0
)
if not component.registered(instance.plugin._component_name):
component.register(instance.plugin)
if self._component_state == "Started":
component.start([instance.plugin._component_name])
plugin_name = plugin_name.replace("-", " ")
self.plugins[plugin_name] = instance
if plugin_name not in self.config["enabled_plugins"]:

View File

@ -56,12 +56,12 @@ class CorePluginBase(PluginBase):
super(CorePluginBase, self).__init__("CorePlugin." + plugin_name)
# Register RPC methods
component.get("RPCServer").register_object(self, plugin_name.lower())
log.debug("CorePlugin initialized..")
log.debug("CorePlugin '%s' initialized..", plugin_name)
class GtkPluginBase(PluginBase):
def __init__(self, plugin_name):
super(GtkPluginBase, self).__init__("GtkPlugin." + plugin_name)
log.debug("GtkPlugin initialized..")
log.debug("GtkPlugin '%s' initialized..", plugin_name)
class WebPluginBase(PluginBase):
@ -76,7 +76,7 @@ class WebPluginBase(PluginBase):
# Register JSON rpc methods
component.get("JSON").register_object(self, plugin_name.lower())
log.debug("WebPlugin initialized..")
log.debug("WebPlugin '%s' initialized..", plugin_name)
def enable(self):
pass