]>
Commit | Line | Data |
---|---|---|
2c00a5a8 | 1 | // ignore-cloudabi no processes |
abe05a73 | 2 | // ignore-emscripten no processes |
32a655c1 | 3 | |
476ff2be SL |
4 | use std::env; |
5 | use std::io::prelude::*; | |
6 | use std::process::Command; | |
7 | use std::thread; | |
8 | ||
9 | const THREADS: usize = 20; | |
10 | const WRITES: usize = 100; | |
11 | const WRITE_SIZE: usize = 1024 * 32; | |
12 | ||
13 | fn main() { | |
14 | let args = env::args().collect::<Vec<_>>(); | |
15 | if args.len() == 1 { | |
16 | parent(); | |
17 | } else { | |
18 | child(); | |
19 | } | |
20 | } | |
21 | ||
22 | fn parent() { | |
23 | let me = env::current_exe().unwrap(); | |
24 | let mut cmd = Command::new(me); | |
25 | cmd.arg("run-the-test"); | |
26 | let output = cmd.output().unwrap(); | |
27 | assert!(output.status.success()); | |
28 | assert_eq!(output.stderr.len(), 0); | |
29 | assert_eq!(output.stdout.len(), WRITES * THREADS * WRITE_SIZE); | |
30 | for byte in output.stdout.iter() { | |
31 | assert_eq!(*byte, b'a'); | |
32 | } | |
33 | } | |
34 | ||
35 | fn child() { | |
36 | let threads = (0..THREADS).map(|_| { | |
37 | thread::spawn(|| { | |
38 | let buf = [b'a'; WRITE_SIZE]; | |
39 | for _ in 0..WRITES { | |
40 | write_all(&buf); | |
41 | } | |
42 | }) | |
43 | }).collect::<Vec<_>>(); | |
44 | ||
45 | for thread in threads { | |
46 | thread.join().unwrap(); | |
47 | } | |
48 | } | |
49 | ||
50 | #[cfg(unix)] | |
51 | fn write_all(buf: &[u8]) { | |
52 | use std::fs::File; | |
53 | use std::mem; | |
54 | use std::os::unix::prelude::*; | |
55 | ||
56 | let mut file = unsafe { File::from_raw_fd(1) }; | |
57 | let res = file.write_all(buf); | |
58 | mem::forget(file); | |
59 | res.unwrap(); | |
60 | } | |
61 | ||
62 | #[cfg(windows)] | |
63 | fn write_all(buf: &[u8]) { | |
64 | use std::fs::File; | |
65 | use std::mem; | |
66 | use std::os::windows::raw::*; | |
67 | use std::os::windows::prelude::*; | |
68 | ||
69 | const STD_OUTPUT_HANDLE: u32 = (-11i32) as u32; | |
70 | ||
71 | extern "system" { | |
72 | fn GetStdHandle(handle: u32) -> HANDLE; | |
73 | } | |
74 | ||
75 | let mut file = unsafe { | |
76 | let handle = GetStdHandle(STD_OUTPUT_HANDLE); | |
77 | assert!(!handle.is_null()); | |
78 | File::from_raw_handle(handle) | |
79 | }; | |
80 | let res = file.write_all(buf); | |
81 | mem::forget(file); | |
82 | res.unwrap(); | |
83 | } |