about summary refs log tree commit diff
path: root/tests/run-make/parallel-rustc-no-overwrite/rmake.rs
blob: aa38eb664cf5eacf590d3a331fc364fdaa134ec3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// When two instances of rustc are invoked in parallel, they
// can conflict on their temporary files and overwrite each others',
// leading to unsuccessful compilation. The -Z temps-dir flag adds
// separate designated directories for each rustc invocation, preventing
// conflicts. This test uses this flag and checks for successful compilation.
// See https://github.com/rust-lang/rust/pull/83846

use std::sync::{Arc, Barrier};
use std::thread;

use run_make_support::{rfs, rustc};

fn main() {
    rfs::create_file("lib.rs");
    let barrier = Arc::new(Barrier::new(2));
    let handle = {
        let barrier = Arc::clone(&barrier);
        thread::spawn(move || {
            barrier.wait();
            rustc().crate_type("lib").arg("-Ztemps-dir=temp1").input("lib.rs").run();
        })
    };
    barrier.wait();
    rustc().crate_type("staticlib").arg("-Ztemps-dir=temp2").input("lib.rs").run();
    handle.join().expect("lib thread panicked");
}