about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-02-23 20:39:13 +0000
committerbors <bors@rust-lang.org>2024-02-23 20:39:13 +0000
commit03b3cb6be9f21c082f4206b35c7fe7f291c94eaa (patch)
treea3f9c2f4b9e79497e6f3c28fa073502b7c946c36
parent12144045fe8f42881b015c29d3c906b53d318f00 (diff)
parent64779737db21f9e506f4562d9923e7037e15ecfb (diff)
downloadrust-03b3cb6be9f21c082f4206b35c7fe7f291c94eaa.tar.gz
rust-03b3cb6be9f21c082f4206b35c7fe7f291c94eaa.zip
Auto merge of #16652 - davidbarsky:david/deadlock-fix-for-16643, r=Veykril
internal: fix deadlock introduced by #16643

This fixes a deadlock introduced by #16643 ([backtrace](https://gist.github.com/davidbarsky/00f17598f5496a9c41aff31fec1c42d6)). `maybe_changed_after` calls back into other queries, so the cloning here is unfortunately inevitable.

(Zulip conversation: https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/Fixing.20proc-macro.20dirtying.20with.20unindexed.20projects)
-rw-r--r--crates/salsa/src/derived.rs7
1 files changed, 5 insertions, 2 deletions
diff --git a/crates/salsa/src/derived.rs b/crates/salsa/src/derived.rs
index bf532bdccf6..153df999f53 100644
--- a/crates/salsa/src/derived.rs
+++ b/crates/salsa/src/derived.rs
@@ -146,11 +146,14 @@ where
         revision: Revision,
     ) -> bool {
         debug_assert!(revision < db.salsa_runtime().current_revision());
-        let read = &self.slot_map.read();
+        let read = self.slot_map.read();
         let Some((key, slot)) = read.get_index(index as usize) else {
             return false;
         };
-        slot.maybe_changed_after(db, revision, key)
+        let (key, slot) = (key.clone(), slot.clone());
+        // note: this drop is load-bearing. removing it would causes deadlocks.
+        drop(read);
+        slot.maybe_changed_after(db, revision, &key)
     }
 
     fn fetch(&self, db: &<Q as QueryDb<'_>>::DynDb, key: &Q::Key) -> Q::Value {