mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| pub use jobserver_crate::Client;
 | |
| use std::lazy::SyncLazy;
 | |
| 
 | |
| // We can only call `from_env` once per process
 | |
| 
 | |
| // Note that this is unsafe because it may misinterpret file descriptors
 | |
| // on Unix as jobserver file descriptors. We hopefully execute this near
 | |
| // the beginning of the process though to ensure we don't get false
 | |
| // 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 rustc instances in this process, and the jobserver is
 | |
| // per-process.
 | |
| static GLOBAL_CLIENT: SyncLazy<Client> = SyncLazy::new(|| unsafe {
 | |
|     Client::from_env().unwrap_or_else(|| {
 | |
|         let client = Client::new(32).expect("failed to create jobserver");
 | |
|         // Acquire a token for the main thread which we can release later
 | |
|         client.acquire_raw().ok();
 | |
|         client
 | |
|     })
 | |
| });
 | |
| 
 | |
| pub fn client() -> Client {
 | |
|     GLOBAL_CLIENT.clone()
 | |
| }
 | |
| 
 | |
| pub fn acquire_thread() {
 | |
|     GLOBAL_CLIENT.acquire_raw().ok();
 | |
| }
 | |
| 
 | |
| pub fn release_thread() {
 | |
|     GLOBAL_CLIENT.release_raw().ok();
 | |
| }
 | 
