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,6 +97,7 @@ class Component(object):
self._component_starting_deferred = None self._component_starting_deferred = None
self._component_stopping_deferred = None self._component_stopping_deferred = None
_ComponentRegistry.register(self) _ComponentRegistry.register(self)
log.debug("Component '%s' initialized", self._component_name)
def __del__(self): def __del__(self):
_ComponentRegistry.deregister(self._component_name) _ComponentRegistry.deregister(self._component_name)
@ -250,6 +251,18 @@ class ComponentRegistry(object):
else: else:
return succeed(None) 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=[]): def start(self, names=[]):
""" """
Starts Components that are currently in a Stopped state and their Starts Components that are currently in a Stopped state and their
@ -392,7 +405,9 @@ class ComponentRegistry(object):
_ComponentRegistry = ComponentRegistry() _ComponentRegistry = ComponentRegistry()
register = _ComponentRegistry.register
deregister = _ComponentRegistry.deregister deregister = _ComponentRegistry.deregister
registered = _ComponentRegistry.registered
start = _ComponentRegistry.start start = _ComponentRegistry.start
stop = _ComponentRegistry.stop stop = _ComponentRegistry.stop
pause = _ComponentRegistry.pause pause = _ComponentRegistry.pause

View File

@ -166,8 +166,13 @@ class PluginManagerBase:
DeprecationWarning, DeprecationWarning,
instance.__module__, 0 instance.__module__, 0
) )
if not component.registered(instance.plugin._component_name):
component.register(instance.plugin)
if self._component_state == "Started": if self._component_state == "Started":
component.start([instance.plugin._component_name]) component.start([instance.plugin._component_name])
plugin_name = plugin_name.replace("-", " ") plugin_name = plugin_name.replace("-", " ")
self.plugins[plugin_name] = instance self.plugins[plugin_name] = instance
if plugin_name not in self.config["enabled_plugins"]: 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) super(CorePluginBase, self).__init__("CorePlugin." + plugin_name)
# Register RPC methods # Register RPC methods
component.get("RPCServer").register_object(self, plugin_name.lower()) component.get("RPCServer").register_object(self, plugin_name.lower())
log.debug("CorePlugin initialized..") log.debug("CorePlugin '%s' initialized..", plugin_name)
class GtkPluginBase(PluginBase): class GtkPluginBase(PluginBase):
def __init__(self, plugin_name): def __init__(self, plugin_name):
super(GtkPluginBase, self).__init__("GtkPlugin." + plugin_name) super(GtkPluginBase, self).__init__("GtkPlugin." + plugin_name)
log.debug("GtkPlugin initialized..") log.debug("GtkPlugin '%s' initialized..", plugin_name)
class WebPluginBase(PluginBase): class WebPluginBase(PluginBase):
@ -76,7 +76,7 @@ class WebPluginBase(PluginBase):
# Register JSON rpc methods # Register JSON rpc methods
component.get("JSON").register_object(self, plugin_name.lower()) component.get("JSON").register_object(self, plugin_name.lower())
log.debug("WebPlugin initialized..") log.debug("WebPlugin '%s' initialized..", plugin_name)
def enable(self): def enable(self):
pass pass