@@ -117,7 +117,10 @@ pub(crate) fn find_dep_kind_root<'tcx>(
117117/// We'll use this to remove the waiter using `QueryLatch::extract_waiter` if we're waking it up.
118118type ResumableWaiterLocation = ( QueryJobId , usize ) ;
119119
120- struct Waiter {
120+ /// This abstracts over non-resumable waiters which are found in `QueryJob`'s `parent` field
121+ /// and resumable waiters are in `latch` field.
122+ struct AbstractedWaiter {
123+ /// The span corresponding to the reason for why we're waiting on this query.
121124 span : Span ,
122125 /// The query which we are waiting from, if none the waiter is from a compiler root.
123126 parent : Option < QueryJobId > ,
@@ -126,11 +129,11 @@ struct Waiter {
126129
127130/// Returns all the non-resumable and resumable waiters of a query.
128131/// This is used so we can uniformly loop over both non-resumable and resumable waiters.
129- fn waiters_of ( job_map : & QueryJobMap < ' _ > , query : QueryJobId ) -> Vec < Waiter > {
132+ fn abstracted_waiters_of ( job_map : & QueryJobMap < ' _ > , query : QueryJobId ) -> Vec < AbstractedWaiter > {
130133 let mut result = Vec :: new ( ) ;
131134
132135 // Add the parent which is a non-resumable waiter since it's on the same stack
133- result. push ( Waiter {
136+ result. push ( AbstractedWaiter {
134137 span : job_map. span_of ( query) ,
135138 parent : job_map. parent_of ( query) ,
136139 resumable : None ,
@@ -139,7 +142,7 @@ fn waiters_of(job_map: &QueryJobMap<'_>, query: QueryJobId) -> Vec<Waiter> {
139142 // Add the explicit waiters which use condvars and are resumable
140143 if let Some ( latch) = job_map. latch_of ( query) {
141144 for ( i, waiter) in latch. waiters . lock ( ) . as_ref ( ) . unwrap ( ) . iter ( ) . enumerate ( ) {
142- result. push ( Waiter {
145+ result. push ( AbstractedWaiter {
143146 span : waiter. span ,
144147 parent : waiter. parent ,
145148 resumable : Some ( ( query, i) ) ,
@@ -162,11 +165,11 @@ fn cycle_check<'tcx>(
162165 visited : & mut FxHashSet < QueryJobId > ,
163166) -> ControlFlow < Option < ResumableWaiterLocation > > {
164167 if !visited. insert ( query) {
165- return if let Some ( p ) = stack. iter ( ) . position ( |q| q. 1 == query) {
168+ return if let Some ( pos ) = stack. iter ( ) . position ( |q| q. 1 == query) {
166169 // We detected a query cycle, fix up the initial span and return Some
167170
168171 // Remove previous stack entries
169- stack. drain ( 0 ..p ) ;
172+ stack. drain ( 0 ..pos ) ;
170173 // Replace the span for the first query with the cycle cause
171174 stack[ 0 ] . 0 = span;
172175 ControlFlow :: Break ( None )
@@ -179,16 +182,16 @@ fn cycle_check<'tcx>(
179182 stack. push ( ( span, query) ) ;
180183
181184 // Visit all the waiters
182- for waiter in waiters_of ( job_map, query) {
183- let Some ( waiter_query ) = waiter . parent else {
185+ for abstracted_waiter in abstracted_waiters_of ( job_map, query) {
186+ let Some ( parent ) = abstracted_waiter . parent else {
184187 // Skip waiters which are not queries
185188 continue ;
186189 } ;
187- if let ControlFlow :: Break ( maybe_waiter ) =
188- cycle_check ( job_map, waiter_query , waiter . span , stack, visited)
190+ if let ControlFlow :: Break ( maybe_resumable ) =
191+ cycle_check ( job_map, parent , abstracted_waiter . span , stack, visited)
189192 {
190193 // Return the resumable waiter in `waiter.resumable` if present
191- return ControlFlow :: Break ( waiter . resumable . or ( maybe_waiter ) ) ;
194+ return ControlFlow :: Break ( abstracted_waiter . resumable . or ( maybe_resumable ) ) ;
192195 }
193196 }
194197
@@ -212,12 +215,12 @@ fn connected_to_root<'tcx>(
212215 }
213216
214217 // Visit all the waiters
215- for waiter in waiters_of ( job_map, query) {
216- match waiter . parent {
218+ for abstracted_waiter in abstracted_waiters_of ( job_map, query) {
219+ match abstracted_waiter . parent {
217220 // This query is connected to the root
218221 None => return true ,
219- Some ( waiter ) => {
220- if connected_to_root ( job_map, waiter , visited) {
222+ Some ( parent ) => {
223+ if connected_to_root ( job_map, parent , visited) {
221224 return true ;
222225 }
223226 }
@@ -240,7 +243,7 @@ fn remove_cycle<'tcx>(
240243 let mut visited = FxHashSet :: default ( ) ;
241244 let mut stack = Vec :: new ( ) ;
242245 // Look for a cycle starting with the last query in `jobs`
243- if let ControlFlow :: Break ( waiter ) =
246+ if let ControlFlow :: Break ( resumable ) =
244247 cycle_check ( job_map, jobs. pop ( ) . unwrap ( ) , DUMMY_SP , & mut stack, & mut visited)
245248 {
246249 // The stack is a vector of pairs of spans and queries; reverse it so that
@@ -262,7 +265,7 @@ fn remove_cycle<'tcx>(
262265
263266 struct EntryPoint {
264267 query_in_cycle : QueryJobId ,
265- waiter : Option < ( Span , QueryJobId ) > ,
268+ query_waiting_on_cycle : Option < ( Span , QueryJobId ) > ,
266269 }
267270
268271 // Find the queries in the cycle which are
@@ -271,11 +274,11 @@ fn remove_cycle<'tcx>(
271274 . iter ( )
272275 . filter_map ( |& ( _, query_in_cycle) | {
273276 let mut entrypoint = false ;
274- let mut found_waiter = None ;
277+ let mut query_waiting_on_cycle = None ;
275278
276279 // Find a direct waiter who leads to the root
277- for waiter in waiters_of ( job_map, query_in_cycle) {
278- let Some ( waiter_query ) = waiter . parent else {
280+ for abstracted_waiter in abstracted_waiters_of ( job_map, query_in_cycle) {
281+ let Some ( parent ) = abstracted_waiter . parent else {
279282 // The query in the cycle is directly connected to root.
280283 entrypoint = true ;
281284 continue ;
@@ -285,21 +288,21 @@ fn remove_cycle<'tcx>(
285288 // so paths to the root through the cycle itself won't count.
286289 let mut visited = FxHashSet :: from_iter ( stack. iter ( ) . map ( |q| q. 1 ) ) ;
287290
288- if connected_to_root ( job_map, waiter_query , & mut visited) {
289- found_waiter = Some ( ( waiter . span , waiter_query ) ) ;
291+ if connected_to_root ( job_map, parent , & mut visited) {
292+ query_waiting_on_cycle = Some ( ( abstracted_waiter . span , parent ) ) ;
290293 entrypoint = true ;
291294 break ;
292295 }
293296 }
294297
295- entrypoint. then_some ( EntryPoint { query_in_cycle, waiter : found_waiter } )
298+ entrypoint. then_some ( EntryPoint { query_in_cycle, query_waiting_on_cycle } )
296299 } )
297300 . collect :: < Vec < EntryPoint > > ( ) ;
298301
299302 // Pick an entry point, preferring ones with waiters
300303 let entry_point = entry_points
301304 . iter ( )
302- . find ( |entry_point| entry_point. waiter . is_some ( ) )
305+ . find ( |entry_point| entry_point. query_waiting_on_cycle . is_some ( ) )
303306 . unwrap_or ( & entry_points[ 0 ] ) ;
304307
305308 // Shift the stack so that our entry point is first
@@ -309,7 +312,9 @@ fn remove_cycle<'tcx>(
309312 stack. rotate_left ( pos) ;
310313 }
311314
312- let usage = entry_point. waiter . map ( |( span, job) | ( span, job_map. frame_of ( job) . clone ( ) ) ) ;
315+ let usage = entry_point
316+ . query_waiting_on_cycle
317+ . map ( |( span, job) | ( span, job_map. frame_of ( job) . clone ( ) ) ) ;
313318
314319 // Create the cycle error
315320 let error = CycleError {
@@ -320,9 +325,9 @@ fn remove_cycle<'tcx>(
320325 . collect ( ) ,
321326 } ;
322327
323- // We unwrap `waiter ` here since there must always be one
328+ // We unwrap `resumable ` here since there must always be one
324329 // edge which is resumable / waited using a query latch
325- let ( waitee_query, waiter_idx) = waiter . unwrap ( ) ;
330+ let ( waitee_query, waiter_idx) = resumable . unwrap ( ) ;
326331
327332 // Extract the waiter we want to resume
328333 let waiter = job_map. latch_of ( waitee_query) . unwrap ( ) . extract_waiter ( waiter_idx) ;
0 commit comments