Skip to content

Commit bf3b426

Browse files
koubaafilmor
authored andcommitted
add set_signal_chaining flag
1 parent 6e40f71 commit bf3b426

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

clr_loader/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def get_mono(
3232
jit_options: Optional[Sequence[str]] = None,
3333
assembly_dir: Optional[str] = None,
3434
config_dir: Optional[str] = None,
35+
set_signal_chaining: bool = False
3536
) -> Runtime:
3637
"""Get a Mono runtime instance
3738
@@ -54,6 +55,16 @@ def get_mono(
5455
The base directory for assemblies, passed to ``mono_set_dirs``
5556
:param config_dir:
5657
The base directory for configuration files, passed to ``mono_set_dirs``
58+
:param set_signal_chaining:
59+
Whether to enable signal chaining, passed to ``mono_set_signal_chaining``.
60+
If it is enabled, the runtime saves the original signal handlers before
61+
installing its own, and calls the original ones in the following cases:
62+
- SIGSEGV/SIGABRT while executing native code
63+
- SIGPROF
64+
- SIGFPE
65+
- SIGQUIT
66+
- SIGUSR2
67+
This currently only works on POSIX platforms
5768
"""
5869
from .mono import Mono
5970

@@ -70,6 +81,7 @@ def get_mono(
7081
libmono=libmono,
7182
assembly_dir=assembly_dir,
7283
config_dir=config_dir,
84+
set_signal_chaining=set_signal_chaining,
7385
)
7486
return impl
7587

clr_loader/ffi/mono.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,8 @@
4141
void* mono_object_unbox(MonoObject *object);
4242
4343
void mono_set_dirs(const char *assembly_dir, const char* config_dir);
44+
45+
void mono_set_signal_chaining(bool chain_signals);
46+
4447
"""
4548
)

clr_loader/mono.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(
2626
global_config_file: Optional[Path] = None,
2727
assembly_dir: Optional[str] = None,
2828
config_dir: Optional[str] = None,
29+
set_signal_chaining: bool = False,
2930
):
3031
self._assemblies: Dict[Path, Any] = {}
3132

@@ -37,6 +38,7 @@ def __init__(
3738
libmono=libmono,
3839
assembly_dir=assembly_dir,
3940
config_dir=config_dir,
41+
set_signal_chaining=set_signal_chaining,
4042
)
4143

4244
if domain is None:
@@ -126,7 +128,8 @@ def initialize(
126128
config_file: Optional[str] = None,
127129
global_config_file: Optional[str] = None,
128130
assembly_dir: Optional[str] = None,
129-
config_dir: Optional[str] = None
131+
config_dir: Optional[str] = None,
132+
set_signal_chaining: bool = False,
130133
) -> str:
131134
global _MONO, _ROOT_DOMAIN
132135
if _MONO is None:
@@ -152,6 +155,9 @@ def initialize(
152155
else:
153156
options = []
154157

158+
if set_signal_chaining:
159+
_MONO.mono_set_signal_chaining(True)
160+
155161
if debug:
156162
_MONO.mono_debug_init(_MONO.MONO_DEBUG_FORMAT_MONO)
157163

0 commit comments

Comments
 (0)