Skip to content

Commit c520386

Browse files
committed
Remove support of -Zjobserver-per-rustc
This effectively remove fields and logic where rustc is waiting for tokens and how many tokens a rustc owns.
1 parent 028d5b9 commit c520386

File tree

3 files changed

+3
-151
lines changed

3 files changed

+3
-151
lines changed

src/cargo/core/compiler/job_queue/job_state.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,4 @@ impl<'a, 'cfg> JobState<'a, 'cfg> {
194194
self.messages
195195
.push(Message::FutureIncompatReport(self.id, report));
196196
}
197-
198-
/// The rustc underlying this Job is about to acquire a jobserver token (i.e., block)
199-
/// on the passed client.
200-
///
201-
/// This should arrange for the associated client to eventually get a token via
202-
/// `client.release_raw()`.
203-
pub fn will_acquire(&self) {
204-
self.messages.push(Message::NeedsToken(self.id));
205-
}
206-
207-
/// The rustc underlying this Job is informing us that it is done with a jobserver token.
208-
///
209-
/// Note that it does *not* write that token back anywhere.
210-
pub fn release_token(&self) {
211-
self.messages.push(Message::ReleaseToken(self.id));
212-
}
213197
}

src/cargo/core/compiler/job_queue/mod.rs

Lines changed: 3 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ mod job;
123123
mod job_state;
124124

125125
use std::cell::RefCell;
126-
use std::collections::{BTreeMap, HashMap, HashSet};
126+
use std::collections::{HashMap, HashSet};
127127
use std::fmt::Write as _;
128128
use std::io;
129129
use std::path::{Path, PathBuf};
@@ -133,7 +133,7 @@ use std::time::Duration;
133133

134134
use anyhow::{format_err, Context as _};
135135
use cargo_util::ProcessBuilder;
136-
use jobserver::{Acquired, Client, HelperThread};
136+
use jobserver::{Acquired, HelperThread};
137137
use log::{debug, trace};
138138
use semver::Version;
139139

@@ -199,13 +199,6 @@ struct DrainState<'cfg> {
199199
/// single rustc process.
200200
tokens: Vec<Acquired>,
201201

202-
/// rustc per-thread tokens, when in jobserver-per-rustc mode.
203-
rustc_tokens: HashMap<JobId, Vec<Acquired>>,
204-
205-
/// This represents the list of rustc jobs (processes) and associated
206-
/// clients that are interested in receiving a token.
207-
to_send_clients: BTreeMap<JobId, Vec<Client>>,
208-
209202
/// The list of jobs that we have not yet started executing, but have
210203
/// retrieved from the `queue`. We eagerly pull jobs off the main queue to
211204
/// allow us to request jobserver tokens pretty early.
@@ -387,12 +380,6 @@ enum Message {
387380
Token(io::Result<Acquired>),
388381
Finish(JobId, Artifact, CargoResult<()>),
389382
FutureIncompatReport(JobId, Vec<FutureBreakageItem>),
390-
391-
// This client should get release_raw called on it with one of our tokens
392-
NeedsToken(JobId),
393-
394-
// A token previously passed to a NeedsToken client is being released.
395-
ReleaseToken(JobId),
396383
}
397384

