]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/extern-stress.rs
doc: remove incomplete sentence
[rust.git] / src / test / run-pass / extern-stress.rs
1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // This creates a bunch of descheduling tasks that run concurrently
12 // while holding onto C stacks
13
14 extern crate libc;
15 use std::task;
16
17 mod rustrt {
18     extern crate libc;
19
20     #[link(name = "rust_test_helpers")]
21     extern {
22         pub fn rust_dbg_call(cb: extern "C" fn(libc::uintptr_t) -> libc::uintptr_t,
23                              data: libc::uintptr_t)
24                              -> libc::uintptr_t;
25     }
26 }
27
28 extern fn cb(data: libc::uintptr_t) -> libc::uintptr_t {
29     if data == 1 {
30         data
31     } else {
32         task::deschedule();
33         count(data - 1) + count(data - 1)
34     }
35 }
36
37 fn count(n: libc::uintptr_t) -> libc::uintptr_t {
38     unsafe {
39         rustrt::rust_dbg_call(cb, n)
40     }
41 }
42
43 pub fn main() {
44     for _ in range(0u, 100) {
45         task::spawn(move|| {
46             assert_eq!(count(5), 16);
47         });
48     }
49 }