diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 5e4dee7fb60ca..3bd2bb3c8beb0 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -156,7 +156,7 @@ pub struct Session { /// Loaded up early on in the initialization of this `Session` to avoid /// false positives about a job server in our environment. - pub jobserver_from_env: Option, + pub jobserver: Client, /// Metadata about the allocators for the current crate being compiled pub has_global_allocator: Once, @@ -1128,14 +1128,23 @@ pub fn build_session_( // positives, or in other words we try to execute this before we open // any file descriptors ourselves. // + // Pick a "reasonable maximum" if we don't otherwise have + // a jobserver in our environment, capping out at 32 so we + // don't take everything down by hogging the process run queue. + // The fixed number is used to have deterministic compilation + // across machines. + // // Also note that we stick this in a global because there could be // multiple `Session` instances in this process, and the jobserver is // per-process. - jobserver_from_env: unsafe { - static mut GLOBAL_JOBSERVER: *mut Option = 0 as *mut _; + jobserver: unsafe { + static mut GLOBAL_JOBSERVER: *mut Client = 0 as *mut _; static INIT: std::sync::Once = std::sync::ONCE_INIT; INIT.call_once(|| { - GLOBAL_JOBSERVER = Box::into_raw(Box::new(Client::from_env())); + let client = Client::from_env().unwrap_or_else(|| { + Client::new(32).expect("failed to create jobserver") + }); + GLOBAL_JOBSERVER = Box::into_raw(Box::new(client)); }); (*GLOBAL_JOBSERVER).clone() }, diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index f501b1739eb9c..613a07cd2695d 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -1007,13 +1007,6 @@ pub fn start_async_translation(tcx: TyCtxt, metadata_config.time_passes = false; allocator_config.time_passes = false; - let client = sess.jobserver_from_env.clone().unwrap_or_else(|| { - // Pick a "reasonable maximum" if we don't otherwise have a jobserver in - // our environment, capping out at 32 so we don't take everything down - // by hogging the process run queue. - Client::new(32).expect("failed to create jobserver") - }); - let (shared_emitter, shared_emitter_main) = SharedEmitter::new(); let (trans_worker_send, trans_worker_receive) = channel(); @@ -1023,7 +1016,7 @@ pub fn start_async_translation(tcx: TyCtxt, trans_worker_send, coordinator_receive, total_cgus, - client, + sess.jobserver.clone(), time_graph.clone(), Arc::new(modules_config), Arc::new(metadata_config),