diff --git a/tests/snippets/stdlib_signal.py b/tests/snippets/stdlib_signal.py new file mode 100644 index 000000000..d711052eb --- /dev/null +++ b/tests/snippets/stdlib_signal.py @@ -0,0 +1,16 @@ +import signal +import time + +signals = [] + +def handler(signum, frame): + signals.append(signum) + + +signal.signal(14, handler) +assert signal.getsignal(14) is handler + +signal.alarm(2) +time.sleep(3.0) +assert signals == [14] + diff --git a/vm/src/stdlib/signal.rs b/vm/src/stdlib/signal.rs index c26756d90..01e047fc8 100644 --- a/vm/src/stdlib/signal.rs +++ b/vm/src/stdlib/signal.rs @@ -13,7 +13,7 @@ use nix::unistd::alarm as sig_alarm; // Signal triggers // TODO: 64 -const NSIG: usize = 10; +const NSIG: usize = 15; static mut TRIGGERS: [AtomicBool; NSIG] = [ AtomicBool::new(false), @@ -26,6 +26,11 @@ static mut TRIGGERS: [AtomicBool; NSIG] = [ AtomicBool::new(false), AtomicBool::new(false), AtomicBool::new(false), + AtomicBool::new(false), + AtomicBool::new(false), + AtomicBool::new(false), + AtomicBool::new(false), + AtomicBool::new(false), ]; extern "C" fn run_signal(signum: i32) { @@ -82,7 +87,8 @@ pub fn check_signals(vm: &VirtualMachine) { } let triggerd = unsafe { TRIGGERS[*signum as usize].swap(false, Ordering::Relaxed) }; if triggerd { - vm.invoke(handler.clone(), vec![]).expect("Test"); + vm.invoke(handler.clone(), vec![vm.new_int(*signum), vm.get_none()]) + .expect("Test"); } } }