@@ -127,6 +127,8 @@ impl<C> ConnectionSet<C> {
127127
128128 let preferred_slot = current_thread_id ( ) % self . slots . len ( ) ;
129129
130+ tracing:: trace!( preferred_slot, ?pref, "acquire_inner" ) ;
131+
130132 // Always try to lock the connection associated with our thread ID
131133 let mut acquire_preferred = pin ! ( self . slots[ preferred_slot] . acquire( pref) ) ;
132134
@@ -174,9 +176,8 @@ impl<C> ConnectionSet<C> {
174176 }
175177
176178 listen_global. as_mut ( ) . set ( self . global . listen ( pref) ) ;
179+ continue ;
177180 }
178-
179- continue ;
180181 }
181182
182183 return Poll :: Pending ;
@@ -263,15 +264,20 @@ impl<C> ConnectionSet<C> {
263264
264265impl AcquirePreference {
265266 #[ inline( always) ]
266- fn wants_connected ( & self ) -> bool {
267- matches ! ( self , Self :: Connected | Self :: Either )
267+ fn wants_connected ( & self , is_connected : bool ) -> bool {
268+ match ( self , is_connected) {
269+ ( Self :: Connected , true ) => true ,
270+ ( Self :: Disconnected , false ) => true ,
271+ ( Self :: Either , _) => true ,
272+ _ => false ,
273+ }
268274 }
269275}
270276
271277impl < C > Slot < C > {
272278 #[ inline( always) ]
273279 fn matches_pref ( & self , pref : AcquirePreference ) -> bool {
274- !self . is_leaked ( ) && self . is_connected ( ) == pref . wants_connected ( )
280+ !self . is_leaked ( ) && pref . wants_connected ( self . is_connected ( ) )
275281 }
276282
277283 #[ inline( always) ]
@@ -308,21 +314,30 @@ impl<C> Slot<C> {
308314 async fn acquire ( self : & Arc < Self > , pref : AcquirePreference ) -> SlotGuard < C > {
309315 loop {
310316 if self . matches_pref ( pref) {
317+ tracing:: trace!( slot_index=%self . index, "waiting for lock" ) ;
318+
311319 let locked = self . lock ( ) . await ;
312320
313321 if locked. matches_pref ( pref) {
314322 return locked;
315323 }
316324 }
317325
318- let event = if pref. wants_connected ( ) {
319- & self . unlock_event
320- } else {
321- & self . disconnect_event
322- } ;
323-
324- listener ! ( event => listener) ;
325- listener. await ;
326+ match pref {
327+ AcquirePreference :: Connected => {
328+ listener ! ( self . unlock_event => listener) ;
329+ listener. await ;
330+ }
331+ AcquirePreference :: Disconnected => {
332+ listener ! ( self . disconnect_event => listener) ;
333+ listener. await
334+ }
335+ AcquirePreference :: Either => {
336+ listener ! ( self . unlock_event => unlock_listener) ;
337+ listener ! ( self . disconnect_event => disconnect_listener) ;
338+ race ( unlock_listener, disconnect_listener) . await . ok ( ) ;
339+ }
340+ }
326341 }
327342 }
328343
@@ -374,7 +389,7 @@ impl<C> SlotGuard<C> {
374389
375390 #[ inline( always) ]
376391 fn matches_pref ( & self , pref : AcquirePreference ) -> bool {
377- !self . slot . is_leaked ( ) && self . is_connected ( ) == pref . wants_connected ( )
392+ !self . slot . is_leaked ( ) && pref . wants_connected ( self . is_connected ( ) )
378393 }
379394
380395 #[ inline( always) ]
0 commit comments