Add support for a custom, per-instance signal handler (#620)
* Per Instance signal handler * add custom signal handler test * add instance signal handling to callable.rs * extend signal handler test to test callable.rs * test multiple instances, multiple signal handlers * support more than one current instance import_calling_export.rs is a good example of why this is needed: execution switches from one instance to another before the first one has finished running * add another custom signal handler test case * move and update custom signal handler tests * fmt * fix libc version to 0.2 * call the correct instance signal handler We keep a stack of instances so should call last() not first(). * move custom signal handler test to top level dir * windows/mac signal handling wip * os-specific signal handling wip * disable custom signal handler test on windows * fmt * unify signal handling on mac and linux
This commit is contained in:
@@ -161,3 +161,37 @@ impl Instance {
|
||||
instance_handle.lookup("memory")
|
||||
}
|
||||
}
|
||||
|
||||
// OS-specific signal handling
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_os = "linux")] {
|
||||
impl Instance {
|
||||
/// The signal handler must be
|
||||
/// [async-signal-safe](http://man7.org/linux/man-pages/man7/signal-safety.7.html).
|
||||
pub fn set_signal_handler<H>(&mut self, handler: H)
|
||||
where
|
||||
H: 'static + Fn(libc::c_int, *const libc::siginfo_t, *const libc::c_void) -> bool,
|
||||
{
|
||||
self.instance_handle.set_signal_handler(handler);
|
||||
}
|
||||
}
|
||||
} else if #[cfg(target_os = "windows")] {
|
||||
impl Instance {
|
||||
pub fn set_signal_handler<H>(&mut self, handler: H)
|
||||
where
|
||||
H: 'static + Fn(winapi::um::winnt::EXCEPTION_POINTERS) -> bool,
|
||||
{
|
||||
self.instance_handle.set_signal_handler(handler);
|
||||
}
|
||||
}
|
||||
} else if #[cfg(target_os = "macos")] {
|
||||
impl Instance {
|
||||
pub fn set_signal_handler<H>(&mut self, handler: H)
|
||||
where
|
||||
H: 'static + Fn(libc::c_int, *const libc::siginfo_t, *const libc::c_void) -> bool,
|
||||
{
|
||||
self.instance_handle.set_signal_handler(handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user