diff options
| author | SparrowLii <liyuan179@huawei.com> | 2023-11-22 15:28:09 +0800 |
|---|---|---|
| committer | SparrowLii <liyuan179@huawei.com> | 2023-11-22 15:32:18 +0800 |
| commit | d5e4bd89222c149cec295757fe203b58aa522edf (patch) | |
| tree | 81df99cd3697e44a2e8662298d83082c48c72c09 /compiler | |
| parent | 739d55682659e4a81db6fd83f52b2491505030ea (diff) | |
| download | rust-d5e4bd89222c149cec295757fe203b58aa522edf.tar.gz rust-d5e4bd89222c149cec295757fe203b58aa522edf.zip | |
print query map for deadlock when using parallel front end
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_query_system/src/query/job.rs | 16 | ||||
| -rw-r--r-- | compiler/rustc_query_system/src/query/plumbing.rs | 2 |
2 files changed, 12 insertions, 6 deletions
diff --git a/compiler/rustc_query_system/src/query/job.rs b/compiler/rustc_query_system/src/query/job.rs index f2c1f84fccc..726bda76b01 100644 --- a/compiler/rustc_query_system/src/query/job.rs +++ b/compiler/rustc_query_system/src/query/job.rs @@ -38,7 +38,7 @@ pub struct QueryInfo { pub type QueryMap = FxHashMap<QueryJobId, QueryJobInfo>; /// A value uniquely identifying an active query job. -#[derive(Copy, Clone, Eq, PartialEq, Hash)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct QueryJobId(pub NonZeroU64); impl QueryJobId { @@ -62,14 +62,14 @@ impl QueryJobId { } } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct QueryJobInfo { pub query: QueryStackFrame, pub job: QueryJob, } /// Represents an active query job. -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct QueryJob { pub id: QueryJobId, @@ -182,6 +182,7 @@ impl QueryJobId { } #[cfg(parallel_compiler)] +#[derive(Debug)] struct QueryWaiter { query: Option<QueryJobId>, condvar: Condvar, @@ -198,13 +199,14 @@ impl QueryWaiter { } #[cfg(parallel_compiler)] +#[derive(Debug)] struct QueryLatchInfo { complete: bool, waiters: Vec<Arc<QueryWaiter>>, } #[cfg(parallel_compiler)] -#[derive(Clone)] +#[derive(Clone, Debug)] pub(super) struct QueryLatch { info: Arc<Mutex<QueryLatchInfo>>, } @@ -540,7 +542,11 @@ pub fn deadlock(query_map: QueryMap, registry: &rayon_core::Registry) { // X to Y due to Rayon waiting and a true dependency from Y to X. The algorithm here // only considers the true dependency and won't detect a cycle. if !found_cycle { - panic!("deadlock detected"); + if query_map.len() == 0 { + panic!("deadlock detected without any query!") + } else { + panic!("deadlock detected! current query map:\n{:?}", query_map); + } } // FIXME: Ensure this won't cause a deadlock before we return diff --git a/compiler/rustc_query_system/src/query/plumbing.rs b/compiler/rustc_query_system/src/query/plumbing.rs index 6c08df99e9d..ecbc7dc6b8f 100644 --- a/compiler/rustc_query_system/src/query/plumbing.rs +++ b/compiler/rustc_query_system/src/query/plumbing.rs @@ -203,7 +203,7 @@ where } } -#[derive(Clone)] +#[derive(Clone, Debug)] pub(crate) struct CycleError { /// The query and related span that uses the cycle. pub usage: Option<(Span, QueryStackFrame)>, |
