author | Edouard Tisserant |
Tue, 10 Jul 2018 12:54:05 +0200 | |
branch | nevow_service_rework |
changeset 2220 | 985f234b0d09 |
parent 2000 | 9fa2f8ede5d6 |
child 2015 | 4eeefc6a13fd |
permissions | -rw-r--r-- |
2000
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
1 |
from ctypes import CDLL, RTLD_GLOBAL, pointer, c_int, POINTER, c_char, create_string_buffer |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
2 |
def TryPreloadXenomai(): |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
3 |
""" |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
4 |
Xenomai 3 (at least for version <= 3.0.6) do not handle properly dlclose |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
5 |
of shared objects whose dlopen did trigger xenomai_init. |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
6 |
As a workaround, this pre-loads xenomai libraries that need to be |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
7 |
initialized and call xenomai_init once for all. |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
8 |
|
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
9 |
Xenomai auto init of libs MUST be disabled (see --auto-init-solib in xeno-config) |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
10 |
""" |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
11 |
try: |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
12 |
for name in ["cobalt", "modechk", "copperplate", "alchemy"]: |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
13 |
globals()[name] = CDLL("lib"+name+".so", mode=RTLD_GLOBAL) |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
14 |
cobalt.xenomai_init(pointer(c_int(0)), pointer((POINTER(c_char)*2)(create_string_buffer("prog_name"), None))) |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
15 |
except: |
9fa2f8ede5d6
Fixed random segfault happening when loading new PLC in runtime, when using Xenonai.
Edouard Tisserant
parents:
diff
changeset
|
16 |
pass |