]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/extern-stress.rs
Auto merge of #22899 - huonw:macro-stability, r=alexcrichton
[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::thread::Thread;
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         Thread::yield_now();
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     (0_usize..100).map(|_| {
45         Thread::scoped(move|| {
46             assert_eq!(count(5), 16);
47         })
48     }).collect::<Vec<_>>();
49 }