| //@ run-pass |
| //@ needs-threads |
| //@ ignore-sgx no processes |
| |
| use std::cell::RefCell; |
| use std::env; |
| use std::process::Command; |
| |
| fn main() { |
| let name = "YOU_ARE_THE_TEST"; |
| if env::var(name).is_ok() { |
| std::thread::spawn(|| { |
| TLS.with(|f| f.borrow().ensure()); |
| }) |
| .join() |
| .unwrap(); |
| } else { |
| let me = env::current_exe().unwrap(); |
| let output = Command::new(&me).env(name, "1").output().unwrap(); |
| println!("{:?}", output); |
| assert!(output.status.success()); |
| let stderr = String::from_utf8(output.stderr).unwrap(); |
| assert!(stderr.contains("hello new\n")); |
| assert!(stderr.contains("hello drop\n")); |
| } |
| } |
| |
| struct Stuff { |
| _x: usize, |
| } |
| |
| impl Stuff { |
| fn new() -> Self { |
| eprintln!("hello new"); |
| Self { _x: 0 } |
| } |
| |
| fn ensure(&self) {} |
| } |
| |
| impl Drop for Stuff { |
| fn drop(&mut self) { |
| eprintln!("hello drop"); |
| } |
| } |
| |
| thread_local! { |
| static TLS: RefCell<Stuff> = RefCell::new(Stuff::new()); |
| } |