Sha256: 3cf92882aff96151608584d63535701cc8e5ae953d7ecf706d77371180bff025

Contents?: true

Size: 1.63 KB

Versions: 38

Compression:

Stored size: 1.63 KB

Contents

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()
}

Version data entries

38 entries across 38 versions & 1 rubygems

Version Path
wasmtime-29.0.0 ./ext/cargo-vendor/psm-0.1.24/examples/thread.rs
wasmtime-28.0.0 ./ext/cargo-vendor/psm-0.1.24/examples/thread.rs
wasmtime-27.0.0 ./ext/cargo-vendor/psm-0.1.24/examples/thread.rs
wasmtime-26.0.0 ./ext/cargo-vendor/psm-0.1.23/examples/thread.rs
wasmtime-25.0.2 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-25.0.1 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-25.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-24.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-23.0.2 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-22.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-21.0.1 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-20.0.2 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-20.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-18.0.3 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-17.0.1 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-17.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-16.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-15.0.1 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-15.0.0 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs
wasmtime-14.0.4 ./ext/cargo-vendor/psm-0.1.21/examples/thread.rs