]> git.proxmox.com Git - rustc.git/blame - src/test/run-pass/stdio-is-blocking.rs
New upstream version 1.33.0+dfsg1
[rustc.git] / src / test / run-pass / stdio-is-blocking.rs
CommitLineData
2c00a5a8 1// ignore-cloudabi no processes
abe05a73 2// ignore-emscripten no processes
32a655c1 3
476ff2be
SL
4use std::env;
5use std::io::prelude::*;
6use std::process::Command;
7use std::thread;
8
9const THREADS: usize = 20;
10const WRITES: usize = 100;
11const WRITE_SIZE: usize = 1024 * 32;
12
13fn main() {
14 let args = env::args().collect::<Vec<_>>();
15 if args.len() == 1 {
16 parent();
17 } else {
18 child();
19 }
20}
21
22fn 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
35fn 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)]
51fn 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)]
63fn 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}