1 // run-pass
2 #![allow(unused_must_use)]
3 // ignore-emscripten no threads support
4 #![feature(rustc_private)]
5 
6 extern crate libc;
7 use std::thread;
8 
9 mod rustrt {
10     extern crate libc;
11 
12     #[link(name = "rust_test_helpers", kind = "static")]
13     extern "C" {
rust_dbg_call( cb: extern "C" fn(libc::uintptr_t) -> libc::uintptr_t, data: libc::uintptr_t, ) -> libc::uintptr_t14         pub fn rust_dbg_call(
15             cb: extern "C" fn(libc::uintptr_t) -> libc::uintptr_t,
16             data: libc::uintptr_t,
17         ) -> libc::uintptr_t;
18     }
19 }
20 
cb(data: libc::uintptr_t) -> libc::uintptr_t21 extern "C" fn cb(data: libc::uintptr_t) -> libc::uintptr_t {
22     if data == 1 { data } else { count(data - 1) + 1 }
23 }
24 
count(n: libc::uintptr_t) -> libc::uintptr_t25 fn count(n: libc::uintptr_t) -> libc::uintptr_t {
26     unsafe {
27         println!("n = {}", n);
28         rustrt::rust_dbg_call(cb, n)
29     }
30 }
31 
main()32 pub fn main() {
33     // Make sure we're on a thread with small Rust stacks (main currently
34     // has a large stack)
35     thread::spawn(move || {
36         let result = count(1000);
37         println!("result = {}", result);
38         assert_eq!(result, 1000);
39     })
40     .join();
41 }
42