Change prefetch to avoid deadlock

This commit is contained in:
Andreas Jonson 2023-11-30 22:17:57 +01:00
parent 00796255c2
commit 8870768552

View File

@ -658,8 +658,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
let debugger_visualizers = let debugger_visualizers =
stat!("debugger-visualizers", || self.encode_debugger_visualizers()); stat!("debugger-visualizers", || self.encode_debugger_visualizers());
// Encode exported symbols info. This is prefetched in `encode_metadata` so we encode // Encode exported symbols info. This is prefetched in `encode_metadata`.
// this as late as possible to give the prefetching as much time as possible to complete.
let exported_symbols = stat!("exported-symbols", || { let exported_symbols = stat!("exported-symbols", || {
self.encode_exported_symbols(tcx.exported_symbols(LOCAL_CRATE)) self.encode_exported_symbols(tcx.exported_symbols(LOCAL_CRATE))
}); });
@ -2193,21 +2192,13 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path) {
// there's no need to do dep-graph tracking for any of it. // there's no need to do dep-graph tracking for any of it.
tcx.dep_graph.assert_ignored(); tcx.dep_graph.assert_ignored();
join( if tcx.sess.threads() != 1 {
|| encode_metadata_impl(tcx, path), // Prefetch some queries used by metadata encoding.
|| { // This is not necessary for correctness, but is only done for performance reasons.
if tcx.sess.threads() == 1 { // It can be removed if it turns out to cause trouble or be detrimental to performance.
return; join(|| prefetch_mir(tcx), || tcx.exported_symbols(LOCAL_CRATE));
} }
// Prefetch some queries used by metadata encoding.
// This is not necessary for correctness, but is only done for performance reasons.
// It can be removed if it turns out to cause trouble or be detrimental to performance.
join(|| prefetch_mir(tcx), || tcx.exported_symbols(LOCAL_CRATE));
},
);
}
fn encode_metadata_impl(tcx: TyCtxt<'_>, path: &Path) {
let mut encoder = opaque::FileEncoder::new(path) let mut encoder = opaque::FileEncoder::new(path)
.unwrap_or_else(|err| tcx.sess.emit_fatal(FailCreateFileEncoder { err })); .unwrap_or_else(|err| tcx.sess.emit_fatal(FailCreateFileEncoder { err }));
encoder.emit_raw_bytes(METADATA_HEADER); encoder.emit_raw_bytes(METADATA_HEADER);