about summary refs log tree commit diff
path: root/tests/ui/runtime/atomic-print.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/runtime/atomic-print.rs')
-rw-r--r--tests/ui/runtime/atomic-print.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/ui/runtime/atomic-print.rs b/tests/ui/runtime/atomic-print.rs
new file mode 100644
index 00000000000..fe57910530f
--- /dev/null
+++ b/tests/ui/runtime/atomic-print.rs
@@ -0,0 +1,45 @@
+// run-pass
+
+#![allow(unused_must_use)]
+#![allow(deprecated)]
+// ignore-emscripten no threads support
+// ignore-sgx no processes
+
+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)
+            }
+        }
+    }
+}