mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-24 09:38:17 +00:00
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
extern crate psm;
|
|
|
|
psm::psm_stack_manipulation! {
|
|
yes {
|
|
use std::alloc;
|
|
|
|
const STACK_ALIGN: usize = 4096;
|
|
const FRAME_SIZE: usize = 4096;
|
|
const FIB_COUNTS: [(usize, u64); 3] = [
|
|
(8, 21),
|
|
(16, 987),
|
|
(24, 46368),
|
|
];
|
|
|
|
#[inline(never)]
|
|
fn fib(n: usize) -> u64 {
|
|
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 r = match n {
|
|
0 => 0,
|
|
1 => 1,
|
|
_ => {
|
|
psm::on_stack(new_stack, FRAME_SIZE, || {
|
|
fib(n - 1) + fib(n - 2)
|
|
})
|
|
}
|
|
};
|
|
alloc::dealloc(new_stack, layout);
|
|
r
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
for (n, expected, handle) in FIB_COUNTS.iter().map(|&(n, expected)|
|
|
(n, expected, std::thread::spawn(move || {
|
|
fib(n)
|
|
}))
|
|
) {
|
|
if let Ok(res) = handle.join() {
|
|
assert_eq!(res, expected);
|
|
println!("fib({}) = {}", n, res);
|
|
} else {
|
|
panic!("joining a thread returned an Err");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
no {
|
|
fn main() {
|
|
eprintln!("Stack manipulation not supported by this target");
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn run_example() {
|
|
main()
|
|
}
|