X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Fpy_plugin.py;h=f1142766e3230152ef08acf458ba3069b58ebac7;hb=0530003ff4f693e0a582a0ed4a15245455398b4a;hp=5f620ab794ad20321c219c5eadd4e01c0e6d1b55;hpb=61d96b89a9c8b3b523558a3c007c2aaedaba2a55;p=babeltrace.git diff --git a/src/bindings/python/bt2/bt2/py_plugin.py b/src/bindings/python/bt2/bt2/py_plugin.py index 5f620ab7..f1142766 100644 --- a/src/bindings/python/bt2/bt2/py_plugin.py +++ b/src/bindings/python/bt2/bt2/py_plugin.py @@ -21,11 +21,16 @@ # THE SOFTWARE. from bt2 import utils -import bt2.component +from bt2 import component as bt2_component +import sys + + +# Python plugin path to `_PluginInfo` (cache) +_plugin_infos = {} def plugin_component_class(component_class): - if not issubclass(component_class, bt2.component._UserComponent): + if not issubclass(component_class, bt2_component._UserComponent): raise TypeError('component class is not a subclass of a user component class') component_class._bt_plugin_component_class = None @@ -35,8 +40,6 @@ def plugin_component_class(component_class): def register_plugin( module_name, name, description=None, author=None, license=None, version=None ): - import sys - if module_name not in sys.modules: raise RuntimeError( "cannot find module '{}' in loaded modules".format(module_name) @@ -102,6 +105,10 @@ class _PluginInfo: # called by the BT plugin system def _try_load_plugin_module(path): + if path in _plugin_infos: + # do not load module and create plugin info twice for this path + return _plugin_infos[path] + import importlib.machinery import inspect import hashlib @@ -115,7 +122,7 @@ def _try_load_plugin_module(path): h = hashlib.sha256() h.update(path.encode()) module_name = 'bt_plugin_{}'.format(h.hexdigest()) - + assert module_name not in sys.modules # try loading the module: any raised exception is catched by the caller mod = importlib.machinery.SourceFileLoader(module_name, path).load_module() @@ -137,4 +144,5 @@ def _try_load_plugin_module(path): comp_class_entries = inspect.getmembers(mod, is_user_comp_class) plugin_info.comp_class_addrs = [entry[1].addr for entry in comp_class_entries] + _plugin_infos[path] = plugin_info return plugin_info