blob: ada658d8014ecc130414a1e4b1ea5933a62865f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
extern crate psm;
use std::panic;
const CHAIN_DEPTH: usize = 16;
psm::psm_stack_manipulation! {
yes {
use std::alloc;
const STACK_ALIGN: usize = 4096;
// Generating backraces (because of RUST_BACKTRACE) create a few quite large frames, so it is
// important, that all frames have sufficient amount of available memory to not run over the
// stack...
const FRAME_SIZE: usize = 4096 * 10;
fn panic_chain(depth: usize) {
if depth == 0 {
panic!("full chain!");
} else {
unsafe {
let layout = alloc::Layout::from_size_align(FRAME_SIZE, STACK_ALIGN).unwrap();
let new_stack = alloc::alloc(layout);
assert!(!new_stack.is_null(), "allocations must succeed!");
let p = psm::on_stack(new_stack, FRAME_SIZE, || {
panic::catch_unwind(|| {
panic_chain(depth - 1);
})
});
alloc::dealloc(new_stack, layout);
p.map_err(panic::resume_unwind).unwrap()
}
}
}
fn main() {
panic_chain(CHAIN_DEPTH);
}
#[test]
fn run_example() {
assert!(panic::catch_unwind(|| {
panic_chain(CHAIN_DEPTH);
}).is_err(), "Panic did not propagate!");
}
}
no {
fn main() {
eprintln!("Stack manipulation not supported by this target");
}
}
}
|