# HG changeset patch # User Edouard Tisserant # Date 1524839573 -7200 # Node ID 9fa2f8ede5d65188a8bfcf9fb7f8c4952af44936 # Parent 36a624779f9fa42d3d0559e6793fea203213c560 Fixed random segfault happening when loading new PLC in runtime, when using Xenonai. diff -r 36a624779f9f -r 9fa2f8ede5d6 Beremiz_service.py --- a/Beremiz_service.py Thu Apr 19 15:17:05 2018 +0200 +++ b/Beremiz_service.py Fri Apr 27 16:32:53 2018 +0200 @@ -1,3 +1,4 @@ + #!/usr/bin/env python # -*- coding: utf-8 -*- @@ -37,6 +38,7 @@ import Pyro.core as pyro from runtime import PLCObject, ServicePublisher, MainWorker +from runtime.xenomai import TryPreloadXenomai import util.paths as paths @@ -133,6 +135,8 @@ if __name__ == '__main__': __builtin__.__dict__['_'] = lambda x: x + # TODO: add a cmdline parameter if Trying Preloading Xenomai makes problem + TryPreloadXenomai() def Bpath(*args): @@ -675,3 +679,4 @@ pyroserver.Quit() sys.exit(0) +ys.exit(0) diff -r 36a624779f9f -r 9fa2f8ede5d6 runtime/xenomai.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/xenomai.py Fri Apr 27 16:32:53 2018 +0200 @@ -0,0 +1,16 @@ +from ctypes import CDLL, RTLD_GLOBAL, pointer, c_int, POINTER, c_char, create_string_buffer +def TryPreloadXenomai(): + """ + Xenomai 3 (at least for version <= 3.0.6) do not handle properly dlclose + of shared objects whose dlopen did trigger xenomai_init. + As a workaround, this pre-loads xenomai libraries that need to be + initialized and call xenomai_init once for all. + + Xenomai auto init of libs MUST be disabled (see --auto-init-solib in xeno-config) + """ + try: + for name in ["cobalt", "modechk", "copperplate", "alchemy"]: + globals()[name] = CDLL("lib"+name+".so", mode=RTLD_GLOBAL) + cobalt.xenomai_init(pointer(c_int(0)), pointer((POINTER(c_char)*2)(create_string_buffer("prog_name"), None))) + except: + pass diff -r 36a624779f9f -r 9fa2f8ede5d6 targets/Xenomai/__init__.py --- a/targets/Xenomai/__init__.py Thu Apr 19 15:17:05 2018 +0200 +++ b/targets/Xenomai/__init__.py Fri Apr 27 16:32:53 2018 +0200 @@ -37,7 +37,7 @@ if xeno_config: from util.ProcessLogger import ProcessLogger status, result, _err_result = ProcessLogger(self.CTRInstance.logger, - xeno_config + " --skin=native --"+flagsname, + xeno_config + " --skin=posix --skin=alchemy --no-auto-init --"+flagsname, no_stdout=True).spin() if status: self.CTRInstance.logger.write_error(_("Unable to get Xenomai's %s \n") % flagsname)