|  | //@ run-pass | 
|  |  | 
|  | #![allow(unused_must_use)] | 
|  | #![allow(deprecated)] | 
|  | //@ needs-threads | 
|  | //@ needs-subprocess | 
|  |  | 
|  | use std::{env, fmt, process, sync, thread}; | 
|  |  | 
|  | struct SlowFmt(u32); | 
|  | impl fmt::Debug for SlowFmt { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | thread::sleep_ms(3); | 
|  | self.0.fmt(f) | 
|  | } | 
|  | } | 
|  |  | 
|  | fn do_print(x: u32) { | 
|  | let x = SlowFmt(x); | 
|  | println!("{:?}{:?}{:?}{:?}{:?}", x, x, x, x, x); | 
|  | } | 
|  |  | 
|  | fn main(){ | 
|  | if env::args().count() == 2 { | 
|  | let barrier = sync::Arc::new(sync::Barrier::new(2)); | 
|  | let tbarrier = barrier.clone(); | 
|  | let t = thread::spawn(move || { | 
|  | tbarrier.wait(); | 
|  | do_print(1); | 
|  | }); | 
|  | barrier.wait(); | 
|  | do_print(2); | 
|  | t.join(); | 
|  | } else { | 
|  | let this = env::args().next().unwrap(); | 
|  | let output = process::Command::new(this).arg("-").output().unwrap(); | 
|  | for line in String::from_utf8(output.stdout).unwrap().lines() { | 
|  | match line.chars().next().unwrap() { | 
|  | '1' => assert_eq!(line, "11111"), | 
|  | '2' => assert_eq!(line, "22222"), | 
|  | chr => panic!("unexpected character {:?}", chr) | 
|  | } | 
|  | } | 
|  | } | 
|  | } |