398385
impl<'cfg> JobQueue<'cfg> {
@@ -507,8 +494,6 @@ impl<'cfg> JobQueue<'cfg> {
507494
next_id: 0,
508495
timings: self.timings,
509496
tokens: Vec::new(),
510-
rustc_tokens: HashMap::new(),
511-
to_send_clients: BTreeMap::new(),
512497
pending_queue: Vec::new(),
513498
print: DiagnosticPrinter::new(cx.bcx.config),
514499
finished: 0,
@@ -600,46 +585,9 @@ impl<'cfg> DrainState<'cfg> {
600585
self.active.len() < self.tokens.len() + 1
601586
}
602587

603-
// The oldest job (i.e., least job ID) is the one we grant tokens to first.
604-
fn pop_waiting_client(&mut self) -> (JobId, Client) {
605-
// FIXME: replace this with BTreeMap::first_entry when that stabilizes.
606-
let key = *self
607-
.to_send_clients
608-
.keys()
609-
.next()
610-
.expect("at least one waiter");
611-
let clients = self.to_send_clients.get_mut(&key).unwrap();
612-
let client = clients.pop().unwrap();
613-
if clients.is_empty() {
614-
self.to_send_clients.remove(&key);
615-
}
616-
(key, client)
617-
}
618-
619-
// If we managed to acquire some extra tokens, send them off to a waiting rustc.
620-
fn grant_rustc_token_requests(&mut self) -> CargoResult<()> {
621-
while !self.to_send_clients.is_empty() && self.has_extra_tokens() {
622-
let (id, client) = self.pop_waiting_client();
623-
// This unwrap is guaranteed to succeed. `active` must be at least
624-
// length 1, as otherwise there can't be a client waiting to be sent
625-
// on, so tokens.len() must also be at least one.
626-
let token = self.tokens.pop().unwrap();
627-
self.rustc_tokens
628-
.entry(id)
629-
.or_insert_with(Vec::new)
630-
.push(token);
631-
client
632-
.release_raw()
633-
.with_context(|| "failed to release jobserver token")?;
634-
}
635-
636-
Ok(())
637-
}
638-
639588
fn handle_event(
640589
&mut self,
641590
cx: &mut Context<'_, '_>,
642-
jobserver_helper: &HelperThread,
643591
plan: &mut BuildPlan,
644592
event: Message,
645593
) -> Result<(), ErrorToHandle> {
@@ -699,19 +647,6 @@ impl<'cfg> DrainState<'cfg> {
699647
Artifact::All => {
700648
trace!("end: {:?}", id);
701649
self.finished += 1;
702-
if let Some(rustc_tokens) = self.rustc_tokens.remove(&id) {
703-
// This puts back the tokens that this rustc
704-
// acquired into our primary token list.
705-
//
706-
// This represents a rustc bug: it did not
707-
// release all of its thread tokens but finished
708-
// completely. But we want to make Cargo resilient
709-
// to such rustc bugs, as they're generally not
710-
// fatal in nature (i.e., Cargo can make progress
711-
// still, and the build might not even fail).
712-
self.tokens.extend(rustc_tokens);
713-
}
714-
self.to_send_clients.remove(&id);
715650
self.report_warning_count(
716651
cx.bcx.config,
717652
id,
@@ -756,31 +691,6 @@ impl<'cfg> DrainState<'cfg> {
756691
let token = acquired_token.with_context(|| "failed to acquire jobserver token")?;
757692
self.tokens.push(token);
758693
}
759-
Message::NeedsToken(id) => {
760-
trace!("queue token request");
761-
jobserver_helper.request_token();
762-
let client = cx.rustc_clients[&self.active[&id]].clone();
763-
self.to_send_clients
764-
.entry(id)
765-
.or_insert_with(Vec::new)
766-
.push(client);
767-
}
768-
Message::ReleaseToken(id) => {
769-
// Note that this pops off potentially a completely
770-
// different token, but all tokens of the same job are
771-
// conceptually the same so that's fine.
772-
//
773-
// self.tokens is a "pool" -- the order doesn't matter -- and
774-
// this transfers ownership of the token into that pool. If we
775-
// end up using it on the next go around, then this token will
776-
// be truncated, same as tokens obtained through Message::Token.
777-
let rustc_tokens = self
778-
.rustc_tokens
779-
.get_mut(&id)
780-
.expect("no tokens associated");
781-
self.tokens
782-
.push(rustc_tokens.pop().expect("rustc releases token it has"));
783-
}
784694
}
785695

786696
Ok(())
@@ -795,19 +705,6 @@ impl<'cfg> DrainState<'cfg> {
795705
// listen for a message with a timeout, and on timeout we run the
796706
// previous parts of the loop again.
797707
let mut events = self.messages.try_pop_all();
798-
trace!(
799-
"tokens in use: {}, rustc_tokens: {:?}, waiting_rustcs: {:?} (events this tick: {})",
800-
self.tokens.len(),
801-
self.rustc_tokens
802-
.iter()
803-
.map(|(k, j)| (k, j.len()))
804-
.collect::<Vec<_>>(),
805-
self.to_send_clients
806-
.iter()
807-
.map(|(k, j)| (k, j.len()))
808-
.collect::<Vec<_>>(),
809-
events.len(),
810-
);
811708
if events.is_empty() {
812709
loop {
813710
self.tick_progress();
@@ -866,17 +763,13 @@ impl<'cfg> DrainState<'cfg> {
866763
break;
867764
}
868765

869-
if let Err(e) = self.grant_rustc_token_requests() {
870-
self.handle_error(&mut cx.bcx.config.shell(), &mut errors, e);
871-
}
872-
873766
// And finally, before we block waiting for the next event, drop any
874767
// excess tokens we may have accidentally acquired. Due to how our
875768
// jobserver interface is architected we may acquire a token that we
876769
// don't actually use, and if this happens just relinquish it back
877770
// to the jobserver itself.
878771
for event in self.wait_for_events() {
879-
if let Err(event_err) = self.handle_event(cx, jobserver_helper, plan, event) {
772+
if let Err(event_err) = self.handle_event(cx, plan, event) {
880773
self.handle_error(&mut cx.bcx.config.shell(), &mut errors, event_err);
881774
}
882775
}

src/cargo/core/compiler/mod.rs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,31 +1701,6 @@ fn on_stderr_line_inner(
17011701
return Ok(false);
17021702
}
17031703

1704-
#[derive(serde::Deserialize)]
1705-
struct JobserverNotification {
1706-
jobserver_event: Event,
1707-
}
1708-
1709-
#[derive(Debug, serde::Deserialize)]
1710-
enum Event {
1711-
WillAcquire,
1712-
Release,
1713-
}
1714-
1715-
if let Ok(JobserverNotification { jobserver_event }) =
1716-
serde_json::from_str::<JobserverNotification>(compiler_message.get())
1717-
{
1718-
trace!(
1719-
"found jobserver directive from rustc: `{:?}`",
1720-
jobserver_event
1721-
);
1722-
match jobserver_event {
1723-
Event::WillAcquire => state.will_acquire(),
1724-
Event::Release => state.release_token(),
1725-
}
1726-
return Ok(false);
1727-
}
1728-
17291704
// And failing all that above we should have a legitimate JSON diagnostic
17301705
// from the compiler, so wrap it in an external Cargo JSON message
17311706
// indicating which package it came from and then emit it.

0 commit comments

Comments
 (0)