summaryrefslogtreecommitdiffstats
path: root/vendor/psm/examples/thread.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/psm/examples/thread.rs')
-rw-r--r--vendor/psm/examples/thread.rs60
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()
+}