@@ -37,7 +37,6 @@ pub(super) enum Reservation<T> {
37
37
/// This connection could be used multiple times, the first one will be
38
38
/// reinserted into the `idle` pool, and the second will be given to
39
39
/// the `Checkout`.
40
- #[ allow( unused) ]
41
40
Shared ( T , T ) ,
42
41
/// This connection requires unique access. It will be returned after
43
42
/// use is complete.
@@ -65,7 +64,7 @@ struct PoolInner<T> {
65
64
// this list is checked for any parked Checkouts, and tries to notify
66
65
// them that the Conn could be used instead of waiting for a brand new
67
66
// connection.
68
- parked : HashMap < Key , VecDeque < oneshot:: Sender < T > > > ,
67
+ waiters : HashMap < Key , VecDeque < oneshot:: Sender < T > > > ,
69
68
timeout : Option < Duration > ,
70
69
// A oneshot channel is used to allow the interval to be notified when
71
70
// the Pool completely drops. That way, the interval can cancel immediately.
@@ -80,7 +79,7 @@ impl<T> Pool<T> {
80
79
enabled : enabled,
81
80
idle : HashMap :: new ( ) ,
82
81
idle_interval_ref : None ,
83
- parked : HashMap :: new ( ) ,
82
+ waiters : HashMap :: new ( ) ,
84
83
timeout : timeout,
85
84
} ) ) ,
86
85
}
@@ -94,7 +93,7 @@ impl<T: Poolable> Pool<T> {
94
93
Checkout {
95
94
key,
96
95
pool : self . clone ( ) ,
97
- parked : None ,
96
+ waiter : None ,
98
97
}
99
98
}
100
99
@@ -217,10 +216,10 @@ impl<T: Poolable> Pool<T> {
217
216
}
218
217
}
219
218
220
- fn park ( & mut self , key : Key , tx : oneshot:: Sender < T > ) {
219
+ fn waiter ( & mut self , key : Key , tx : oneshot:: Sender < T > ) {
221
220
trace ! ( "checkout waiting for idle connection: {:?}" , key) ;
222
221
self . inner . lock ( ) . unwrap ( )
223
- . parked . entry ( key)
222
+ . waiters . entry ( key)
224
223
. or_insert ( VecDeque :: new ( ) )
225
224
. push_back ( tx) ;
226
225
}
@@ -285,10 +284,10 @@ impl<T: Poolable> PoolInner<T> {
285
284
return ;
286
285
}
287
286
trace ! ( "put; add idle connection for {:?}" , key) ;
288
- let mut remove_parked = false ;
287
+ let mut remove_waiters = false ;
289
288
let mut value = Some ( value) ;
290
- if let Some ( parked ) = self . parked . get_mut ( & key) {
291
- while let Some ( tx) = parked . pop_front ( ) {
289
+ if let Some ( waiters ) = self . waiters . get_mut ( & key) {
290
+ while let Some ( tx) = waiters . pop_front ( ) {
292
291
if !tx. is_canceled ( ) {
293
292
let reserved = value. take ( ) . expect ( "value already sent" ) ;
294
293
let reserved = match reserved. reserve ( ) {
@@ -314,10 +313,10 @@ impl<T: Poolable> PoolInner<T> {
314
313
315
314
trace ! ( "put; removing canceled waiter for {:?}" , key) ;
316
315
}
317
- remove_parked = parked . is_empty ( ) ;
316
+ remove_waiters = waiters . is_empty ( ) ;
318
317
}
319
- if remove_parked {
320
- self . parked . remove ( & key) ;
318
+ if remove_waiters {
319
+ self . waiters . remove ( & key) ;
321
320
}
322
321
323
322
match value {
@@ -345,7 +344,7 @@ impl<T: Poolable> PoolInner<T> {
345
344
// cancel any waiters. if there are any, it's because
346
345
// this Connecting task didn't complete successfully.
347
346
// those waiters would never receive a connection.
348
- self . parked . remove ( key) ;
347
+ self . waiters . remove ( key) ;
349
348
}
350
349
}
351
350
@@ -354,16 +353,16 @@ impl<T> PoolInner<T> {
354
353
/// and possibly inserted into the pool that it is waiting for an idle
355
354
/// connection. If a user ever dropped that future, we need to clean out
356
355
/// those parked senders.
357
- fn clean_parked ( & mut self , key : & Key ) {
358
- let mut remove_parked = false ;
359
- if let Some ( parked ) = self . parked . get_mut ( key) {
360
- parked . retain ( |tx| {
356
+ fn clean_waiters ( & mut self , key : & Key ) {
357
+ let mut remove_waiters = false ;
358
+ if let Some ( waiters ) = self . waiters . get_mut ( key) {
359
+ waiters . retain ( |tx| {
361
360
!tx. is_canceled ( )
362
361
} ) ;
363
- remove_parked = parked . is_empty ( ) ;
362
+ remove_waiters = waiters . is_empty ( ) ;
364
363
}
365
- if remove_parked {
366
- self . parked . remove ( key) ;
364
+ if remove_waiters {
365
+ self . waiters . remove ( key) ;
367
366
}
368
367
}
369
368
}
@@ -511,13 +510,13 @@ struct Idle<T> {
511
510
pub ( super ) struct Checkout < T > {
512
511
key : Key ,
513
512
pool : Pool < T > ,
514
- parked : Option < oneshot:: Receiver < T > > ,
513
+ waiter : Option < oneshot:: Receiver < T > > ,
515
514
}
516
515
517
516
impl < T : Poolable > Checkout < T > {
518
- fn poll_parked ( & mut self ) -> Poll < Option < Pooled < T > > , :: Error > {
517
+ fn poll_waiter ( & mut self ) -> Poll < Option < Pooled < T > > , :: Error > {
519
518
static CANCELED : & str = "pool checkout failed" ;
520
- if let Some ( ref mut rx) = self . parked {
519
+ if let Some ( mut rx) = self . waiter . take ( ) {
521
520
match rx. poll ( ) {
522
521
Ok ( Async :: Ready ( value) ) => {
523
522
if !value. is_closed ( ) {
@@ -526,20 +525,23 @@ impl<T: Poolable> Checkout<T> {
526
525
Err ( :: Error :: new_canceled ( Some ( CANCELED ) ) )
527
526
}
528
527
} ,
529
- Ok ( Async :: NotReady ) => Ok ( Async :: NotReady ) ,
528
+ Ok ( Async :: NotReady ) => {
529
+ self . waiter = Some ( rx) ;
530
+ Ok ( Async :: NotReady )
531
+ } ,
530
532
Err ( _canceled) => Err ( :: Error :: new_canceled ( Some ( CANCELED ) ) ) ,
531
533
}
532
534
} else {
533
535
Ok ( Async :: Ready ( None ) )
534
536
}
535
537
}
536
538
537
- fn park ( & mut self ) {
538
- if self . parked . is_none ( ) {
539
+ fn add_waiter ( & mut self ) {
540
+ if self . waiter . is_none ( ) {
539
541
let ( tx, mut rx) = oneshot:: channel ( ) ;
540
542
let _ = rx. poll ( ) ; // park this task
541
- self . pool . park ( self . key . clone ( ) , tx) ;
542
- self . parked = Some ( rx) ;
543
+ self . pool . waiter ( self . key . clone ( ) , tx) ;
544
+ self . waiter = Some ( rx) ;
543
545
}
544
546
}
545
547
}
@@ -549,7 +551,7 @@ impl<T: Poolable> Future for Checkout<T> {
549
551
type Error = :: Error ;
550
552
551
553
fn poll ( & mut self ) -> Poll < Self :: Item , Self :: Error > {
552
- if let Some ( pooled) = try_ready ! ( self . poll_parked ( ) ) {
554
+ if let Some ( pooled) = try_ready ! ( self . poll_waiter ( ) ) {
553
555
return Ok ( Async :: Ready ( pooled) ) ;
554
556
}
555
557
@@ -558,17 +560,18 @@ impl<T: Poolable> Future for Checkout<T> {
558
560
if let Some ( pooled) = entry {
559
561
Ok ( Async :: Ready ( pooled) )
560
562
} else {
561
- self . park ( ) ;
563
+ self . add_waiter ( ) ;
562
564
Ok ( Async :: NotReady )
563
565
}
564
566
}
565
567
}
566
568
567
569
impl < T > Drop for Checkout < T > {
568
570
fn drop ( & mut self ) {
569
- self . parked . take ( ) ;
570
- if let Ok ( mut inner) = self . pool . inner . lock ( ) {
571
- inner. clean_parked ( & self . key ) ;
571
+ if self . waiter . take ( ) . is_some ( ) {
572
+ if let Ok ( mut inner) = self . pool . inner . lock ( ) {
573
+ inner. clean_waiters ( & self . key ) ;
574
+ }
572
575
}
573
576
}
574
577
}
@@ -782,7 +785,7 @@ mod tests {
782
785
}
783
786
784
787
#[ test]
785
- fn test_pool_checkout_drop_cleans_up_parked ( ) {
788
+ fn test_pool_checkout_drop_cleans_up_waiters ( ) {
786
789
future:: lazy ( || {
787
790
let pool = Pool :: < Uniq < i32 > > :: new ( true , Some ( Duration :: from_secs ( 10 ) ) ) ;
788
791
let key = ( Arc :: new ( "localhost:12345" . to_string ( ) ) , Ver :: Http1 ) ;
@@ -792,16 +795,16 @@ mod tests {
792
795
793
796
// first poll needed to get into Pool's parked
794
797
checkout1. poll ( ) . unwrap ( ) ;
795
- assert_eq ! ( pool. inner. lock( ) . unwrap( ) . parked . get( & key) . unwrap( ) . len( ) , 1 ) ;
798
+ assert_eq ! ( pool. inner. lock( ) . unwrap( ) . waiters . get( & key) . unwrap( ) . len( ) , 1 ) ;
796
799
checkout2. poll ( ) . unwrap ( ) ;
797
- assert_eq ! ( pool. inner. lock( ) . unwrap( ) . parked . get( & key) . unwrap( ) . len( ) , 2 ) ;
800
+ assert_eq ! ( pool. inner. lock( ) . unwrap( ) . waiters . get( & key) . unwrap( ) . len( ) , 2 ) ;
798
801
799
802
// on drop, clean up Pool
800
803
drop ( checkout1) ;
801
- assert_eq ! ( pool. inner. lock( ) . unwrap( ) . parked . get( & key) . unwrap( ) . len( ) , 1 ) ;
804
+ assert_eq ! ( pool. inner. lock( ) . unwrap( ) . waiters . get( & key) . unwrap( ) . len( ) , 1 ) ;
802
805
803
806
drop ( checkout2) ;
804
- assert ! ( pool. inner. lock( ) . unwrap( ) . parked . get( & key) . is_none( ) ) ;
807
+ assert ! ( pool. inner. lock( ) . unwrap( ) . waiters . get( & key) . is_none( ) ) ;
805
808
806
809
:: futures:: future:: ok :: < ( ) , ( ) > ( ( ) )
807
810
} ) . wait ( ) . unwrap ( ) ;
0 commit comments