]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/morestack6.rs
port over the tests to use the new API
[rust.git] / src / test / run-pass / morestack6.rs
1 // This test attempts to force the dynamic linker to resolve
2 // external symbols as close to the red zone as possible.
3
4 use std;
5 import task;
6 import std::rand;
7
8 native mod rustrt {
9     fn set_min_stack(size: uint);
10     fn debug_get_stk_seg() -> *u8;
11
12     fn unsupervise();
13     fn last_os_error() -> str;
14     fn rust_getcwd() -> str;
15     fn refcount(box: @int);
16     fn do_gc();
17     fn pin_task();
18     fn unpin_task();
19     fn get_task_id();
20     fn sched_threads();
21     fn rust_get_task();
22 }
23
24 fn calllink01() { rustrt::unsupervise(); }
25 fn calllink02() { rustrt::last_os_error(); }
26 fn calllink03() { rustrt::rust_getcwd(); }
27 fn calllink04() { rustrt::refcount(@0); }
28 fn calllink05() { rustrt::do_gc(); }
29 fn calllink06() { rustrt::pin_task(); }
30 fn calllink07() { rustrt::unpin_task(); }
31 fn calllink08() { rustrt::get_task_id(); }
32 fn calllink09() { rustrt::sched_threads(); }
33 fn calllink10() { rustrt::rust_get_task(); }
34
35 fn runtest(f: sendfn(), frame_backoff: u32) {
36     runtest2(f, frame_backoff, 0 as *u8);
37 }
38
39 fn runtest2(f: sendfn(), frame_backoff: u32, last_stk: *u8) -> u32 {
40     let curr_stk = rustrt::debug_get_stk_seg();
41     if (last_stk != curr_stk && last_stk != 0 as *u8) {
42         // We switched stacks, go back and try to hit the dynamic linker
43         frame_backoff
44     } else {
45         let frame_backoff = runtest2(f, frame_backoff, curr_stk);
46         if frame_backoff > 1u32 {
47             frame_backoff - 1u32
48         } else if frame_backoff == 1u32 {
49             f();
50             0u32
51         } else {
52             0u32
53         }
54     }
55 }
56
57 fn main() {
58     let fns = [
59         calllink01,
60         calllink02,
61         calllink03,
62         calllink04,
63         calllink05,
64         calllink06,
65         calllink07,
66         calllink08,
67         calllink09,
68         calllink10
69     ];
70     let rng = rand::mk_rng();
71     for f in fns {
72         let sz = rng.next() % 256u32 + 256u32;
73         let frame_backoff = rng.next() % 10u32 + 1u32;
74         rustrt::set_min_stack(sz as uint);
75         task::join(task::spawn_joinable {|| runtest(f, frame_backoff);});
76     }
77 }