Skip to content

Commit da898a3

Browse files
authored
Merge pull request #3151 from youknowone/signal
Refactor signal with pymodule
2 parents 6c3b323 + 1e9ec5b commit da898a3

4 files changed

Lines changed: 285 additions & 305 deletions

File tree

‎vm/src/lib.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ mod pyobjectrc;
6969
pub mod readline;
7070
pub mod scope;
7171
mod sequence;
72+
mod signal;
7273
mod sliceable;
7374
pub mod slots;
7475
pub mod stdlib;

‎vm/src/signal.rs‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use crate::{PyObjectRef, PyResult, VirtualMachine};
2+
use std::sync::atomic::{AtomicBool, Ordering};
3+
4+
pub const NSIG: usize = 64;
5+
pub(crate) static ANY_TRIGGERED: AtomicBool = AtomicBool::new(false);
6+
// hack to get around const array repeat expressions, rust issue #79270
7+
#[allow(clippy::declare_interior_mutable_const)]
8+
const ATOMIC_FALSE: AtomicBool = AtomicBool::new(false);
9+
pub(crate) static TRIGGERS: [AtomicBool; NSIG] = [ATOMIC_FALSE; NSIG];
10+
11+
#[cfg_attr(feature = "flame-it", flame)]
12+
#[inline(always)]
13+
pub fn check_signals(vm: &VirtualMachine) -> PyResult<()> {
14+
let signal_handlers = match &vm.signal_handlers {
15+
Some(h) => h,
16+
None => return Ok(()),
17+
};
18+
19+
if !ANY_TRIGGERED.load(Ordering::Relaxed) {
20+
return Ok(());
21+
}
22+
ANY_TRIGGERED.store(false, Ordering::Relaxed);
23+
24+
trigger_signals(&signal_handlers.borrow(), vm)
25+
}
26+
#[inline(never)]
27+
#[cold]
28+
fn trigger_signals(
29+
signal_handlers: &[Option<PyObjectRef>; NSIG],
30+
vm: &VirtualMachine,
31+
) -> PyResult<()> {
32+
for (signum, trigger) in TRIGGERS.iter().enumerate().skip(1) {
33+
let triggered = trigger.swap(false, Ordering::Relaxed);
34+
if triggered {
35+
if let Some(handler) = &signal_handlers[signum] {
36+
if vm.is_callable(handler) {
37+
vm.invoke(handler, (signum, vm.ctx.none()))?;
38+
}
39+
}
40+
}
41+
}
42+
Ok(())
43+
}

0 commit comments

Comments
 (0)