diff options
Diffstat (limited to 'vendor/psm/examples/thread.rs')
-rw-r--r-- | vendor/psm/examples/thread.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/psm/examples/thread.rs b/vendor/psm/examples/thread.rs new file mode 100644 index 000000000..eb335a5a4 --- /dev/null +++ b/vendor/psm/examples/thread.rs @@ -0,0 +1,60 @@ +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() +} |