]> git.lizzy.rs Git - rust.git/blob - src/librustc_data_structures/jobserver.rs
Rollup merge of #69608 - o01eg:expose-target-libdir-print, r=ehuss
[rust.git] / src / librustc_data_structures / jobserver.rs
1 pub use jobserver_crate::Client;
2 use lazy_static::lazy_static;
3
4 lazy_static! {
5     // We can only call `from_env` once per process
6
7     // Note that this is unsafe because it may misinterpret file descriptors
8     // on Unix as jobserver file descriptors. We hopefully execute this near
9     // the beginning of the process though to ensure we don't get false
10     // positives, or in other words we try to execute this before we open
11     // any file descriptors ourselves.
12     //
13     // Pick a "reasonable maximum" if we don't otherwise have
14     // a jobserver in our environment, capping out at 32 so we
15     // don't take everything down by hogging the process run queue.
16     // The fixed number is used to have deterministic compilation
17     // across machines.
18     //
19     // Also note that we stick this in a global because there could be
20     // multiple rustc instances in this process, and the jobserver is
21     // per-process.
22     static ref GLOBAL_CLIENT: Client = unsafe {
23         Client::from_env().unwrap_or_else(|| {
24             let client = Client::new(32).expect("failed to create jobserver");
25             // Acquire a token for the main thread which we can release later
26             client.acquire_raw().ok();
27             client
28         })
29     };
30 }
31
32 pub fn client() -> Client {
33     GLOBAL_CLIENT.clone()
34 }
35
36 pub fn acquire_thread() {
37     GLOBAL_CLIENT.acquire_raw().ok();
38 }
39
40 pub fn release_thread() {
41     GLOBAL_CLIENT.release_raw().ok();
42 }