X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Fpy_plugin.py;h=f1142766e3230152ef08acf458ba3069b58ebac7;hb=0530003ff4f693e0a582a0ed4a15245455398b4a;hp=b845030863ce224582406af5698e840a3d70465c;hpb=57952005b6a6a0aeb1e4ecb0d7ac0c6786d23dba;p=babeltrace.git diff --git a/src/bindings/python/bt2/bt2/py_plugin.py b/src/bindings/python/bt2/bt2/py_plugin.py index b8450308..f1142766 100644 --- a/src/bindings/python/bt2/bt2/py_plugin.py +++ b/src/bindings/python/bt2/bt2/py_plugin.py @@ -21,23 +21,29 @@ # 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 return component_class -def register_plugin(module_name, name, description=None, author=None, - license=None, version=None): - import sys - +def register_plugin( + module_name, name, description=None, author=None, license=None, version=None +): if module_name not in sys.modules: - raise RuntimeError("cannot find module '{}' in loaded modules".format(module_name)) + raise RuntimeError( + "cannot find module '{}' in loaded modules".format(module_name) + ) utils._check_str(name) @@ -52,11 +58,13 @@ def register_plugin(module_name, name, description=None, author=None, if version is not None: if not _validate_version(version): - raise ValueError('wrong version: expecting a tuple: (major, minor, patch) or (major, minor, patch, extra)') + raise ValueError( + 'wrong version: expecting a tuple: (major, minor, patch) or (major, minor, patch, extra)' + ) - sys.modules[module_name]._bt_plugin_info = _PluginInfo(name, description, - author, license, - version) + sys.modules[module_name]._bt_plugin_info = _PluginInfo( + name, description, author, license, version + ) def _validate_version(version): @@ -97,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 @@ -110,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() @@ -132,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