2 // ignore-cloudabi no processes
3 // ignore-emscripten no processes
4 // ignore-sgx no processes
7 use std::io::prelude::*;
8 use std::process::Command;
11 const THREADS: usize = 20;
12 const WRITES: usize = 100;
13 const WRITE_SIZE: usize = 1024 * 32;
16 let args = env::args().collect::<Vec<_>>();
25 let me = env::current_exe().unwrap();
26 let mut cmd = Command::new(me);
27 cmd.arg("run-the-test");
28 let output = cmd.output().unwrap();
29 assert!(output.status.success());
30 assert_eq!(output.stderr.len(), 0);
31 assert_eq!(output.stdout.len(), WRITES * THREADS * WRITE_SIZE);
32 for byte in output.stdout.iter() {
33 assert_eq!(*byte, b'a');
38 let threads = (0..THREADS).map(|_| {
40 let buf = [b'a'; WRITE_SIZE];
45 }).collect::<Vec<_>>();
47 for thread in threads {
48 thread.join().unwrap();
53 fn write_all(buf: &[u8]) {
56 use std::os::unix::prelude::*;
58 let mut file = unsafe { File::from_raw_fd(1) };
59 let res = file.write_all(buf);
65 fn write_all(buf: &[u8]) {
68 use std::os::windows::raw::*;
69 use std::os::windows::prelude::*;
71 const STD_OUTPUT_HANDLE: u32 = (-11i32) as u32;
74 fn GetStdHandle(handle: u32) -> HANDLE;
77 let mut file = unsafe {
78 let handle = GetStdHandle(STD_OUTPUT_HANDLE);
79 assert!(!handle.is_null());
80 File::from_raw_handle(handle)
82 let res = file.write_all(buf);