@@ -16,11 +16,11 @@ use crate::StdResult;
16
16
pub enum ResourcePoolError {
17
17
/// Internal Mutex is poisoned
18
18
#[ error( "Poisoned mutex caused error during acquire lock on resource pool" ) ]
19
- PoisonedLock ( ) ,
19
+ PoisonedLock ,
20
20
21
21
/// Acquire resource has timed out
22
22
#[ error( "Acquire resource has timed out" ) ]
23
- AcquireTimeout ( ) ,
23
+ AcquireTimeout ,
24
24
}
25
25
26
26
/// Resource pool implementation (FIFO)
@@ -54,16 +54,16 @@ impl<T: Send + Sync> ResourcePool<T> {
54
54
let mut resources = self
55
55
. resources
56
56
. lock ( )
57
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
57
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
58
58
. with_context ( || "Resource pool 'acquire_resource' failed locking Mutex" ) ?;
59
59
while resources. is_empty ( ) {
60
60
let ( resources_locked, wait_result) = self
61
61
. not_empty
62
62
. wait_timeout ( resources, timeout)
63
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
63
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
64
64
. with_context ( || "Resource pool 'acquire_resource' failed waiting for resource" ) ?;
65
65
if wait_result. timed_out ( ) {
66
- return Err ( ResourcePoolError :: AcquireTimeout ( ) )
66
+ return Err ( ResourcePoolError :: AcquireTimeout )
67
67
. with_context ( || "Resource pool 'acquire_resource' has timed out" ) ;
68
68
}
69
69
resources = resources_locked;
@@ -83,7 +83,7 @@ impl<T: Send + Sync> ResourcePool<T> {
83
83
let mut resources = self
84
84
. resources
85
85
. lock ( )
86
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
86
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
87
87
. with_context ( || "Resource pool 'give_back_resource' failed locking Mutex" ) ?;
88
88
if self . discriminant ( ) ? != discriminant {
89
89
// Stale resource
@@ -106,7 +106,7 @@ impl<T: Send + Sync> ResourcePool<T> {
106
106
Ok ( * self
107
107
. discriminant
108
108
. lock ( )
109
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
109
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
110
110
. with_context ( || "Resource pool 'discriminant' failed locking Mutex" ) ?)
111
111
}
112
112
@@ -115,7 +115,7 @@ impl<T: Send + Sync> ResourcePool<T> {
115
115
let mut discriminant_guard = self
116
116
. discriminant
117
117
. lock ( )
118
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
118
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
119
119
. with_context ( || "Resource pool 'set_discriminant' failed locking Mutex" ) ?;
120
120
* discriminant_guard = discriminant;
121
121
@@ -127,7 +127,7 @@ impl<T: Send + Sync> ResourcePool<T> {
127
127
Ok ( self
128
128
. resources
129
129
. lock ( )
130
- . map_err ( |_| ResourcePoolError :: PoisonedLock ( ) )
130
+ . map_err ( |_| ResourcePoolError :: PoisonedLock )
131
131
. with_context ( || "Resource pool 'count' failed locking Mutex" ) ?
132
132
. len ( ) )
133
133
}
@@ -167,14 +167,9 @@ impl<'a, T: Send + Sync> ResourcePoolItem<'a, T> {
167
167
self . discriminant
168
168
}
169
169
170
- /// Get a reference to the inner resource
171
- pub fn resource ( & self ) -> & T {
172
- self . resource . as_ref ( ) . unwrap ( )
173
- }
174
-
175
- /// Take the inner resource
176
- pub fn into_inner ( & mut self ) -> T {
177
- self . resource . take ( ) . unwrap ( )
170
+ /// Take the inner resource if exists
171
+ pub fn take ( & mut self ) -> Option < T > {
172
+ self . resource . take ( )
178
173
}
179
174
}
180
175
@@ -194,12 +189,10 @@ impl<T: Send + Sync> DerefMut for ResourcePoolItem<'_, T> {
194
189
195
190
impl < T : Send + Sync > Drop for ResourcePoolItem < ' _ , T > {
196
191
fn drop ( & mut self ) {
197
- if self . resource . is_some ( ) {
198
- let resource = self . into_inner ( ) ;
199
- let _ = self
200
- . resource_pool
201
- . give_back_resource ( resource, self . discriminant ) ;
202
- }
192
+ self . take ( ) . map ( |resource| {
193
+ self . resource_pool
194
+ . give_back_resource ( resource, self . discriminant )
195
+ } ) ;
203
196
}
204
197
}
205
198
@@ -222,7 +215,7 @@ mod tests {
222
215
}
223
216
let resources_result = resources_items
224
217
. iter_mut ( )
225
- . map ( |resource_item| resource_item. resource ( ) . to_owned ( ) )
218
+ . map ( |resource_item| resource_item. take ( ) . unwrap ( ) )
226
219
. collect :: < Vec < _ > > ( ) ;
227
220
228
221
assert_eq ! ( resources_expected, resources_result) ;
@@ -265,7 +258,7 @@ mod tests {
265
258
266
259
let mut resource_item = pool. acquire_resource ( Duration :: from_millis ( 10 ) ) . unwrap ( ) ;
267
260
assert_eq ! ( pool. count( ) . unwrap( ) , pool_size - 1 ) ;
268
- pool. give_back_resource ( resource_item. into_inner ( ) , pool. discriminant ( ) . unwrap ( ) )
261
+ pool. give_back_resource ( resource_item. take ( ) . unwrap ( ) , pool. discriminant ( ) . unwrap ( ) )
269
262
. unwrap ( ) ;
270
263
271
264
assert_eq ! ( pool. count( ) . unwrap( ) , pool_size) ;
@@ -312,7 +305,7 @@ mod tests {
312
305
let discriminant_stale = pool. discriminant ( ) . unwrap ( ) ;
313
306
pool. set_discriminant ( pool. discriminant ( ) . unwrap ( ) + 1 )
314
307
. unwrap ( ) ;
315
- pool. give_back_resource ( resource_item. into_inner ( ) , discriminant_stale)
308
+ pool. give_back_resource ( resource_item. take ( ) . unwrap ( ) , discriminant_stale)
316
309
. unwrap ( ) ;
317
310
318
311
assert_eq ! ( pool. count( ) . unwrap( ) , pool_size - 1 ) ;
0 commit comments