@@ -76,6 +76,8 @@ impl<T: Reset + Send + Sync> ResourcePool<T> {
76
76
/// A resource is given back to the pool only if the discriminant matches
77
77
/// and if the pool is not already full
78
78
pub fn give_back_resource ( & self , resource : T , discriminant : u64 ) -> StdResult < ( ) > {
79
+ let mut resource = resource;
80
+ resource. reset ( ) ?;
79
81
if self . count ( ) ? == self . size {
80
82
// Pool is full
81
83
return Ok ( ( ) ) ;
@@ -103,12 +105,9 @@ impl<T: Reset + Send + Sync> ResourcePool<T> {
103
105
resource_pool_item : ResourcePoolItem < ' _ , T > ,
104
106
) -> StdResult < ( ) > {
105
107
let mut resource_pool_item = resource_pool_item;
106
- resource_pool_item. take ( ) . map ( |resource_item| {
107
- let mut resource_item = resource_item;
108
- resource_item. reset ( ) ?;
109
-
110
- self . give_back_resource ( resource_item, self . discriminant ( ) ?)
111
- } ) ;
108
+ resource_pool_item
109
+ . take ( )
110
+ . map ( |resource_item| self . give_back_resource ( resource_item, self . discriminant ( ) ?) ) ;
112
111
113
112
Ok ( ( ) )
114
113
}
@@ -228,6 +227,20 @@ mod tests {
228
227
229
228
use super :: * ;
230
229
230
+ /// Resource for testing reset
231
+ #[ derive( Default ) ]
232
+ struct TestResetResource {
233
+ reset : bool ,
234
+ }
235
+
236
+ impl Reset for TestResetResource {
237
+ fn reset ( & mut self ) -> StdResult < ( ) > {
238
+ self . reset = true ;
239
+
240
+ Ok ( ( ) )
241
+ }
242
+ }
243
+
231
244
#[ test]
232
245
fn test_resource_pool_acquire_returns_resource_when_available ( ) {
233
246
let pool_size = 10 ;
@@ -369,4 +382,30 @@ mod tests {
369
382
370
383
assert_eq ! ( pool. count( ) . unwrap( ) , pool_size - 1 ) ;
371
384
}
385
+
386
+ #[ tokio:: test]
387
+ async fn test_resource_pool_is_reset_when_given_back ( ) {
388
+ let pool = ResourcePool :: < TestResetResource > :: new ( 1 , vec ! [ TestResetResource :: default ( ) ] ) ;
389
+
390
+ let mut resource_item = pool. acquire_resource ( Duration :: from_millis ( 10 ) ) . unwrap ( ) ;
391
+ let resource = resource_item. take ( ) . unwrap ( ) ;
392
+ pool. give_back_resource ( resource, pool. discriminant ( ) . unwrap ( ) )
393
+ . unwrap ( ) ;
394
+
395
+ // Acquire the resource again and make sure it has been reseted
396
+ let resource_item = pool. acquire_resource ( Duration :: from_millis ( 10 ) ) . unwrap ( ) ;
397
+ assert ! ( resource_item. reset) ;
398
+ }
399
+
400
+ #[ tokio:: test]
401
+ async fn test_resource_pool_item_is_reset_when_given_back ( ) {
402
+ let pool = ResourcePool :: < TestResetResource > :: new ( 1 , vec ! [ TestResetResource :: default ( ) ] ) ;
403
+
404
+ let resource_item = pool. acquire_resource ( Duration :: from_millis ( 10 ) ) . unwrap ( ) ;
405
+ pool. give_back_resource_pool_item ( resource_item) . unwrap ( ) ;
406
+
407
+ // Acquire the resource again and make sure it has been reseted
408
+ let resource_item = pool. acquire_resource ( Duration :: from_millis ( 10 ) ) . unwrap ( ) ;
409
+ assert ! ( resource_item. reset) ;
410
+ }
372
411
}
0 commit comments